diff options
Diffstat (limited to 'plugins/PluginUpdater/src')
| -rw-r--r-- | plugins/PluginUpdater/src/Common.h | 3 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Notifications.cpp | 2 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Scanner.cpp | 11 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Utils.cpp | 86 | 
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);
  | 
