OSDN Git Service

Add routines for creating files for software update.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 15 Jun 2014 10:04:33 +0000 (19:04 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 15 Jun 2014 10:04:33 +0000 (19:04 +0900)
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
main.c
mesg-eng.h
mesg-jpn.h
socketwrapper.c
socketwrapper.h
updater.c
updater.h

index 2d216c0..658c9b2 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 8c0ef6a..cb5cf91 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
diff --git a/main.c b/main.c
index d8e95d3..1a0652e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -305,98 +305,85 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
     MSG Msg;\r
        int Ret;\r
        BOOL Sts;\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
-       // プロセス保護\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(Option[0] == '-')\r
+                       if(strcmp(&Option[1], "-protect") == 0)\r
                        {\r
-                               if(strcmp(&Option[1], "-protect") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-high") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_HIGH;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-medium") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
-                                       break;\r
-                               }\r
-                               else if(strcmp(&Option[1], "-protect-low") == 0)\r
-                               {\r
-                                       ProtectLevel = PROCESS_PROTECTION_LOW;\r
-                                       break;\r
-                               }\r
+                               ProtectLevel = PROCESS_PROTECTION_DEFAULT;\r
+                               break;\r
                        }\r
-               }\r
-               if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
-               {\r
-                       SetProcessProtectionLevel(ProtectLevel);\r
-                       if(!InitializeLoadLibraryHook())\r
+                       else if(strcmp(&Option[1], "-protect-high") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_HIGH;\r
+                               break;\r
                        }\r
-#ifndef _DEBUG\r
-                       if(IsDebuggerPresent())\r
+                       else if(strcmp(&Option[1], "-protect-medium") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_MEDIUM;\r
+                               break;\r
                        }\r
-#endif\r
-                       if(!UnloadUntrustedModule())\r
+                       else if(strcmp(&Option[1], "-protect-low") == 0)\r
                        {\r
-                               MessageBox(NULL, MSGJPN323, "FFFTP", MB_OK | MB_ICONERROR);\r
-                               return 0;\r
+                               ProtectLevel = PROCESS_PROTECTION_LOW;\r
+                               break;\r
                        }\r
+               }\r
+       }\r
+       if(ProtectLevel != PROCESS_PROTECTION_NONE)\r
+       {\r
+               SetProcessProtectionLevel(ProtectLevel);\r
+               if(!InitializeLoadLibraryHook())\r
+               {\r
+                       MessageBox(NULL, MSGJPN321, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #ifndef _DEBUG\r
-                       if(RestartProtectedProcess(" --restart"))\r
-                               return 0;\r
+               if(IsDebuggerPresent())\r
+               {\r
+                       MessageBox(NULL, MSGJPN322, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
+               }\r
 #endif\r
-                       if(!EnableLoadLibraryHook(TRUE))\r
-                       {\r
-                               MessageBox(NULL, MSGJPN324, "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
-               else\r
-                       InitializeLoadLibraryHook();\r
-       }\r
+#ifndef _DEBUG\r
+               if(RestartProtectedProcess(" --restart"))\r
+                       return 0;\r
 #endif\r
-\r
-       // ソフトウェア自動更新\r
-       if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-update", "-software-update"))\r
-       {\r
-               if(!RestartUpdateProcessAsAdministrator(lpszCmdLine, " --restart"))\r
+               if(!EnableLoadLibraryHook(TRUE))\r
                {\r
-                       Sleep(1000);\r
-                       if(ApplyUpdates(UpdateDir, "updatebackup"))\r
-                               MessageBox(NULL, MSGJPN359, "FFFTP", MB_OK);\r
-                       else\r
-                               MessageBox(NULL, MSGJPN360, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       MessageBox(NULL, MSGJPN324, "FFFTP", MB_OK | MB_ICONERROR);\r
+                       return 0;\r
                }\r
-               return 0;\r
-       }\r
-       else if(GetTokenAfterOption(lpszCmdLine, UpdateDir, "-software-cleanup", "-software-cleanup"))\r
-       {\r
-               CleanupUpdates(UpdateDir);\r
        }\r
+       else\r
+               InitializeLoadLibraryHook();\r
+#endif\r
 \r
        // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
 #ifdef DISABLE_MULTI_CPUS\r
@@ -429,10 +416,66 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        // SFTP対応\r
        LoadPuTTY();\r
 \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, MSGJPN359, "FFFTP", MB_OK);\r
+                                               else\r
+                                                       MessageBox(NULL, MSGJPN360, "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
@@ -2166,6 +2209,8 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
 {\r
        int Ret;\r
        char Tmp[FMAX_PATH+1];\r
+       // ソフトウェア自動更新\r
+       int i;\r
 \r
        *AutoConnect = -1;\r
        *CmdOption = 0;\r
@@ -2292,6 +2337,17 @@ static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc
                        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
@@ -3650,7 +3706,8 @@ void UpdateSoftware(int Async, int NoError, int NoConfirm)
        UPDATESOFTWAREDATA* pData;\r
        DWORD Version;\r
        char VersionString[32];\r
-       char Tmp[FMAX_PATH+1];\r
+       char Description[1024];\r
+       char Tmp[2048];\r
        if(Async == YES)\r
        {\r
                if(pData = malloc(sizeof(UPDATESOFTWAREDATA)))\r
@@ -3667,18 +3724,18 @@ void UpdateSoftware(int Async, int NoError, int NoConfirm)
                {\r
                        Version = RELEASE_VERSION_NUM;\r
                        LastAutoCheckForUpdates = time(NULL);\r
-                       if(CheckForUpdates(FALSE, NULL, &Version, VersionString))\r
+                       if(CheckForUpdates(FALSE, NULL, &Version, VersionString, Description))\r
                        {\r
                                if(Version > RELEASE_VERSION_NUM)\r
                                {\r
-                                       sprintf(Tmp, MSGJPN362, VER_STR, VersionString);\r
+                                       sprintf(Tmp, MSGJPN362, 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))\r
+                                               if(CheckForUpdates(TRUE, Tmp, &Version, VersionString, Description))\r
                                                {\r
                                                        MessageBox(GetMainHwnd(), MSGJPN365, "FFFTP", MB_OK);\r
                                                        ApplyUpdatesOnExit = YES;\r
index 4eef568..d93e2dc 100644 (file)
 #define MSGJPN359              _Tu8("Software update has been completed.", "Software update has been completed.")\r
 #define MSGJPN360              _Tu8("Failed to update the software.\nPlease get the latest version from our web site and update it manually.", "Failed to update the software.\nPlease get the latest version from our web site and update it manually.")\r
 #define MSGJPN361              _Tu8("Updates", "Updates")\r
-#define MSGJPN362              _Tu8("There is a new version.\n\nCurrent version: %s\nNew version: %s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n", "There is a new version.\n\nCurrent version: %s\nNew version: %s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n")\r
+#define MSGJPN362              _Tu8("There is a new version.\n\nCurrent version: %s\nNew version: %s\n%s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n", "There is a new version.\n\nCurrent version: %s\nNew version: %s\n%s\n\nIt takes a few minutes to download the updates.\nDo you want to update now?\n")\r
 #define MSGJPN363              _Tu8("Failed to update the software.\nCannot connect to the server or the data is corrupted.", "Failed to update the software.\nCannot connect to the server or the data is corrupted.")\r
 #define MSGJPN364              _Tu8("Your version is already up-to-date.", "Your version is already up-to-date.")\r
 #define MSGJPN365              _Tu8("Preparing for the software update has been completed.\nIt will be applied on exit.", "Preparing for the software update has been completed.\nIt will be applied on exit.")\r
index 74fdad7..fd41d9b 100644 (file)
 #define MSGJPN359              _Tu8("ソフトウェアの更新が完了しました.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x8C\xE5\xAE\x8C\xE4\xBA\x86\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.")\r
 #define MSGJPN360              _Tu8("ソフトウェアの更新に失敗しました.\nWebサイトから最新版を入手して手動で更新してください.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\nWeb\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x88\xE3\x81\x8B\xE3\x82\x89\xE6\x9C\x80\xE6\x96\xB0\xE7\x89\x88\xE3\x82\x92\xE5\x85\xA5\xE6\x89\x8B\xE3\x81\x97\xE3\x81\xA6\xE6\x89\x8B\xE5\x8B\x95\xE3\x81\xA7\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
 #define MSGJPN361              _Tu8("更新", "\xE6\x9B\xB4\xE6\x96\xB0")\r
-#define MSGJPN362              _Tu8("新しいバージョンがあります.\n\n現在のバージョン: %s\n新しいバージョン: %s\n\n更新のダウンロードには数分間かかります.\n今すぐ更新しますか.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\n\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n\n\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAE\xE3\x83\x80\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAB\xE3\x81\xAF\xE6\x95\xB0\xE5\x88\x86\xE9\x96\x93\xE3\x81\x8B\xE3\x81\x8B\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE4\xBB\x8A\xE3\x81\x99\xE3\x81\x90\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99\xE3\x81\x8B.")\r
+#define MSGJPN362              _Tu8("新しいバージョンがあります.\n\n現在のバージョン: %s\n新しいバージョン: %s\n%s\n\n更新のダウンロードには数分間かかります.\n今すぐ更新しますか.", "\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\x8C\xE3\x81\x82\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\n\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n\xE6\x96\xB0\xE3\x81\x97\xE3\x81\x84\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3: %s\n%s\n\n\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAE\xE3\x83\x80\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x89\xE3\x81\xAB\xE3\x81\xAF\xE6\x95\xB0\xE5\x88\x86\xE9\x96\x93\xE3\x81\x8B\xE3\x81\x8B\xE3\x82\x8A\xE3\x81\xBE\xE3\x81\x99.\n\xE4\xBB\x8A\xE3\x81\x99\xE3\x81\x90\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99\xE3\x81\x8B.")\r
 #define MSGJPN363              _Tu8("ソフトウェアの更新に失敗しました.\nサーバーに接続できないかデータが破損しています.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE3\x82\xB5\xE3\x83\xBC\xE3\x83\x90\xE3\x83\xBC\xE3\x81\xAB\xE6\x8E\xA5\xE7\xB6\x9A\xE3\x81\xA7\xE3\x81\x8D\xE3\x81\xAA\xE3\x81\x84\xE3\x81\x8B\xE3\x83\x87\xE3\x83\xBC\xE3\x82\xBF\xE3\x81\x8C\xE7\xA0\xB4\xE6\x90\x8D\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99.")\r
 #define MSGJPN364              _Tu8("お使いのバージョンはすでに最新です.", "\xE3\x81\x8A\xE4\xBD\xBF\xE3\x81\x84\xE3\x81\xAE\xE3\x83\x90\xE3\x83\xBC\xE3\x82\xB8\xE3\x83\xA7\xE3\x83\xB3\xE3\x81\xAF\xE3\x81\x99\xE3\x81\xA7\xE3\x81\xAB\xE6\x9C\x80\xE6\x96\xB0\xE3\x81\xA7\xE3\x81\x99.")\r
 #define MSGJPN365              _Tu8("ソフトウェアの更新の準備が完了しました.\nFFFTPの終了時に更新が適用されます.", "\xE3\x82\xBD\xE3\x83\x95\xE3\x83\x88\xE3\x82\xA6\xE3\x82\xA7\xE3\x82\xA2\xE3\x81\xAE\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\xAE\xE6\xBA\x96\xE5\x82\x99\xE3\x81\x8C\xE5\xAE\x8C\xE4\xBA\x86\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\nFFFTP\xE3\x81\xAE\xE7\xB5\x82\xE4\xBA\x86\xE6\x99\x82\xE3\x81\xAB\xE6\x9B\xB4\xE6\x96\xB0\xE3\x81\x8C\xE9\x81\xA9\xE7\x94\xA8\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x99.")\r
index b862175..86100f5 100644 (file)
@@ -52,6 +52,7 @@ typedef int (__cdecl* _X509_print_ex)(BIO*, X509*, unsigned long, unsigned long)
 typedef X509_NAME* (__cdecl* _X509_get_subject_name)(X509*);\r
 typedef int (__cdecl* _X509_NAME_print_ex)(BIO*, X509_NAME*, int, unsigned long);\r
 typedef void (__cdecl* _X509_CRL_free)(X509_CRL*);\r
+typedef EVP_PKEY* (__cdecl* _PEM_read_bio_PrivateKey)(BIO*, EVP_PKEY**, pem_password_cb*, void*);\r
 typedef EVP_PKEY* (__cdecl* _PEM_read_bio_PUBKEY)(BIO*, EVP_PKEY**, pem_password_cb*, void*);\r
 typedef X509* (__cdecl* _PEM_read_bio_X509)(BIO*, X509**, pem_password_cb*, void*);\r
 typedef X509_CRL* (__cdecl* _PEM_read_bio_X509_CRL)(BIO*, X509_CRL**, pem_password_cb*, void*);\r
@@ -61,6 +62,7 @@ typedef void (__cdecl* _EVP_PKEY_free)(EVP_PKEY*);
 typedef RSA* (__cdecl* _EVP_PKEY_get1_RSA)(EVP_PKEY*);\r
 typedef void (__cdecl* _RSA_free)(RSA*);\r
 typedef int (__cdecl* _RSA_size)(const RSA*);\r
+typedef int (__cdecl* _RSA_private_encrypt)(int, const unsigned char*, unsigned char*, RSA*, int);\r
 typedef int (__cdecl* _RSA_public_decrypt)(int, const unsigned char*, unsigned char*, RSA*, int);\r
 typedef unsigned char* (__cdecl* _SHA1)(const unsigned char*, size_t, unsigned char*);\r
 typedef unsigned char* (__cdecl* _SHA224)(const unsigned char*, size_t, unsigned char*);\r
@@ -102,6 +104,7 @@ _X509_print_ex p_X509_print_ex;
 _X509_get_subject_name p_X509_get_subject_name;\r
 _X509_NAME_print_ex p_X509_NAME_print_ex;\r
 _X509_CRL_free p_X509_CRL_free;\r
+_PEM_read_bio_PrivateKey p_PEM_read_bio_PrivateKey;\r
 _PEM_read_bio_PUBKEY p_PEM_read_bio_PUBKEY;\r
 _PEM_read_bio_X509 p_PEM_read_bio_X509;\r
 _PEM_read_bio_X509_CRL p_PEM_read_bio_X509_CRL;\r
@@ -111,6 +114,7 @@ _EVP_PKEY_free p_EVP_PKEY_free;
 _EVP_PKEY_get1_RSA p_EVP_PKEY_get1_RSA;\r
 _RSA_free p_RSA_free;\r
 _RSA_size p_RSA_size;\r
+_RSA_private_encrypt p_RSA_private_encrypt;\r
 _RSA_public_decrypt p_RSA_public_decrypt;\r
 _SHA1 p_SHA1;\r
 _SHA224 p_SHA224;\r
@@ -207,6 +211,7 @@ BOOL LoadOpenSSL()
                || !(p_X509_get_subject_name = (_X509_get_subject_name)GetProcAddress(g_hOpenSSLCommon, "X509_get_subject_name"))\r
                || !(p_X509_NAME_print_ex = (_X509_NAME_print_ex)GetProcAddress(g_hOpenSSLCommon, "X509_NAME_print_ex"))\r
                || !(p_X509_CRL_free = (_X509_CRL_free)GetProcAddress(g_hOpenSSLCommon, "X509_CRL_free"))\r
+               || !(p_PEM_read_bio_PrivateKey = (_PEM_read_bio_PrivateKey)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_PrivateKey"))\r
                || !(p_PEM_read_bio_PUBKEY = (_PEM_read_bio_PUBKEY)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_PUBKEY"))\r
                || !(p_PEM_read_bio_X509 = (_PEM_read_bio_X509)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_X509"))\r
                || !(p_PEM_read_bio_X509_CRL = (_PEM_read_bio_X509_CRL)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_X509_CRL"))\r
@@ -216,6 +221,7 @@ BOOL LoadOpenSSL()
                || !(p_EVP_PKEY_get1_RSA = (_EVP_PKEY_get1_RSA)GetProcAddress(g_hOpenSSLCommon, "EVP_PKEY_get1_RSA"))\r
                || !(p_RSA_free = (_RSA_free)GetProcAddress(g_hOpenSSLCommon, "RSA_free"))\r
                || !(p_RSA_size = (_RSA_size)GetProcAddress(g_hOpenSSLCommon, "RSA_size"))\r
+               || !(p_RSA_private_encrypt = (_RSA_private_encrypt)GetProcAddress(g_hOpenSSLCommon, "RSA_private_encrypt"))\r
                || !(p_RSA_public_decrypt = (_RSA_public_decrypt)GetProcAddress(g_hOpenSSLCommon, "RSA_public_decrypt"))\r
                || !(p_SHA1 = (_SHA1)GetProcAddress(g_hOpenSSLCommon, "SHA1"))\r
                || !(p_SHA224 = (_SHA224)GetProcAddress(g_hOpenSSLCommon, "SHA224"))\r
@@ -536,9 +542,47 @@ BOOL IsHostNameMatched(LPCSTR HostName, LPCSTR CommonName)
        return bResult;\r
 }\r
 \r
+#pragma warning(push)\r
+#pragma warning(disable:4090)\r
+\r
+// RSA暗号化\r
+BOOL EncryptSignature(const char* PrivateKey, const char* Password, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength)\r
+{\r
+       BOOL bResult;\r
+       BIO* pBIO;\r
+       EVP_PKEY* pPKEY;\r
+       RSA* pRSA;\r
+       int i;\r
+       if(!g_bOpenSSLLoaded)\r
+               return FALSE;\r
+       bResult = FALSE;\r
+       if(pBIO = p_BIO_new_mem_buf((void*)PrivateKey, sizeof(char) * strlen(PrivateKey)))\r
+       {\r
+               if(pPKEY = p_PEM_read_bio_PrivateKey(pBIO, NULL, NULL, (void*)Password))\r
+               {\r
+                       if(pRSA = p_EVP_PKEY_get1_RSA(pPKEY))\r
+                       {\r
+                               if(p_RSA_size(pRSA) <= (int)OutLength)\r
+                               {\r
+                                       i = p_RSA_private_encrypt((int)InLength, (const unsigned char*)pIn, (unsigned char*)pOut, pRSA, RSA_PKCS1_PADDING);\r
+                                       if(i >= 0)\r
+                                       {\r
+                                               *pOutLength = (DWORD)i;\r
+                                               bResult = TRUE;\r
+                                       }\r
+                               }\r
+                               p_RSA_free(pRSA);\r
+                       }\r
+                       p_EVP_PKEY_free(pPKEY);\r
+               }\r
+               p_BIO_free(pBIO);\r
+       }\r
+       return bResult;\r
+}\r
+\r
 // RSA復号化\r
 // 主に自動更新ファイルのハッシュの改竄確認\r
-BOOL DecryptSignature(const char* PublicKey, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength)\r
+BOOL DecryptSignature(const char* PublicKey, const char* Password, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength)\r
 {\r
        BOOL bResult;\r
        BIO* pBIO;\r
@@ -550,7 +594,7 @@ BOOL DecryptSignature(const char* PublicKey, const void* pIn, DWORD InLength, vo
        bResult = FALSE;\r
        if(pBIO = p_BIO_new_mem_buf((void*)PublicKey, sizeof(char) * strlen(PublicKey)))\r
        {\r
-               if(pPKEY = p_PEM_read_bio_PUBKEY(pBIO, NULL, NULL, NULL))\r
+               if(pPKEY = p_PEM_read_bio_PUBKEY(pBIO, NULL, NULL, Password))\r
                {\r
                        if(pRSA = p_EVP_PKEY_get1_RSA(pPKEY))\r
                        {\r
@@ -572,6 +616,8 @@ BOOL DecryptSignature(const char* PublicKey, const void* pIn, DWORD InLength, vo
        return bResult;\r
 }\r
 \r
+#pragma warning(pop)\r
+\r
 // ハッシュ計算\r
 // 他にも同等の関数はあるが主にマルウェア対策のための冗長化\r
 BOOL GetHashSHA1(const void* pData, DWORD Size, void* pHash)\r
index 3a206f0..9fa125e 100644 (file)
@@ -20,7 +20,8 @@ void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback);
 void SetSSLConfirmCallback(LPSSLCONFIRMCALLBACK pCallback);\r
 BOOL SetSSLRootCertificate(const void* pData, DWORD Length);\r
 BOOL IsHostNameMatched(LPCSTR HostName, LPCSTR CommonName);\r
-BOOL DecryptSignature(const char* PublicKey, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength);\r
+BOOL EncryptSignature(const char* PrivateKey, const char* Password, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength);\r
+BOOL DecryptSignature(const char* PublicKey, const char* Password, const void* pIn, DWORD InLength, void* pOut, DWORD OutLength, DWORD* pOutLength);\r
 BOOL GetHashSHA1(const void* pData, DWORD Size, void* pHash);\r
 BOOL GetHashSHA224(const void* pData, DWORD Size, void* pHash);\r
 BOOL GetHashSHA256(const void* pData, DWORD Size, void* pHash);\r
index e044920..305d363 100644 (file)
--- a/updater.c
+++ b/updater.c
@@ -37,6 +37,7 @@ typedef struct
 {\r
        DWORD Version;\r
        CHAR VersionString[32];\r
+       CHAR Description[1024];\r
        DWORD FileCount;\r
        UPDATE_LIST_FILE File[1];\r
 } UPDATE_LIST;\r
@@ -102,7 +103,12 @@ BOOL SaveMemoryToFileWithTimestamp(LPCTSTR FileName, void* pData, DWORD Size, FI
        {\r
                if(WriteFile(hFile, pData, Size, &Size, NULL))\r
                {\r
-                       if(SetFileTime(hFile, NULL, NULL, pTimestamp))\r
+                       if(pTimestamp)\r
+                       {\r
+                               if(SetFileTime(hFile, NULL, NULL, pTimestamp))\r
+                                       bResult = TRUE;\r
+                       }\r
+                       else\r
                                bResult = TRUE;\r
                }\r
                CloseHandle(hFile);\r
@@ -110,6 +116,38 @@ BOOL SaveMemoryToFileWithTimestamp(LPCTSTR FileName, void* pData, DWORD Size, FI
        return bResult;\r
 }\r
 \r
+BOOL LoadMemoryFromFileWithTimestamp(LPCTSTR FileName, void* pData, DWORD Size, DWORD* pReadSize, FILETIME* pTimestamp)\r
+{\r
+       BOOL bResult;\r
+       HANDLE hFile;\r
+       LARGE_INTEGER li;\r
+       bResult = FALSE;\r
+       if((hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+       {\r
+               if(GetFileSizeEx(hFile, &li))\r
+               {\r
+                       if(li.QuadPart <= (LONGLONG)Size)\r
+                       {\r
+                               if(ReadFile(hFile, pData, Size, pReadSize, NULL))\r
+                               {\r
+                                       if(*pReadSize == li.LowPart)\r
+                                       {\r
+                                               if(pTimestamp)\r
+                                               {\r
+                                                       if(GetFileTime(hFile, NULL, NULL, pTimestamp))\r
+                                                               bResult = TRUE;\r
+                                               }\r
+                                               else\r
+                                                       bResult = TRUE;\r
+                                       }\r
+                               }\r
+                       }\r
+                       CloseHandle(hFile);\r
+               }\r
+       }\r
+       return bResult;\r
+}\r
+\r
 BOOL CopyAllFilesInDirectory(LPCTSTR From, LPCTSTR To)\r
 {\r
        BOOL bResult;\r
@@ -158,46 +196,189 @@ BOOL DeleteDirectoryAndContents(LPCTSTR Path)
        return bResult;\r
 }\r
 \r
+DWORD ListUpdateFile(UPDATE_LIST* pList, DWORD MaxCount, LPCTSTR ServerPath, LPCTSTR ReferenceDir, LPCTSTR Path)\r
+{\r
+       DWORD Result;\r
+       TCHAR Temp1[MAX_PATH];\r
+       TCHAR Temp2[MAX_PATH];\r
+       TCHAR Temp3[MAX_PATH];\r
+       HANDLE hFind;\r
+       WIN32_FIND_DATA Find;\r
+       void* pBuf;\r
+       DWORD Length;\r
+       FILETIME Time;\r
+       BYTE Hash[64];\r
+       Result = 0;\r
+       if(!Path)\r
+               Path = _T("");\r
+       if(_tcslen(ReferenceDir) + _tcslen(Path) + _tcslen(_T("\\*")) < MAX_PATH)\r
+       {\r
+               _tcscpy(Temp1, ReferenceDir);\r
+               _tcscat(Temp1, Path);\r
+               _tcscat(Temp1, _T("\\*"));\r
+               if((hFind = FindFirstFile(Temp1, &Find)) != INVALID_HANDLE_VALUE)\r
+               {\r
+                       do\r
+                       {\r
+                               if(_tcscmp(Find.cFileName, _T(".")) != 0 && _tcscmp(Find.cFileName, _T("..")) != 0)\r
+                               {\r
+                                       if(_tcslen(ServerPath) + _tcslen(_T("/")) + _tcslen(Find.cFileName) < 128 && _tcslen(Path) + _tcslen(_T("\\")) + _tcslen(Find.cFileName) < 128)\r
+                                       {\r
+                                               _tcscpy(Temp1, ServerPath);\r
+                                               _tcscat(Temp1, _T("/"));\r
+                                               _tcscat(Temp1, Find.cFileName);\r
+                                               _tcscpy(Temp2, Path);\r
+                                               _tcscat(Temp2, _T("\\"));\r
+                                               _tcscat(Temp2, Find.cFileName);\r
+                                               if(_tcslen(ReferenceDir) + _tcslen(Temp2) < MAX_PATH)\r
+                                               {\r
+                                                       _tcscpy(Temp3, ReferenceDir);\r
+                                                       _tcscat(Temp3, Temp2);\r
+                                                       if((Find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))\r
+                                                       {\r
+                                                               if(!(Find.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))\r
+                                                               {\r
+                                                                       if(pList)\r
+                                                                       {\r
+                                                                               memset(&pList->File[pList->FileCount], 0, sizeof(UPDATE_LIST_FILE));\r
+                                                                               pList->File[pList->FileCount].Flags = UPDATE_LIST_FILE_FLAG_DIRECTORY;\r
+                                                                               _tcscpy(pList->File[pList->FileCount].DstPath, Temp2);\r
+                                                                               pList->FileCount++;\r
+                                                                       }\r
+                                                                       Result++;\r
+                                                                       if(Result >= MaxCount)\r
+                                                                               break;\r
+                                                                       Result += ListUpdateFile(pList, MaxCount, Temp1, ReferenceDir, Temp2);\r
+                                                               }\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               if(pList)\r
+                                                               {\r
+                                                                       if(pBuf = malloc(16777216))\r
+                                                                       {\r
+                                                                               if(LoadMemoryFromFileWithTimestamp(Temp3, pBuf, 16777216, &Length, &Time))\r
+                                                                               {\r
+                                                                                       if(GetHashSHA512(pBuf, Length, &Hash))\r
+                                                                                       {\r
+                                                                                               memset(&pList->File[pList->FileCount], 0, sizeof(UPDATE_LIST_FILE));\r
+                                                                                               _tcscpy(pList->File[pList->FileCount].SrcPath, Temp1);\r
+                                                                                               memcpy(&pList->File[pList->FileCount].SrcHash, &Hash, 64);\r
+                                                                                               _tcscpy(pList->File[pList->FileCount].DstPath, Temp2);\r
+                                                                                               pList->File[pList->FileCount].Timestamp = Time;\r
+                                                                                               pList->FileCount++;\r
+                                                                                       }\r
+                                                                               }\r
+                                                                               free(pBuf);\r
+                                                                       }\r
+                                                               }\r
+                                                               Result++;\r
+                                                               if(Result >= MaxCount)\r
+                                                                       break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       while(FindNextFile(hFind, &Find));\r
+                       FindClose(hFind);\r
+               }\r
+       }\r
+       return Result;\r
+}\r
+\r
+// FFFTPの更新情報を作成\r
+BOOL BuildUpdates(LPCTSTR PrivateKeyFile, LPCTSTR Password, LPCTSTR ServerPath, LPCTSTR HashFile, LPCTSTR ListFile, DWORD Version, LPCTSTR VersionString, LPCTSTR Description)\r
+{\r
+       BOOL bResult;\r
+       char PrivateKey[4096];\r
+       DWORD Length;\r
+       TCHAR Name[MAX_PATH];\r
+       TCHAR* p;\r
+       UPDATE_LIST* pList;\r
+       UPDATE_HASH Hash;\r
+       BYTE Buf[1024];\r
+       bResult = FALSE;\r
+       memset(PrivateKey, 0, sizeof(PrivateKey));\r
+       if(LoadMemoryFromFileWithTimestamp(PrivateKeyFile, &PrivateKey, sizeof(PrivateKey) - sizeof(char), &Length, NULL))\r
+       {\r
+               if(GetModuleFileName(NULL, Name, MAX_PATH) > 0)\r
+               {\r
+                       if(p = _tcsrchr(Name, _T('\\')))\r
+                               *p = _T('\0');\r
+                       if(pList = (UPDATE_LIST*)malloc(1048576))\r
+                       {\r
+                               memset(pList, 0, 1048576);\r
+                               pList->Version = Version;\r
+                               _tcscpy(pList->VersionString, VersionString);\r
+                               _tcscpy(pList->Description, Description);\r
+                               ListUpdateFile(pList, (1048576 - sizeof(UPDATE_LIST)) / sizeof(UPDATE_LIST_FILE) + 1, ServerPath, Name, NULL);\r
+                               Length = (pList->FileCount - 1) * sizeof(UPDATE_LIST_FILE) + sizeof(UPDATE_LIST);\r
+                               if(SaveMemoryToFileWithTimestamp(ListFile, pList, Length, NULL))\r
+                               {\r
+                                       memcpy(&Hash.Signature, UPDATE_SIGNATURE, 64);\r
+                                       if(GetHashSHA512(pList, Length, &Hash.ListHash))\r
+                                       {\r
+                                               if(EncryptSignature(PrivateKey, Password, &Hash, sizeof(UPDATE_HASH), &Buf, sizeof(Buf), &Length))\r
+                                               {\r
+                                                       if(SaveMemoryToFileWithTimestamp(HashFile, &Buf, Length, NULL))\r
+                                                               bResult = TRUE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               free(pList);\r
+                       }\r
+               }\r
+       }\r
+       return bResult;\r
+}\r
+\r
 // FFFTPの更新情報を確認\r
-BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTSTR pVersionString)\r
+BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTSTR pVersionString, LPTSTR pDescription)\r
 {\r
        BOOL bResult;\r
        DWORD Length;\r
-       BYTE Buf1[65536];\r
+       BYTE Buf1[1024];\r
        BYTE Buf2[1024];\r
+       void* pBuf;\r
        UPDATE_HASH UpdateHash;\r
        BYTE Hash[64];\r
        UPDATE_LIST* pUpdateList;\r
        bResult = FALSE;\r
        if(ReadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_HASH_PATH))\r
        {\r
-               if(DecryptSignature(UPDATE_RSA_PUBLIC_KEY, &Buf1, Length, &Buf2, sizeof(Buf2), &Length))\r
+               if(DecryptSignature(UPDATE_RSA_PUBLIC_KEY, NULL, &Buf1, Length, &Buf2, sizeof(Buf2), &Length))\r
                {\r
                        if(Length == sizeof(UPDATE_HASH))\r
                        {\r
                                memcpy(&UpdateHash, &Buf2, sizeof(UPDATE_HASH));\r
                                if(memcmp(&UpdateHash.Signature, UPDATE_SIGNATURE, 64) == 0)\r
                                {\r
-                                       if(ReadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
+                                       if(pBuf = malloc(1048576))\r
                                        {\r
-                                               if(GetHashSHA512(&Buf1, Length, &Hash))\r
+                                               if(ReadFileViaHTTP(pBuf, 1048576, &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
                                                {\r
-                                                       if(memcmp(&Hash, &UpdateHash.ListHash, 64) == 0)\r
+                                                       if(GetHashSHA512(pBuf, Length, &Hash))\r
                                                        {\r
-                                                               if(Length >= sizeof(UPDATE_LIST))\r
+                                                               if(memcmp(&Hash, &UpdateHash.ListHash, 64) == 0)\r
                                                                {\r
-                                                                       bResult = TRUE;\r
-                                                                       pUpdateList = (UPDATE_LIST*)&Buf1;\r
-                                                                       if(pUpdateList->Version > *pVersion)\r
+                                                                       if(Length >= sizeof(UPDATE_LIST))\r
                                                                        {\r
-                                                                               *pVersion = pUpdateList->Version;\r
-                                                                               _tcscpy(pVersionString, pUpdateList->VersionString);\r
+                                                                               bResult = TRUE;\r
+                                                                               pUpdateList = (UPDATE_LIST*)pBuf;\r
+                                                                               if(pUpdateList->Version > *pVersion)\r
+                                                                               {\r
+                                                                                       *pVersion = pUpdateList->Version;\r
+                                                                                       _tcscpy(pVersionString, pUpdateList->VersionString);\r
+                                                                                       _tcscpy(pDescription, pUpdateList->Description);\r
+                                                                               }\r
+                                                                               if(bDownload)\r
+                                                                                       bResult = PrepareUpdates(pBuf, Length, DownloadDir);\r
                                                                        }\r
-                                                                       if(bDownload)\r
-                                                                               bResult = PrepareUpdates(&Buf1, Length, DownloadDir);\r
                                                                }\r
                                                        }\r
                                                }\r
+                                               free(pBuf);\r
                                        }\r
                                }\r
                        }\r
@@ -226,42 +407,42 @@ BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
                        bResult = TRUE;\r
                        DeleteDirectoryAndContents(DownloadDir);\r
                        CreateDirectory(DownloadDir, NULL);\r
-                       pBuf = malloc(16777216);\r
-                       for(i = 0; i < pUpdateList->FileCount; i++)\r
+                       if(pBuf = malloc(16777216))\r
                        {\r
-                               b = FALSE;\r
-                               if(pUpdateList->File[i].Flags & UPDATE_LIST_FILE_FLAG_DIRECTORY)\r
+                               for(i = 0; i < pUpdateList->FileCount; i++)\r
                                {\r
-                                       _tcscpy(Path, DownloadDir);\r
-                                       _tcscat(Path, _T("\\"));\r
-                                       _tcscat(Path, pUpdateList->File[i].DstPath);\r
-                                       if(CreateDirectory(Path, NULL))\r
-                                               b = TRUE;\r
-                               }\r
-                               if(strlen(pUpdateList->File[i].SrcPath) > 0)\r
-                               {\r
-                                       if(ReadFileViaHTTP(pBuf, 16777216, &Length, HTTP_USER_AGENT, UPDATE_SERVER, pUpdateList->File[i].SrcPath))\r
+                                       b = FALSE;\r
+                                       if(pUpdateList->File[i].Flags & UPDATE_LIST_FILE_FLAG_DIRECTORY)\r
                                        {\r
-                                               if(GetHashSHA512(pBuf, Length, &Hash))\r
+                                               _tcscpy(Path, DownloadDir);\r
+                                               _tcscat(Path, pUpdateList->File[i].DstPath);\r
+                                               if(CreateDirectory(Path, NULL))\r
+                                                       b = TRUE;\r
+                                       }\r
+                                       if(strlen(pUpdateList->File[i].SrcPath) > 0)\r
+                                       {\r
+                                               if(ReadFileViaHTTP(pBuf, 16777216, &Length, HTTP_USER_AGENT, UPDATE_SERVER, pUpdateList->File[i].SrcPath))\r
                                                {\r
-                                                       if(memcmp(&Hash, &pUpdateList->File[i].SrcHash, 64) == 0)\r
+                                                       if(GetHashSHA512(pBuf, Length, &Hash))\r
                                                        {\r
-                                                               _tcscpy(Path, DownloadDir);\r
-                                                               _tcscat(Path, _T("\\"));\r
-                                                               _tcscat(Path, pUpdateList->File[i].DstPath);\r
-                                                               if(SaveMemoryToFileWithTimestamp(Path, pBuf, Length, &pUpdateList->File[i].Timestamp))\r
-                                                                       b = TRUE;\r
+                                                               if(memcmp(&Hash, &pUpdateList->File[i].SrcHash, 64) == 0)\r
+                                                               {\r
+                                                                       _tcscpy(Path, DownloadDir);\r
+                                                                       _tcscat(Path, pUpdateList->File[i].DstPath);\r
+                                                                       if(SaveMemoryToFileWithTimestamp(Path, pBuf, Length, &pUpdateList->File[i].Timestamp))\r
+                                                                               b = TRUE;\r
+                                                               }\r
                                                        }\r
                                                }\r
                                        }\r
+                                       if(!b)\r
+                                       {\r
+                                               bResult = FALSE;\r
+                                               break;\r
+                                       }\r
                                }\r
-                               if(!b)\r
-                               {\r
-                                       bResult = FALSE;\r
-                                       break;\r
-                               }\r
+                               free(pBuf);\r
                        }\r
-                       free(pBuf);\r
                }\r
        }\r
        return bResult;\r
index 291bc1b..3f125b4 100644 (file)
--- a/updater.h
+++ b/updater.h
@@ -33,7 +33,8 @@
        "-----END PUBLIC KEY-----\n"\r
 #define UPDATE_SIGNATURE "\x4C\x2A\x8E\x57\xAB\x75\x0C\xB5\xDA\x5F\xFE\xB9\x57\x9A\x1B\xA2\x7A\x61\x32\xF8\xFA\x4B\x61\xE2\xBA\x20\x9C\x37\xD5\x0A\xDC\x94\x10\x4D\x02\x30\x9B\xCD\x01\x9B\xB8\x73\x1E\xDB\xFD\xD7\x45\xCA\xE0\x8E\xF9\xB0\x1F\xB4\x0D\xD8\xFB\xE8\x41\x48\xE7\xF5\xE8\x64"\r
 \r
-BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTSTR pVersionString);\r
+BOOL BuildUpdates(LPCTSTR PrivateKeyFile, LPCTSTR Password, LPCTSTR ServerPath, LPCTSTR HashFile, LPCTSTR ListFile, DWORD Version, LPCTSTR VersionString, LPCTSTR Description);\r
+BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTSTR pVersionString, LPTSTR pDescription);\r
 BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir);\r
 BOOL ApplyUpdates(LPCTSTR DestinationDir, LPCTSTR BackupDirName);\r
 BOOL CleanupUpdates(LPCTSTR DownloadDir);\r