summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/PluginUpdater/src/Common.h3
-rw-r--r--plugins/PluginUpdater/src/Notifications.cpp2
-rw-r--r--plugins/PluginUpdater/src/Scanner.cpp11
-rw-r--r--plugins/PluginUpdater/src/Utils.cpp86
4 files changed, 92 insertions, 10 deletions
diff --git a/plugins/PluginUpdater/src/Common.h b/plugins/PluginUpdater/src/Common.h
index 5969dee2a3..e27d68a2ec 100644
--- a/plugins/PluginUpdater/src/Common.h
+++ b/plugins/PluginUpdater/src/Common.h
@@ -72,6 +72,7 @@ struct FILEURL
{
TCHAR tszDownloadURL[2048];
TCHAR tszDiskPath[MAX_PATH];
+ int CRCsum;
};
struct FILEINFO
@@ -139,7 +140,7 @@ int OptInit(WPARAM, LPARAM);
void BackupFile(TCHAR *ptszSrcFileName, TCHAR *ptszBackFileName);
void DoCheck(int iFlag);
-BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal);
+BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal, int CRCsum);
void ShowPopup(HWND hDlg, LPCTSTR Title, LPCTSTR Text, int Number, int ActType);
void __stdcall RestartMe(void*);
BOOL AllowUpdateOnStartup();
diff --git a/plugins/PluginUpdater/src/Notifications.cpp b/plugins/PluginUpdater/src/Notifications.cpp
index f631a1b8be..a45303d957 100644
--- a/plugins/PluginUpdater/src/Notifications.cpp
+++ b/plugins/PluginUpdater/src/Notifications.cpp
@@ -319,7 +319,7 @@ static void ApplyUpdates(void *param)
SetStringText(hwndList, i, TranslateT("Downloading..."));
FILEURL *pFileUrl = &todo[i].File;
- if ( !DownloadFile(pFileUrl->tszDownloadURL, pFileUrl->tszDiskPath))
+ if ( !DownloadFile(pFileUrl->tszDownloadURL, pFileUrl->tszDiskPath, pFileUrl->CRCsum))
SetStringText(hwndList, i, TranslateT("Failed!"));
else
SetStringText(hwndList, i, TranslateT("Succeeded."));
diff --git a/plugins/PluginUpdater/src/Scanner.cpp b/plugins/PluginUpdater/src/Scanner.cpp
index 2c3e662f71..fe0a027b42 100644
--- a/plugins/PluginUpdater/src/Scanner.cpp
+++ b/plugins/PluginUpdater/src/Scanner.cpp
@@ -35,7 +35,7 @@ static bool Exists(LPCTSTR strName)
struct ServListEntry
{
- ServListEntry(const char* _name, const char* _hash, DWORD _crc) :
+ ServListEntry(const char* _name, const char* _hash, int _crc) :
m_name( mir_a2t(_name)),
m_bNeedFree(true),
m_crc(_crc)
@@ -58,7 +58,7 @@ struct ServListEntry
TCHAR *m_name;
char m_szHash[32+1];
bool m_bNeedFree;
- DWORD m_crc;
+ int m_crc;
};
static int CompareHashes(const ServListEntry *p1, const ServListEntry *p2)
@@ -187,6 +187,7 @@ static void ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, cons
bool bHasNewVersion = false;
TCHAR *ptszUrl;
+ int MyCRC = 0;
mir_sntprintf(tszBuf, SIZEOF(tszBuf), _T("%s\\%s"), tszFolder, ffd.cFileName);
// this file is not marked for deletion
@@ -211,6 +212,7 @@ static void ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, cons
char szMyHash[33];
CalculateModuleHash(tszBuf, szMyHash);
+ MyCRC = item->m_crc;
bHasNewVersion = strcmp(szMyHash, item->m_szHash) != 0;
}
else { // file was marked for deletion, add it to the list anyway
@@ -242,6 +244,7 @@ static void ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, cons
mir_sntprintf(FileInfo->File.tszDownloadURL, SIZEOF(FileInfo->File.tszDownloadURL), _T("%s/%s.zip"), tszBaseUrl, tszBuf);
for (p = _tcschr(FileInfo->File.tszDownloadURL, '\\'); p != 0; p = _tcschr(p, '\\'))
*p++ = '/';
+ FileInfo->File.CRCsum = MyCRC;
UpdateFiles->insert(FileInfo);
} // end compare versions
}
@@ -292,7 +295,7 @@ static void CheckUpdates(void *)
FILEURL pFileUrl;
mir_sntprintf(pFileUrl.tszDownloadURL, SIZEOF(pFileUrl.tszDownloadURL), _T("%s/hashes.zip"), (TCHAR*)tszBaseUrl);
mir_sntprintf(pFileUrl.tszDiskPath, SIZEOF(pFileUrl.tszDiskPath), _T("%s\\hashes.zip"), tszTempPath);
- if (!DownloadFile(pFileUrl.tszDownloadURL, pFileUrl.tszDiskPath)) {
+ if (!DownloadFile(pFileUrl.tszDownloadURL, pFileUrl.tszDiskPath, 0)) {
ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("An error occured while downloading the update."), 1, 0);
CheckThread = NULL;
return;
@@ -323,7 +326,7 @@ static void CheckUpdates(void *)
_strlwr(p);
- DWORD dwCrc32;
+ int dwCrc32;
char *p1 = strchr(p, ' ');
if (p1 == NULL)
dwCrc32 = 0;
diff --git a/plugins/PluginUpdater/src/Utils.cpp b/plugins/PluginUpdater/src/Utils.cpp
index 1946babfca..38d46a6c75 100644
--- a/plugins/PluginUpdater/src/Utils.cpp
+++ b/plugins/PluginUpdater/src/Utils.cpp
@@ -122,7 +122,73 @@ void LoadOptions()
opts.bUpdateIcons = DBGetContactSettingByte(NULL, MODNAME, "UpdateIcons", DEFAULT_UPDATEICONS);
}
-BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal)
+ULONG crc32_table[256];
+ULONG ulPolynomial = 0x04c11db7;
+
+//////////////////////////////////////////////////////////////
+// Reflection is a requirement for the official CRC-32 standard.
+// You can create CRCs without it, but they won't conform to the standard.
+//////////////////////////////////////////////////////////////////////////
+
+ULONG Reflect(ULONG ref, char ch)
+{
+ // Used only by Init_CRC32_Table()
+ ULONG value(0);
+
+ // Swap bit 0 for bit 7
+ // bit 1 for bit 6, etc.
+ for(int i = 1; i < (ch + 1); i++)
+ {
+ if(ref & 1)
+ value |= 1 << (ch - i);
+ ref >>= 1;
+ }
+ return value;
+}
+
+void InitCrcTable()
+{
+ // 256 values representing ASCII character codes.
+ for(int i = 0; i <= 0xFF; i++)
+ {
+ crc32_table[i] = Reflect(i, 8) << 24;
+ for (int j = 0; j < 8; j++)
+ crc32_table[i] = (crc32_table[i] << 1) ^ (crc32_table[i] & (1 << 31) ? ulPolynomial : 0);
+ crc32_table[i] = Reflect(crc32_table[i], 32);
+ }
+}
+
+int Get_CRC(unsigned char* buffer, ULONG bufsize)
+{
+ ULONG crc(0xffffffff);
+ int len;
+ len = bufsize;
+ // Save the text in the buffer.
+
+ // Perform the algorithm on each character
+ // in the string, using the lookup table values.
+
+ for(int i = 0; i < len; i++)
+ crc = (crc >> 8) ^ crc32_table[(crc & 0xFF) ^ buffer[i]];
+
+ // Exclusive OR the result with the beginning value.
+ return crc^0xffffffff;
+}
+
+long FileSize(FILE *input)
+{
+
+ long fileSizeBytes;
+ fseek(input, 0, SEEK_END);
+ fileSizeBytes = ftell(input);
+ fseek(input, 0, SEEK_SET);
+
+ return fileSizeBytes;
+
+
+}
+
+BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal, int CRCsum)
{
DWORD dwBytes;
@@ -156,7 +222,13 @@ BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal)
// write the downloaded file firectly
WriteFile(hFile, pReply->pData, (DWORD)pReply->dataLength, &dwBytes, NULL);
CloseHandle(hFile);
- ret = true;
+ if (CRCsum) {
+ InitCrcTable();
+ int crc = Get_CRC((unsigned char*)pReply->pData, (long)dwBytes);
+ if (crc == CRCsum)
+ ret = true;
+ } else
+ ret = true;
}
else {
// try to write it via PU stub
@@ -167,11 +239,17 @@ BOOL DownloadFile(LPCTSTR tszURL, LPCTSTR tszLocal)
WriteFile(hFile, pReply->pData, (DWORD)pReply->dataLength, &dwBytes, NULL);
CloseHandle(hFile);
SafeMoveFile(tszTempFile, tszLocal);
- ret = true;
+ if (CRCsum) {
+ InitCrcTable();
+ int crc = Get_CRC((unsigned char*)pReply->pData, (long)dwBytes);
+ if (crc == CRCsum)
+ ret = true;
+ } else
+ ret = true;
}
}
}
- CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)pReply);
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)pReply);
}
mir_free(szUrl);