summaryrefslogtreecommitdiff
path: root/plugins/Dbx_mmap_SA/src/dbintf_sa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Dbx_mmap_SA/src/dbintf_sa.cpp')
-rw-r--r--plugins/Dbx_mmap_SA/src/dbintf_sa.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/plugins/Dbx_mmap_SA/src/dbintf_sa.cpp b/plugins/Dbx_mmap_SA/src/dbintf_sa.cpp
new file mode 100644
index 0000000000..b85b3481cb
--- /dev/null
+++ b/plugins/Dbx_mmap_SA/src/dbintf_sa.cpp
@@ -0,0 +1,234 @@
+/*
+
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright 2012 Miranda NG project,
+all portions of this codebase are copyrighted to the people
+listed in contributors.txt.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "commonheaders.h"
+
+#define NeedBytes(n) if(bytesRemaining<(n)) pBlob=(PBYTE)DBRead(ofsBlobPtr,(n),&bytesRemaining)
+#define MoveAlong(n) {int x=n; pBlob+=(x); ofsBlobPtr+=(x); bytesRemaining-=(x);}
+#define VLT(n) ((n==DBVT_UTF8)?DBVT_ASCIIZ:n)
+
+extern CDdxMmapSA* g_Db;
+
+int InitDialogs(void);
+
+DBSignature dbSignatureSecured = {"Miranda ICQ SD",0x1A};
+
+CDdxMmapSA::CDdxMmapSA(const TCHAR* tszFileName) :
+ CDdxMmap(tszFileName)
+{
+}
+
+int CDdxMmapSA::Load(bool bSkipInit)
+{
+ if ( CDdxMmap::Load(bSkipInit) != ERROR_SUCCESS)
+ return 1;
+
+ if ( CheckDbHeaders())
+ return 1;
+
+ if (!bSkipInit) {
+ TCHAR* p = _tcsrchr(m_tszProfileName, '\\');
+ if (!p)
+ return 1;
+
+ g_Db = this;
+ if (m_bEncoding && !CheckPassword( LOWORD(m_dbHeader.version), p+1))
+ return 1;
+
+ InitDialogs();
+ }
+
+ return 0;
+}
+
+int CDdxMmapSA::CheckDbHeaders()
+{
+ if ( memcmp(m_dbHeader.signature, &dbSignatureSecured, sizeof(m_dbHeader.signature)) == 0)
+ m_bEncoding = true;
+ else {
+ m_bEncoding = false;
+ if ( memcmp(m_dbHeader.signature,&dbSignature,sizeof(m_dbHeader.signature)))
+ return 1;
+ if ( LOWORD(m_dbHeader.version) != 0x0700)
+ return 2;
+ }
+ if (m_dbHeader.ofsUser == 0)
+ return 3;
+ return 0;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+static DWORD __inline GetSettingValueLength(PBYTE pSetting)
+{
+ if(pSetting[0]&DBVTF_VARIABLELENGTH) return 2+*(PWORD)(pSetting+1);
+ return pSetting[0];
+}
+
+void CDdxMmapSA::EncodeContactSettings(HANDLE hContact)
+{
+ if (!hContact)
+ hContact = (HANDLE)m_dbHeader.ofsUser;
+
+ DBContact *contact = (DBContact *)DBRead((DWORD)hContact, sizeof(DBContact), NULL);
+ if (contact->ofsFirstSettings) {
+ DBContactSettings *setting = (struct DBContactSettings *)DBRead(contact->ofsFirstSettings, sizeof(struct DBContactSettings), NULL);
+ DWORD offset = contact->ofsFirstSettings;
+ while( true ) {
+ DWORD ofsBlobPtr;
+ PBYTE pBlob;
+ int bytesRemaining;
+ DWORD len;
+
+ ofsBlobPtr = offset + offsetof(struct DBContactSettings,blob);
+ pBlob = (PBYTE)DBRead(ofsBlobPtr,1,&bytesRemaining);
+ while(pBlob[0]) {
+ NeedBytes(1);
+ NeedBytes(1+pBlob[0]);
+ MoveAlong(1+pBlob[0]);
+
+ NeedBytes(5);
+
+ switch(pBlob[0]) {
+ case DBVT_DELETED: break;
+ case DBVT_BYTE: break;
+ case DBVT_WORD:
+ CryptoEngine->EncryptMem(pBlob+1, 2, key);
+ break;
+
+ case DBVT_DWORD:
+ CryptoEngine->EncryptMem(pBlob+1, 4, key);
+ break;
+
+ case DBVT_UTF8:
+ case DBVT_ASCIIZ:
+ case DBVT_BLOB:
+ NeedBytes(3+*(PWORD)(pBlob+1));
+ len = *(PWORD)(pBlob+1);
+
+ CryptoEngine->EncryptMem(pBlob+3, len, key);
+ break;
+ }
+ NeedBytes(3);
+ MoveAlong(1+GetSettingValueLength(pBlob));
+ NeedBytes(1);
+ }
+
+ if (!setting->ofsNext)
+ break;
+
+ offset = setting->ofsNext;
+ setting = (struct DBContactSettings *)DBRead(setting->ofsNext, sizeof(struct DBContactSettings), NULL);
+ }
+ }
+}
+
+void CDdxMmapSA::DecodeContactSettings(HANDLE hContact)
+{
+ if (!hContact)
+ hContact = (HANDLE)m_dbHeader.ofsUser;
+
+ DBContact *contact = (DBContact *)DBRead((DWORD)hContact, sizeof(DBContact), NULL);
+ if (contact->ofsFirstSettings){
+ DBContactSettings *setting = (struct DBContactSettings *)DBRead(contact->ofsFirstSettings, sizeof(struct DBContactSettings), NULL);
+ DWORD offset = contact->ofsFirstSettings;
+ while (true) {
+ DWORD ofsBlobPtr;
+ PBYTE pBlob;
+ int bytesRemaining;
+ DWORD len;
+ ofsBlobPtr = offset + offsetof(struct DBContactSettings,blob);
+ pBlob = (PBYTE)DBRead(ofsBlobPtr,1,&bytesRemaining);
+ while(pBlob[0]) {
+ NeedBytes(1);
+ NeedBytes(1+pBlob[0]);
+ //CopyMemory(szSetting,pBlob+1,pBlob[0]); szSetting[pBlob[0]] = 0;
+ MoveAlong(1+pBlob[0]);
+
+ NeedBytes(5);
+
+ switch(pBlob[0]) {
+ case DBVT_DELETED: break;
+ case DBVT_BYTE: break;
+ case DBVT_WORD:
+ CryptoEngine->DecryptMem(pBlob+1, 2, key);
+ break;
+
+ case DBVT_DWORD:
+ CryptoEngine->DecryptMem(pBlob+1, 4, key);
+ break;
+
+ case DBVT_UTF8:
+ case DBVT_ASCIIZ:
+ case DBVT_BLOB:
+ NeedBytes(3+*(PWORD)(pBlob+1));
+ len = *(PWORD)(pBlob+1);
+
+ CryptoEngine->DecryptMem(pBlob+3, len, key);
+ break;
+ }
+ NeedBytes(3);
+ MoveAlong(1+GetSettingValueLength(pBlob));
+ NeedBytes(1);
+ }
+
+ if (!setting->ofsNext)
+ break;
+
+ offset = setting->ofsNext;
+ setting = (struct DBContactSettings *)DBRead(setting->ofsNext, sizeof(struct DBContactSettings), NULL);
+ }
+ }
+}
+
+void CDdxMmapSA::EncodeEvent(HANDLE hEvent)
+{
+ DBEvent *dbe = (DBEvent*)DBRead((DWORD)hEvent,sizeof(DBEvent),NULL);
+ if (dbe->signature = DBEVENT_SIGNATURE)
+ CryptoEngine->EncryptMem(DBRead((DWORD)hEvent + offsetof(DBEvent,blob), dbe->cbBlob, NULL), dbe->cbBlob, key);
+}
+
+void CDdxMmapSA::DecodeEvent(HANDLE hEvent)
+{
+ DBEvent *dbe = (DBEvent*)DBRead((DWORD)hEvent,sizeof(DBEvent),NULL);
+ if (dbe->signature = DBEVENT_SIGNATURE)
+ CryptoEngine->DecryptMem(DBRead((DWORD)hEvent + offsetof(DBEvent,blob), dbe->cbBlob, NULL), dbe->cbBlob, key);
+}
+
+void CDdxMmapSA::EncodeContactEvents(HANDLE hContact)
+{
+ HANDLE hEvent = FindFirstEvent(hContact);
+ while (hEvent != 0) {
+ EncodeEvent(hEvent);
+ hEvent = FindNextEvent(hEvent);
+ }
+}
+
+void CDdxMmapSA::DecodeContactEvents(HANDLE hContact)
+{
+ HANDLE hEvent = FindFirstEvent(hContact);
+ while (hEvent != 0) {
+ DecodeEvent(hEvent);
+ hEvent = FindNextEvent(hEvent);
+ }
+}