OSDN Git Service

Update OpenSSL to 1.0.2f.
[ffftp/ffftp.git] / updater.c
index 305d363..d60464d 100644 (file)
--- a/updater.c
+++ b/updater.c
@@ -15,6 +15,7 @@ typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
 #include "socketwrapper.h"\r
 #include "protectprocess.h"\r
 #include "mbswrapper.h"\r
+#include "apiemulator.h"\r
 \r
 typedef struct\r
 {\r
@@ -42,6 +43,9 @@ typedef struct
        UPDATE_LIST_FILE File[1];\r
 } UPDATE_LIST;\r
 \r
+#define UPDATE_MAX_LIST_SIZE 1048576\r
+#define UPDATE_MAX_FILE_SIZE 16777216\r
+\r
 BOOL ReadFileViaHTTPW(void* pOut, DWORD Length, DWORD* pLength, LPCWSTR UserAgent, LPCWSTR ServerName, LPCWSTR ObjectName)\r
 {\r
        BOOL bResult;\r
@@ -255,9 +259,9 @@ DWORD ListUpdateFile(UPDATE_LIST* pList, DWORD MaxCount, LPCTSTR ServerPath, LPC
                                                        {\r
                                                                if(pList)\r
                                                                {\r
-                                                                       if(pBuf = malloc(16777216))\r
+                                                                       if(pBuf = malloc(UPDATE_MAX_FILE_SIZE))\r
                                                                        {\r
-                                                                               if(LoadMemoryFromFileWithTimestamp(Temp3, pBuf, 16777216, &Length, &Time))\r
+                                                                               if(LoadMemoryFromFileWithTimestamp(Temp3, pBuf, UPDATE_MAX_FILE_SIZE, &Length, &Time))\r
                                                                                {\r
                                                                                        if(GetHashSHA512(pBuf, Length, &Hash))\r
                                                                                        {\r
@@ -306,13 +310,13 @@ BOOL BuildUpdates(LPCTSTR PrivateKeyFile, LPCTSTR Password, LPCTSTR ServerPath,
                {\r
                        if(p = _tcsrchr(Name, _T('\\')))\r
                                *p = _T('\0');\r
-                       if(pList = (UPDATE_LIST*)malloc(1048576))\r
+                       if(pList = (UPDATE_LIST*)malloc(UPDATE_MAX_LIST_SIZE))\r
                        {\r
-                               memset(pList, 0, 1048576);\r
+                               memset(pList, 0, UPDATE_MAX_LIST_SIZE);\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
+                               ListUpdateFile(pList, (UPDATE_MAX_LIST_SIZE - 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
@@ -354,9 +358,9 @@ BOOL CheckForUpdates(BOOL bDownload, LPCTSTR DownloadDir, DWORD* pVersion, LPTST
                                memcpy(&UpdateHash, &Buf2, sizeof(UPDATE_HASH));\r
                                if(memcmp(&UpdateHash.Signature, UPDATE_SIGNATURE, 64) == 0)\r
                                {\r
-                                       if(pBuf = malloc(1048576))\r
+                                       if(pBuf = malloc(UPDATE_MAX_LIST_SIZE))\r
                                        {\r
-                                               if(ReadFileViaHTTP(pBuf, 1048576, &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
+                                               if(ReadFileViaHTTP(pBuf, UPDATE_MAX_LIST_SIZE, &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
                                                {\r
                                                        if(GetHashSHA512(pBuf, Length, &Hash))\r
                                                        {\r
@@ -393,11 +397,13 @@ BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
        BOOL bResult;\r
        UPDATE_LIST* pUpdateList;\r
        void* pBuf;\r
+       TCHAR LocalDir[MAX_PATH];\r
+       TCHAR* p;\r
        DWORD i;\r
        BOOL b;\r
+       TCHAR Path[MAX_PATH];\r
        DWORD Length;\r
        BYTE Hash[64];\r
-       TCHAR Path[MAX_PATH];\r
        bResult = FALSE;\r
        if(ListLength >= sizeof(UPDATE_LIST))\r
        {\r
@@ -407,8 +413,15 @@ BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
                        bResult = TRUE;\r
                        DeleteDirectoryAndContents(DownloadDir);\r
                        CreateDirectory(DownloadDir, NULL);\r
-                       if(pBuf = malloc(16777216))\r
+                       if(pBuf = malloc(UPDATE_MAX_FILE_SIZE))\r
                        {\r
+                               if(GetModuleFileName(NULL, LocalDir, MAX_PATH) > 0)\r
+                               {\r
+                                       if(p = _tcsrchr(LocalDir, _T('\\')))\r
+                                               *p = _T('\0');\r
+                               }\r
+                               else\r
+                                       _tcscpy(LocalDir, _T("."));\r
                                for(i = 0; i < pUpdateList->FileCount; i++)\r
                                {\r
                                        b = FALSE;\r
@@ -421,16 +434,29 @@ BOOL PrepareUpdates(void* pList, DWORD ListLength, LPCTSTR DownloadDir)
                                        }\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
+                                               _tcscpy(Path, LocalDir);\r
+                                               _tcscat(Path, pUpdateList->File[i].DstPath);\r
+                                               if(LoadMemoryFromFileWithTimestamp(Path, pBuf, UPDATE_MAX_FILE_SIZE, &Length, NULL))\r
                                                {\r
                                                        if(GetHashSHA512(pBuf, Length, &Hash))\r
                                                        {\r
                                                                if(memcmp(&Hash, &pUpdateList->File[i].SrcHash, 64) == 0)\r
+                                                                       b = TRUE;\r
+                                                       }\r
+                                               }\r
+                                               if(!b)\r
+                                               {\r
+                                                       if(ReadFileViaHTTP(pBuf, UPDATE_MAX_FILE_SIZE, &Length, HTTP_USER_AGENT, UPDATE_SERVER, pUpdateList->File[i].SrcPath))\r
+                                                       {\r
+                                                               if(GetHashSHA512(pBuf, Length, &Hash))\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
+                                                                       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
@@ -465,20 +491,23 @@ BOOL ApplyUpdates(LPCTSTR DestinationDir, LPCTSTR BackupDirName)
                _tcscat(Backup, _T("\\"));\r
                _tcscat(Backup, BackupDirName);\r
                DeleteDirectoryAndContents(Backup);\r
-               if(CopyAllFilesInDirectory(DestinationDir, Backup))\r
+               if(CreateDirectory(Backup, NULL))\r
                {\r
-                       _tcscpy(DestinationBackup, DestinationDir);\r
-                       _tcscat(DestinationBackup, _T("\\"));\r
-                       _tcscat(DestinationBackup, BackupDirName);\r
-                       if(CopyAllFilesInDirectory(Source, DestinationDir))\r
-                       {\r
-                               DeleteDirectoryAndContents(DestinationBackup);\r
-                               bResult = TRUE;\r
-                       }\r
-                       else\r
+                       if(CopyAllFilesInDirectory(DestinationDir, Backup))\r
                        {\r
-                               DeleteDirectoryAndContents(DestinationBackup);\r
-                               CopyAllFilesInDirectory(Backup, DestinationDir);\r
+                               _tcscpy(DestinationBackup, DestinationDir);\r
+                               _tcscat(DestinationBackup, _T("\\"));\r
+                               _tcscat(DestinationBackup, BackupDirName);\r
+                               if(CopyAllFilesInDirectory(Source, DestinationDir))\r
+                               {\r
+                                       DeleteDirectoryAndContents(DestinationBackup);\r
+                                       bResult = TRUE;\r
+                               }\r
+                               else\r
+                               {\r
+                                       DeleteDirectoryAndContents(DestinationBackup);\r
+                                       CopyAllFilesInDirectory(Backup, DestinationDir);\r
+                               }\r
                        }\r
                }\r
        }\r
@@ -538,7 +567,10 @@ BOOL RestartUpdateProcessAsAdministrator(LPCTSTR CommandLine, LPCTSTR Keyword)
                                memset(&Info, 0, sizeof(SHELLEXECUTEINFO));\r
                                Info.cbSize = sizeof(SHELLEXECUTEINFO);\r
                                Info.fMask = SEE_MASK_NOCLOSEPROCESS;\r
-                               Info.lpVerb = _T("runas");\r
+                               if(IsUserAnAdmin())\r
+                                       Info.lpVerb = _T("open");\r
+                               else\r
+                                       Info.lpVerb = _T("runas");\r
                                Info.lpFile = Path;\r
                                Info.lpParameters = NewCommandLine;\r
                                Info.nShow = SW_SHOW;\r