From 23617c95e41dc21347d4957c29fe5989a36e2a85 Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Fri, 3 Jan 2014 12:19:42 +0000
Subject: more correct way of writing signatures

git-svn-id: http://svn.miranda-ng.org/main/trunk@7477 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 plugins/Db3x_mmap/src/database.cpp      |   2 +-
 plugins/Db3x_mmap/src/dbcontacts.cpp    |   8 +--
 plugins/Db3x_mmap/src/dbcrypt.cpp       |   3 +-
 plugins/Db3x_mmap/src/dbheaders.cpp     |   7 ++-
 plugins/Db3x_mmap/src/dbintf.cpp        |   1 +
 plugins/Db3x_mmap/src/dbintf.h          | 102 +++++++++++++++++---------------
 plugins/Db3x_mmap/src/dbmodulechain.cpp |   6 +-
 plugins/Db3x_mmap/src/dbsettings.cpp    |   4 +-
 plugins/Db3x_mmap/src/ui.cpp            |   2 +
 9 files changed, 73 insertions(+), 62 deletions(-)

(limited to 'plugins')

diff --git a/plugins/Db3x_mmap/src/database.cpp b/plugins/Db3x_mmap/src/database.cpp
index 1df59e9575..68b60d01dd 100644
--- a/plugins/Db3x_mmap/src/database.cpp
+++ b/plugins/Db3x_mmap/src/database.cpp
@@ -60,7 +60,7 @@ DWORD CDb3Base::ReallocSpace(DWORD ofs, int oldSize, int newSize)
 	if (ofs+oldSize == m_dbHeader.ofsFileEnd) {
 		ofsNew = ofs;
 		m_dbHeader.ofsFileEnd += newSize-oldSize;
-		DBWrite(0,&m_dbHeader,sizeof(m_dbHeader));
+		DBWrite(0, &m_dbHeader, sizeof(m_dbHeader));
 		log3("adding newspace %d@%08x+%d", newSize, ofsNew, oldSize);
 	}
 	else {
diff --git a/plugins/Db3x_mmap/src/dbcontacts.cpp b/plugins/Db3x_mmap/src/dbcontacts.cpp
index ee65364bf0..d330631b3b 100644
--- a/plugins/Db3x_mmap/src/dbcontacts.cpp
+++ b/plugins/Db3x_mmap/src/dbcontacts.cpp
@@ -142,7 +142,7 @@ STDMETHODIMP_(LONG) CDb3Base::DeleteContact(HANDLE hContact)
 	dbc = (DBContact*)DBRead(hContact, sizeof(DBContact), NULL);
 	if (m_dbHeader.ofsFirstContact == (DWORD)hContact) {
 		m_dbHeader.ofsFirstContact = dbc->ofsNext;
-		DBWrite(0,&m_dbHeader,sizeof(m_dbHeader));
+		DBWrite(0, &m_dbHeader, sizeof(m_dbHeader));
 	}
 	else {
 		DWORD ofsNext = dbc->ofsNext;
@@ -161,7 +161,7 @@ STDMETHODIMP_(LONG) CDb3Base::DeleteContact(HANDLE hContact)
 	DeleteSpace((DWORD)hContact, sizeof(DBContact));
 	//decrement contact count
 	m_dbHeader.contactCount--;
-	DBWrite(0,&m_dbHeader,sizeof(m_dbHeader));
+	DBWrite(0, &m_dbHeader, sizeof(m_dbHeader));
 	DBFlush(0);
 	return 0;
 }
@@ -179,8 +179,8 @@ STDMETHODIMP_(HANDLE) CDb3Base::AddContact()
 		dbc.ofsNext = m_dbHeader.ofsFirstContact;
 		m_dbHeader.ofsFirstContact = ofsNew;
 		m_dbHeader.contactCount++;
-		DBWrite(ofsNew,&dbc,sizeof(DBContact));
-		DBWrite(0,&m_dbHeader,sizeof(m_dbHeader));
+		DBWrite(ofsNew, &dbc, sizeof(DBContact));
+		DBWrite(0, &m_dbHeader, sizeof(m_dbHeader));
 		DBFlush(0);
 	}
 	m_cache->AddContactToCache((HANDLE)ofsNew);
diff --git a/plugins/Db3x_mmap/src/dbcrypt.cpp b/plugins/Db3x_mmap/src/dbcrypt.cpp
index 7aa8a0c046..00cab246e8 100644
--- a/plugins/Db3x_mmap/src/dbcrypt.cpp
+++ b/plugins/Db3x_mmap/src/dbcrypt.cpp
@@ -184,8 +184,7 @@ LBL_SetNewKey:
 		EnumModuleNames(sttModuleEnum, this);
 
 		// upgrade signature
-		memcpy(&m_dbHeader.signature, &dbSignatureU, sizeof(dbSignatureU));
-		DBWrite(0, &dbSignatureU, sizeof(dbSignatureU));
+		WriteSignature(dbSignatureU);
 	}
 
 	if (m_dbHeader.version == DB_OLD_VERSION) {
diff --git a/plugins/Db3x_mmap/src/dbheaders.cpp b/plugins/Db3x_mmap/src/dbheaders.cpp
index 5d19daaf35..97e7b915fe 100644
--- a/plugins/Db3x_mmap/src/dbheaders.cpp
+++ b/plugins/Db3x_mmap/src/dbheaders.cpp
@@ -65,6 +65,11 @@ int CDb3Base::CheckDbHeaders()
 	if (m_dbHeader.ofsUser == 0)
 		return EGROKPRF_DAMAGED;
 
-	m_bEncrypted = 0 == memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature));
 	return 0;
 }
+
+void CDb3Base::WriteSignature(DBSignature &sign)
+{
+	memcpy(&m_dbHeader.signature, &sign, sizeof(DBSignature));
+	DBWrite(0, &sign, sizeof(DBSignature));
+}
\ No newline at end of file
diff --git a/plugins/Db3x_mmap/src/dbintf.cpp b/plugins/Db3x_mmap/src/dbintf.cpp
index 0efc944518..9a1b7e9fba 100644
--- a/plugins/Db3x_mmap/src/dbintf.cpp
+++ b/plugins/Db3x_mmap/src/dbintf.cpp
@@ -126,6 +126,7 @@ int CDb3Base::Load(bool bSkipInit)
 		if (InitModuleNames()) return 1;
 
 		m_bReadOnly = false;
+		m_bEncrypted = 0 == memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature));
 
 		hContactDeletedEvent = CreateHookableEvent(ME_DB_CONTACT_DELETED);
 		hContactAddedEvent = CreateHookableEvent(ME_DB_CONTACT_ADDED);
diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h
index b3eb943f0a..eb0b67535f 100644
--- a/plugins/Db3x_mmap/src/dbintf.h
+++ b/plugins/Db3x_mmap/src/dbintf.h
@@ -54,9 +54,10 @@ DBHeader
 
 #define DBVT_ENCRYPTED 250
 
-struct DBSignature {
-  char name[15];
-  BYTE eof;
+struct DBSignature
+{
+	char name[15];
+	BYTE eof;
 };
 
 struct ModuleName
@@ -66,68 +67,69 @@ struct ModuleName
 };
 
 #include <pshpack1.h>
-struct DBHeader {
-  BYTE signature[16];      // 'Miranda ICQ DB',0,26
-  DWORD version;		   //as 4 bytes, ie 1.2.3.10 = 0x0102030a
-                           //this version is 0x00000700
-  DWORD ofsFileEnd;		   //offset of the end of the database - place to write
-                           //new structures
-  DWORD slackSpace;		   //a counter of the number of bytes that have been
-                           //wasted so far due to deleting structures and/or
-						   //re-making them at the end. We should compact when
-						   //this gets above a threshold
-  DWORD contactCount;	   //number of contacts in the chain,excluding the user
-  DWORD ofsFirstContact;   //offset to first DBContact in the chain
-  DWORD ofsUser;		   //offset to DBContact representing the user
-  DWORD ofsFirstModuleName;	//offset to first struct DBModuleName in the chain
+struct DBHeader
+{
+	BYTE signature[16];      // 'Miranda ICQ DB',0,26
+	DWORD version;		   //as 4 bytes, ie 1.2.3.10 = 0x0102030a
+	//this version is 0x00000700
+	DWORD ofsFileEnd;		   //offset of the end of the database - place to write
+	//new structures
+	DWORD slackSpace;		   //a counter of the number of bytes that have been
+	//wasted so far due to deleting structures and/or
+	//re-making them at the end. We should compact when
+	//this gets above a threshold
+	DWORD contactCount;	   //number of contacts in the chain,excluding the user
+	DWORD ofsFirstContact;   //offset to first DBContact in the chain
+	DWORD ofsUser;		   //offset to DBContact representing the user
+	DWORD ofsFirstModuleName;	//offset to first struct DBModuleName in the chain
 };
 
 #define DBCONTACT_SIGNATURE   0x43DECADEu
 
 struct DBContact
 {
-  DWORD signature;
-  DWORD ofsNext;			 //offset to the next contact in the chain. zero if
-                             //this is the 'user' contact or the last contact
-							 //in the chain
-  DWORD ofsFirstSettings;	 //offset to the first DBContactSettings in the
-                             //chain for this contact.
-  DWORD eventCount;			 //number of events in the chain for this contact
-  DWORD ofsFirstEvent,ofsLastEvent;	 //offsets to the first and last DBEvent in
-                                     //the chain for this contact
-  DWORD ofsFirstUnreadEvent; //offset to the first (chronological) unread event
-							 //in the chain, 0 if all are read
-  DWORD timestampFirstUnread; //timestamp of the event at ofsFirstUnreadEvent
+	DWORD signature;
+	DWORD ofsNext;			 //offset to the next contact in the chain. zero if
+	//this is the 'user' contact or the last contact
+	//in the chain
+	DWORD ofsFirstSettings;	 //offset to the first DBContactSettings in the
+	//chain for this contact.
+	DWORD eventCount;			 //number of events in the chain for this contact
+	DWORD ofsFirstEvent, ofsLastEvent;	 //offsets to the first and last DBEvent in
+	//the chain for this contact
+	DWORD ofsFirstUnreadEvent; //offset to the first (chronological) unread event
+	//in the chain, 0 if all are read
+	DWORD timestampFirstUnread; //timestamp of the event at ofsFirstUnreadEvent
 };
 
 #define DBMODULENAME_SIGNATURE  0x4DDECADEu
 struct DBModuleName
 {
-  DWORD signature;
-  DWORD ofsNext;		//offset to the next module name in the chain
-  BYTE cbName;			//number of characters in this module name
-  char name[1];			//name, no nul terminator
+	DWORD signature;
+	DWORD ofsNext;		//offset to the next module name in the chain
+	BYTE cbName;			//number of characters in this module name
+	char name[1];			//name, no nul terminator
 };
 
 #define DBCONTACTSETTINGS_SIGNATURE  0x53DECADEu
 struct DBContactSettings
 {
-  DWORD signature;
-  DWORD ofsNext;		 //offset to the next contactsettings in the chain
-  DWORD ofsModuleName;	 //offset to the DBModuleName of the owner of these
-                         //settings
-  DWORD cbBlob;			 //size of the blob in bytes. May be larger than the
-                         //actual size for reducing the number of moves
-						 //required using granularity in resizing
-  BYTE blob[1];			 //the blob. a back-to-back sequence of DBSetting
-                         //structs, the last has cbName = 0
+	DWORD signature;
+	DWORD ofsNext;		 //offset to the next contactsettings in the chain
+	DWORD ofsModuleName;	 //offset to the DBModuleName of the owner of these
+	//settings
+	DWORD cbBlob;			 //size of the blob in bytes. May be larger than the
+	//actual size for reducing the number of moves
+	//required using granularity in resizing
+	BYTE blob[1];			 //the blob. a back-to-back sequence of DBSetting
+	//structs, the last has cbName = 0
 };
 
 #define DBEVENT_SIGNATURE  0x45DECADEu
 struct DBEvent
 {
 	DWORD signature;
-	DWORD ofsPrev,ofsNext;	 //offset to the previous and next events in the
+	DWORD ofsPrev, ofsNext;	 //offset to the previous and next events in the
 	//chain. Chain is sorted chronologically
 	DWORD ofsModuleName;		 //offset to a DBModuleName struct of the name of
 	//the owner of this event
@@ -151,7 +153,9 @@ struct CDb3Base : public MIDatabase, public MIDatabaseChecker, public MZeroedObj
 	int Create(void);
 	int CreateDbHeaders(const DBSignature&);
 	int CheckDbHeaders();
+
 	void DatabaseCorruption(TCHAR *text);
+	void WriteSignature(DBSignature&);
 
 	__forceinline HANDLE getFile() const { return m_hDbFile; }
 	__forceinline bool isEncrypted() const { return m_bEncrypted; }
@@ -237,7 +241,7 @@ protected:
 
 	////////////////////////////////////////////////////////////////////////////
 	// database stuff
-public:	
+public:
 	UINT_PTR m_flushBuffersTimerId;
 	DWORD    m_flushFailTick;
 	PBYTE    m_pDbCache;
@@ -257,7 +261,8 @@ protected:
 	DWORD ReallocSpace(DWORD ofs, int oldSize, int newSize);
 
 	__forceinline PBYTE DBRead(HANDLE hContact, int bytesRequired, int *bytesAvail)
-	{	return DBRead((DWORD)hContact, bytesRequired, bytesAvail);
+	{
+		return DBRead((DWORD)hContact, bytesRequired, bytesAvail);
 	}
 
 	////////////////////////////////////////////////////////////////////////////
@@ -293,14 +298,14 @@ protected:
 	DWORD ConvertModuleNameOfs(DWORD ofsOld);
 	void ConvertOldEvent(DBEvent*& dbei);
 
-	int GetContactSettingWorker(HANDLE hContact,DBCONTACTGETSETTING *dbcgs,int isStatic);
+	int GetContactSettingWorker(HANDLE hContact, DBCONTACTGETSETTING *dbcgs, int isStatic);
 	int WorkSettingsChain(DWORD ofsContact, DBContact *dbc, int firstTime);
 	int WorkEventChain(DWORD ofsContact, DBContact *dbc, int firstTime);
 
 	DWORD WriteSegment(DWORD ofs, PVOID buf, int cbBytes);
 	DWORD WriteEvent(DBEvent *dbe);
-	void WriteOfsNextToPrevious(DWORD ofsPrev,DBContact *dbc,DWORD ofsNext);
-	void FinishUp(DWORD ofsLast,DBContact *dbc);
+	void WriteOfsNextToPrevious(DWORD ofsPrev, DBContact *dbc, DWORD ofsNext);
+	void FinishUp(DWORD ofsLast, DBContact *dbc);
 
 	DBCHeckCallback *cb;
 	DWORD sourceFileSize, ofsAggrCur;
@@ -326,4 +331,3 @@ protected:
 	void  InitDialogs();
 	bool  EnterPassword(const BYTE *pKey, const size_t keyLen);
 };
-
diff --git a/plugins/Db3x_mmap/src/dbmodulechain.cpp b/plugins/Db3x_mmap/src/dbmodulechain.cpp
index 743bbd2b21..3b61a236fa 100644
--- a/plugins/Db3x_mmap/src/dbmodulechain.cpp
+++ b/plugins/Db3x_mmap/src/dbmodulechain.cpp
@@ -95,9 +95,9 @@ DWORD CDb3Base::GetModuleNameOfs(const char *szName)
 	dbmn.cbName = nameLen;
 	dbmn.ofsNext = m_dbHeader.ofsFirstModuleName;
 	m_dbHeader.ofsFirstModuleName = ofsNew;
-	DBWrite(0,&m_dbHeader,sizeof(m_dbHeader));
-	DBWrite(ofsNew,&dbmn,offsetof(struct DBModuleName,name));
-	DBWrite(ofsNew+offsetof(struct DBModuleName,name),(PVOID)szName,nameLen);
+	DBWrite(0, &m_dbHeader, sizeof(m_dbHeader));
+	DBWrite(ofsNew, &dbmn, offsetof(struct DBModuleName, name));
+	DBWrite(ofsNew + offsetof(struct DBModuleName, name), (PVOID)szName, nameLen);
 	DBFlush(0);
 
 	//add to cache
diff --git a/plugins/Db3x_mmap/src/dbsettings.cpp b/plugins/Db3x_mmap/src/dbsettings.cpp
index 0383a12e41..254718fa9a 100644
--- a/plugins/Db3x_mmap/src/dbsettings.cpp
+++ b/plugins/Db3x_mmap/src/dbsettings.cpp
@@ -83,7 +83,7 @@ int CDb3Base::GetContactSettingWorker(HANDLE hContact, DBCONTACTGETSETTING *dbcg
 	DBVARIANT *pCachedValue = m_cache->GetCachedValuePtr(hContact, szCachedSettingName, 0);
 	if (pCachedValue != NULL) {
 		if (pCachedValue->type == DBVT_ASCIIZ || pCachedValue->type == DBVT_UTF8) {
-			bool bIsEncrypted = m_bEncrypted || ::isEncrypted(dbcgs->szModule, dbcgs->szSetting);
+			bool bIsEncrypted = /*m_bEncrypted || */ ::isEncrypted(dbcgs->szModule, dbcgs->szSetting);
 			int cbOrigLen = dbcgs->pValue->cchVal;
 			char *cbOrigPtr = dbcgs->pValue->pszVal;
 			memcpy(dbcgs->pValue, pCachedValue, sizeof(DBVARIANT));
@@ -412,7 +412,7 @@ STDMETHODIMP_(BOOL) CDb3Base::WriteContactSetting(HANDLE hContact, DBCONTACTWRIT
 	case DBVT_ASCIIZ: case DBVT_UTF8:
 		if (tmp.value.pszVal == NULL) return 1;
 		tmp.value.cchVal = (WORD)strlen(tmp.value.pszVal);
-		bIsEncrypted = m_bEncrypted || ::isEncrypted(dbcws->szModule, dbcws->szSetting);
+		bIsEncrypted = /*m_bEncrypted ||*/ ::isEncrypted(dbcws->szModule, dbcws->szSetting);
 		if (bIsEncrypted) {
 			size_t len;
 			BYTE *pResult = m_crypto->encodeString(tmp.value.pszVal, &len);
diff --git a/plugins/Db3x_mmap/src/ui.cpp b/plugins/Db3x_mmap/src/ui.cpp
index 902791c1b2..a8fa3f787a 100644
--- a/plugins/Db3x_mmap/src/ui.cpp
+++ b/plugins/Db3x_mmap/src/ui.cpp
@@ -192,6 +192,7 @@ LBL_Error:
 				SetDlgItemTextA(hwndDlg, IDC_USERPASS2, "");
 			}
 			else {
+				param->db->WriteSignature(dbSignatureU);
 				param->db->SetPassword(NULL);
 				param->db->StoreKey();
 				EndDialog(hwndDlg, IDREMOVE);
@@ -215,6 +216,7 @@ LBL_Error:
 			if (!CheckOldPassword(hwndDlg, param->db))
 				goto LBL_Error;
 
+			param->db->WriteSignature(dbSignatureE);
 			param->db->SetPassword(buf2);
 			param->db->StoreKey();
 			SecureZeroMemory(buf2, sizeof(buf2));
-- 
cgit v1.2.3