#include <htmlhelp.h>\r
#include "helpid.h"\r
\r
+// ソフトウェア自動更新\r
+#include "updater.h"\r
+\r
// UTF-8対応\r
#undef __MBSWRAPPER_H__\r
#include "mbswrapper.h"\r
// タスクバー進捗表示\r
static ITaskbarList3* pTaskbarList3;\r
// 高DPI対応\r
-int ToolWinHeight;\r
+static int ToolWinHeight;\r
+// ソフトウェア自動更新\r
+static int ApplyUpdatesOnExit = NO;\r
\r
\r
/*===== グローバルなワーク =====*/\r
int RemoveOldLog = NO;\r
// バージョン確認\r
int ReadOnlySettings = NO;\r
+// ソフトウェア自動更新\r
+int AutoCheckForUpdates = YES;\r
+int AutoApplyUpdates = NO;\r
+int AutoCheckForUptatesInterval = 7;\r
+time_t LastAutoCheckForUpdates = 0;\r
+// ファイル一覧バグ修正\r
+int AbortOnListError = YES;\r
+// ミラーリング設定追加\r
+int MirrorNoTransferContents = NO; \r
\r
\r
\r
MSG Msg;\r
int Ret;\r
BOOL Sts;\r
-\r
// プロセス保護\r
+ char* pCommand;\r
+ DWORD ProtectLevel;\r
+ char Option[FMAX_PATH+1];\r
+ // ソフトウェア自動更新\r
+ int ImmediateExit;\r
+ char PrivateKeyFile[FMAX_PATH+1];\r
+ char Password[FMAX_PATH+1];\r
+ char ServerPath[FMAX_PATH+1];\r
+ char HashFile[FMAX_PATH+1];\r
+ char ListFile[FMAX_PATH+1];\r
+ char Description[FMAX_PATH+1];\r
+ char UpdateDir[FMAX_PATH+1];\r
+ char Path[FMAX_PATH+1];\r
+ char Command[FMAX_PATH+1];\r
+ char* p;\r
+\r
#ifdef ENABLE_PROCESS_PROTECTION\r
+ ProtectLevel = PROCESS_PROTECTION_NONE;\r
+ pCommand = lpszCmdLine;\r
+ while(pCommand = GetToken(pCommand, Option))\r
{\r
- DWORD ProtectLevel;\r
- char* pCommand;\r
- char Option[FMAX_PATH+1];\r
- ProtectLevel = PROCESS_PROTECTION_NONE;\r
- pCommand = lpszCmdLine;\r
- while(pCommand = GetToken(pCommand, Option))\r
+ if(Option[0] == '-')\r
{\r
- if(strcmp(Option, "--protect") == 0)\r
+ if(strcmp(&Option[1], "-protect") == 0)\r
{\r
ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
break;\r
}\r
- else if(strcmp(Option, "--protect-high") == 0)\r
+ else if(strcmp(&Option[1], "-protect-high") == 0)\r
{\r
ProtectLevel = PROCESS_PROTECTION_HIGH;\r
break;\r
}\r
- else if(strcmp(Option, "--protect-medium") == 0)\r
+ else if(strcmp(&Option[1], "-protect-medium") == 0)\r
{\r
ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
break;\r
}\r
- else if(strcmp(Option, "--protect-low") == 0)\r
+ else if(strcmp(&Option[1], "-protect-low") == 0)\r
{\r
ProtectLevel = PROCESS_PROTECTION_LOW;\r
break;\r
}\r
}\r
- if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+ }\r
+ if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+ {\r
+ SetProcessProtectionLevel(ProtectLevel);\r
+ if(!InitializeLoadLibraryHook())\r
{\r
- SetProcessProtectionLevel(ProtectLevel);\r
- if(!InitializeLoadLibraryHook())\r
- {\r
- MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
- return 0;\r
- }\r
+ MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
+ return 0;\r
+ }\r
#ifndef _DEBUG\r
- if(IsDebuggerPresent())\r
- {\r
- MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
- return 0;\r
- }\r
+ if(IsDebuggerPresent())\r
+ {\r
+ MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
+ return 0;\r
+ }\r
#endif\r
- if(!UnloadUntrustedModule())\r
- {\r
- MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
- return 0;\r
- }\r
+ if(!UnloadUntrustedModule())\r
+ {\r
+ MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
+ return 0;\r
+ }\r
#ifndef _DEBUG\r
- if(RestartProtectedProcess(" --restart"))\r
- return 0;\r
+ if(RestartProtectedProcess(" --restart"))\r
+ return 0;\r
#endif\r
- if(!EnableLoadLibraryHook(TRUE))\r
- {\r
- MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
- return 0;\r
- }\r
+ if(!EnableLoadLibraryHook(TRUE))\r
+ {\r
+ MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+ return 0;\r
}\r
- else\r
- InitializeLoadLibraryHook();\r
}\r
+ else\r
+ InitializeLoadLibraryHook();\r
#endif\r
\r
// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
LoadOpenSSL();\r
#endif\r
\r
- // SFTP対応\r
- LoadPuTTY();\r
+ // ソフトウェア自動更新\r
+ ImmediateExit = NO;\r
+ pCommand = lpszCmdLine;\r
+ while(pCommand = GetToken(pCommand, Option))\r
+ {\r
+ if(Option[0] == '-')\r
+ {\r
+ if(strcmp(&Option[1], "-build-software-update") == 0)\r
+ {\r
+ if(pCommand = GetToken(pCommand, PrivateKeyFile))\r
+ {\r
+ if(pCommand = GetToken(pCommand, Password))\r
+ {\r
+ if(pCommand = GetToken(pCommand, ServerPath))\r
+ {\r
+ if(pCommand = GetToken(pCommand, HashFile))\r
+ {\r
+ if(pCommand = GetToken(pCommand, ListFile))\r
+ {\r
+ if(pCommand = GetToken(pCommand, Description))\r
+ BuildUpdates(PrivateKeyFile, Password, ServerPath, HashFile, ListFile, RELEASE_VERSION_NUM, VER_STR, Description);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ ImmediateExit = YES;\r
+ break;\r
+ }\r
+ else if(strcmp(&Option[1], "-software-update") == 0)\r
+ {\r
+ if(pCommand = GetToken(pCommand, UpdateDir))\r
+ {\r
+ if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+ {\r
+ Sleep(1000);\r
+ if(ApplyUpdates(UpdateDir, "updatebackup"))\r
+ MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+ else\r
+ MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
+ }\r
+ }\r
+ ImmediateExit = YES;\r
+ break;\r
+ }\r
+ else if(strcmp(&Option[1], "-software-cleanup") == 0)\r
+ {\r
+ if(pCommand = GetToken(pCommand, UpdateDir))\r
+ CleanupUpdates(UpdateDir);\r
+ break;\r
+ }\r
+ }\r
+ }\r
\r
Ret = FALSE;\r
hWndFtp = NULL;\r
hInstFtp = hInstance;\r
- if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+ // ソフトウェア自動更新\r
+// if(InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
+ if(ImmediateExit == NO && InitApp(lpszCmdLine, cmdShow) == FFFTP_SUCCESS)\r
{\r
for(;;)\r
{\r
#ifdef USE_OPENSSL\r
FreeOpenSSL();\r
#endif\r
- // SFTP対応\r
- FreePuTTY();\r
// タスクバー進捗表示\r
FreeTaskbarList3();\r
// UPnP対応\r
FreeUPnP();\r
CoUninitialize();\r
OleUninitialize();\r
+ // ソフトウェア自動更新\r
+ if(ApplyUpdatesOnExit == YES)\r
+ {\r
+ Sts = FALSE;\r
+ if(GetModuleFileName(NULL, UpdateDir, FMAX_PATH) > 0)\r
+ {\r
+ if(p = strrchr(UpdateDir, '\\'))\r
+ {\r
+ *p = '\0';\r
+ strcpy(Path, TmpPath);\r
+ SetYenTail(Path);\r
+ strcat(Path, "update");\r
+ sprintf(Command, "-%s \"%s\"", "-software-update", UpdateDir);\r
+ if(StartUpdateProcess(Path, Command))\r
+ Sts = TRUE;\r
+ }\r
+ }\r
+ if(!Sts)\r
+ MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK | MB_ICONERROR);\r
+ }\r
return(Ret);\r
}\r
\r
{\r
if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
{\r
- switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+ switch(MessageBox(GetMainHwnd(), MSGJPN350, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
{\r
case IDCANCEL:\r
ReadOnlySettings = YES;\r
\r
if(masterpass != 0)\r
{\r
+ // ホスト共通設定機能\r
+ ResetDefaultHost();\r
+\r
LoadRegistry();\r
\r
// ポータブル版判定\r
MakeButtonsFocus();\r
DispTransferFiles();\r
\r
+ // ソフトウェア自動更新\r
+ if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval == 0)\r
+ UpdateSoftware(YES, YES, AutoApplyUpdates);\r
+\r
StartupProc(lpszCmdLine);\r
sts = FFFTP_SUCCESS;\r
\r
switch(AskCryptMode())\r
{\r
case CRYPT_NONE:\r
- sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
+ sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN351);\r
break;\r
case CRYPT_FTPES:\r
- sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
+ sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
break;\r
case CRYPT_FTPIS:\r
- sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
+ sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
break;\r
case CRYPT_SFTP:\r
- sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
+ sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
break;\r
}\r
}\r
{\r
// ローカル側自動更新\r
// タスクバー進捗表示\r
+ // ソフトウェア自動更新\r
case WM_CREATE :\r
SetTimer(hWnd, 1, 1000, NULL);\r
SetTimer(hWnd, 2, 100, NULL);\r
+ SetTimer(hWnd, 3, 60000, NULL);\r
break;\r
\r
// ローカル側自動更新\r
// 自動切断対策\r
// タスクバー進捗表示\r
+ // ソフトウェア自動更新\r
case WM_TIMER :\r
switch(wParam)\r
{\r
if(IsTaskbarList3Loaded() == YES)\r
UpdateTaskbarProgress();\r
break;\r
+ case 3:\r
+ if(AskUserOpeDisabled() == NO && AskTransferNow() == NO)\r
+ {\r
+ if(AutoCheckForUpdates == YES && AutoCheckForUptatesInterval > 0 && time(NULL) - LastAutoCheckForUpdates >= AutoCheckForUptatesInterval * 86400)\r
+ UpdateSoftware(YES, YES, AutoApplyUpdates);\r
+ }\r
+ break;\r
}\r
break;\r
\r
// 同時接続対応\r
// 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
if(CancelFlg == YES)\r
- RemoveReceivedData(AskCmdCtrlSkt());\r
+ AbortRecoveryProc();\r
switch(LOWORD(wParam))\r
{\r
case MENU_CONNECT :\r
SetMasterPassword(NULL);\r
while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
{\r
- if(EnterMasterPasswordAndSet(masterpasswd_dlg, NULL) == 0)\r
+ if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
break;\r
}\r
if(GetMasterPasswordStatus() == PASSWORD_OK && EnterMasterPasswordAndSet(newmasterpasswd_dlg, hWnd) != 0)\r
MoveRemoteFileProc(-1);\r
break;\r
\r
+ // FileZilla XML形式エクスポート対応\r
+ case MENU_EXPORT_FILEZILLA_XML :\r
+ // 平文で出力するためマスターパスワードを再確認\r
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+ {\r
+ char Password[MAX_PASSWORD_LEN + 1];\r
+ GetMasterPassword(Password);\r
+ SetMasterPassword(NULL);\r
+ while(ValidateMasterPassword() == YES && GetMasterPasswordStatus() == PASSWORD_UNMATCH)\r
+ {\r
+ if(EnterMasterPasswordAndSet(masterpasswd_dlg, hWnd) == 0)\r
+ break;\r
+ }\r
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+ SaveSettingsToFileZillaXml();\r
+ else\r
+ {\r
+ SetMasterPassword(Password);\r
+ ValidateMasterPassword();\r
+ }\r
+ }\r
+ break;\r
+\r
+ // ソフトウェア自動更新\r
+ case MENU_UPDATES_CHECK :\r
+ UpdateSoftware(NO, NO, NO);\r
+ break;\r
+\r
default :\r
if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
(LOWORD(wParam) < MENU_BMARK_TOP+100))\r
FindCloseChangeNotification(ChangeNotification);\r
// タスクバー進捗表示\r
KillTimer(hWnd, 2);\r
+ // ソフトウェア自動更新\r
+ KillTimer(hWnd, 3);\r
// WSACleanup();\r
// DestroyWindow(hWndFtp);\r
PostQuitMessage(0);\r
{\r
int Ret;\r
char Tmp[FMAX_PATH+1];\r
+ // ソフトウェア自動更新\r
+ int i;\r
\r
*AutoConnect = -1;\r
*CmdOption = 0;\r
}\r
// プロセス保護\r
#ifdef ENABLE_PROCESS_PROTECTION\r
- else if(strcmp(Tmp, "--restart") == 0)\r
+ else if(strcmp(&Tmp[1], "-restart") == 0)\r
{\r
}\r
- else if(strcmp(Tmp, "--protect") == 0)\r
+ else if(strcmp(&Tmp[1], "-protect") == 0)\r
{\r
}\r
- else if(strcmp(Tmp, "--protect-high") == 0)\r
+ else if(strcmp(&Tmp[1], "-protect-high") == 0)\r
{\r
}\r
- else if(strcmp(Tmp, "--protect-medium") == 0)\r
+ else if(strcmp(&Tmp[1], "-protect-medium") == 0)\r
{\r
}\r
- else if(strcmp(Tmp, "--protect-low") == 0)\r
+ else if(strcmp(&Tmp[1], "-protect-low") == 0)\r
{\r
}\r
#endif\r
*CmdOption |= OPT_SJIS_NAME;\r
else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
*CmdOption |= OPT_UTF8N_NAME;\r
+ // ソフトウェア自動更新\r
+ else if(strcmp(&Tmp[1], "-build-software-update") == 0)\r
+ {\r
+ for(i = 0; i < 6; i++)\r
+ {\r
+ if((Str = GetToken(Str, Tmp)) == NULL)\r
+ {\r
+ Ret = -1;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else if(strcmp(&Tmp[1], "-software-update") == 0)\r
+ {\r
+ if((Str = GetToken(Str, Tmp)) == NULL)\r
+ {\r
+ Ret = -1;\r
+ }\r
+ }\r
+ else if(strcmp(&Tmp[1], "-software-cleanup") == 0)\r
+ {\r
+ if((Str = GetToken(Str, Tmp)) == NULL)\r
+ {\r
+ Ret = -1;\r
+ }\r
+ }\r
else\r
{\r
SetTaskMsg(MSGJPN180, Tmp);\r
InQuote = 0;\r
while(*Str != NUL)\r
{\r
- if(*Str == 0x22)\r
+ if(*Str == '\"')\r
InQuote = !InQuote;\r
else\r
{\r
\r
CancelFlg = YES;\r
\r
+ // バグ対策\r
+ DisableUserOpe();\r
+\r
CloseTransferThread();\r
\r
if(SaveExit == YES)\r
for(i = 0; i < 5; i++)\r
Hash[i] = _byteswap_ulong(Hash[i]);\r
// 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
- if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x57\x50\x4F\xF9\x95\xFC\x41\x2F\x10\x2B\x36\xFA\x92\xAB\x08\xBB\xC3\x7F\x9A\xDB", 20) == 0\r
+ if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xE8\xE7\x94\x39\x27\x66\xCC\xA1\x52\x88\x58\xA2\x29\xAC\x04\x6B\x0F\x5D\x58\x01", 20) == 0\r
|| DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
{\r
memcpy(&SSLRootCAFileHash, &Hash, 20);\r
return Sts;\r
}\r
\r
-void RestartAndTerminate()\r
+void Terminate()\r
{\r
- Restart();\r
exit(1);\r
}\r
\r
return(ToolWinHeight);\r
}\r
\r
+// ソフトウェア自動更新\r
+typedef struct\r
+{\r
+ int NoError;\r
+ int NoConfirm;\r
+} UPDATESOFTWAREDATA;\r
+\r
+DWORD WINAPI UpdateSoftwareThreadProc(LPVOID lpParameter)\r
+{\r
+ UPDATESOFTWAREDATA* pData;\r
+ pData = (UPDATESOFTWAREDATA*)lpParameter;\r
+ UpdateSoftware(NO, pData->NoError, pData->NoConfirm);\r
+ free(pData);\r
+ return 0;\r
+}\r
+\r
+void UpdateSoftware(int Async, int NoError, int NoConfirm)\r
+{\r
+ UPDATESOFTWAREDATA* pData;\r
+ DWORD Version;\r
+ char VersionString[32];\r
+ char Description[1024];\r
+ char Tmp[2048];\r
+ if(Async == YES)\r
+ {\r
+ if(pData = malloc(sizeof(UPDATESOFTWAREDATA)))\r
+ {\r
+ pData->NoError = NoError;\r
+ pData->NoConfirm = NoConfirm;\r
+ CloseHandle(CreateThread(NULL, 0, UpdateSoftwareThreadProc, pData, 0, NULL));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // 念のためマスターパスワードの一致を確認\r
+ if(GetMasterPasswordStatus() == PASSWORD_OK)\r
+ {\r
+ Version = RELEASE_VERSION_NUM;\r
+ LastAutoCheckForUpdates = time(NULL);\r
+ if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description))\r
+ {\r
+ if(Version > RELEASE_VERSION_NUM)\r
+ {\r
+ sprintf(Tmp, MSGJPN361, VER_STR, VersionString, Description);\r
+ if(NoConfirm == YES || MessageBox(GetMainHwnd(), Tmp, "FFFTP", MB_YESNO) == IDYES)\r
+ {\r
+ strcpy(Tmp, TmpPath);\r
+ SetYenTail(Tmp);\r
+ strcat(Tmp, "update");\r
+ _mkdir(Tmp);\r
+ if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description))\r
+ {\r
+ MessageBox(GetMainHwnd(), MSGJPN364, "FFFTP", MB_OK);\r
+ ApplyUpdatesOnExit = YES;\r
+ }\r
+ else if(NoError == NO)\r
+ MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
+ }\r
+ }\r
+ else if(NoError == NO)\r
+ MessageBox(GetMainHwnd(), MSGJPN363, "FFFTP", MB_OK);\r
+ }\r
+ else if(NoError == NO)\r
+ MessageBox(GetMainHwnd(), MSGJPN362, "FFFTP", MB_OK | MB_ICONERROR);\r
+ }\r
+ }\r
+}\r
+\r