void CDbxKV::FillContacts() { m_contactCount = 0; ham_key_t key = { 0 }; ham_record_t rec = { 0 }; cursor_ptr cursor(m_dbContacts); if (ham_cursor_move(cursor, &key, &rec, HAM_CURSOR_FIRST) != HAM_SUCCESS) // empty table? return; do { DBContact *dbc = (DBContact*)rec.data; if (dbc->dwSignature != DBCONTACT_SIGNATURE) DatabaseCorruption(NULL); DBCachedContact *cc = m_cache->AddContactToCache(*(DWORD*)key.data); cc->dbc.dwSignature = DBCONTACT_SIGNATURE; cc->dbc.dwEventCount = dbc->dwEventCount; cc->dbc.dwFirstUnread = dbc->dwFirstUnread; cc->dbc.tsFirstUnread = dbc->tsFirstUnread; CheckProto(cc, ""); m_dwMaxContactId = cc->contactID+1; m_contactCount++; DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(cc->contactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); cc->pSubs[i] = (0 != GetContactSetting(cc->contactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal; } } cc->nDefault = (0 != GetContactSetting(cc->contactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal; cc->parentID = (0 != GetContactSetting(cc->contactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; } while (ham_cursor_move(cursor, &key, &rec, HAM_CURSOR_NEXT) == HAM_SUCCESS); }
void CDbxKyoto::FillContacts() { m_contactCount = 0; size_t size; cursor_ptr cursor(m_dbContacts); for (cursor->jump(); cursor->step();) { const char *pRec, *pKey = cursor->get(&size, &pRec, &size); DBContact *dbc = (DBContact*)pRec; if (dbc->dwSignature != DBCONTACT_SIGNATURE) DatabaseCorruption(NULL); DBCachedContact *cc = m_cache->AddContactToCache(*(DWORD*)pKey); cc->dbc.dwSignature = DBCONTACT_SIGNATURE; cc->dbc.dwEventCount = dbc->dwEventCount; cc->dbc.dwFirstUnread = dbc->dwFirstUnread; cc->dbc.tsFirstUnread = dbc->tsFirstUnread; CheckProto(cc, ""); m_dwMaxContactId = cc->contactID+1; m_contactCount++; DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(cc->contactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); cc->pSubs[i] = (0 != GetContactSetting(cc->contactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal; } } cc->nDefault = (0 != GetContactSetting(cc->contactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal; cc->parentID = (0 != GetContactSetting(cc->contactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; delete[] pKey; } }
void CDb3Mmap::FillContacts() { OBJLIST<COldMeta> arMetas(10, NumericKeySortT); for (DWORD dwOffset = m_dbHeader.ofsFirstContact; dwOffset != 0;) { DBContact *p = (DBContact*)DBRead(dwOffset, NULL); if (p->signature != DBCONTACT_SIGNATURE) break; DWORD dwContactID; if (m_dbHeader.version >= DB_095_VERSION) { dwContactID = p->dwContactID; if (dwContactID > m_dwMaxContactId) m_dwMaxContactId = dwContactID + 1; } else dwContactID = m_dwMaxContactId++; DBCachedContact *cc = m_cache->AddContactToCache(dwContactID); cc->dwDriverData = dwOffset; CheckProto(cc, ""); DBVARIANT dbv; dbv.type = DBVT_DWORD; cc->nSubs = (0 != GetContactSetting(dwContactID, META_PROTO, "NumContacts", &dbv)) ? -1 : dbv.dVal; if (cc->nSubs != -1) { cc->pSubs = (MCONTACT*)mir_alloc(cc->nSubs*sizeof(MCONTACT)); for (int i = 0; i < cc->nSubs; i++) { char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", i); cc->pSubs[i] = (0 != GetContactSetting(dwContactID, META_PROTO, setting, &dbv)) ? NULL : dbv.dVal; } } cc->nDefault = (0 != GetContactSetting(dwContactID, META_PROTO, "Default", &dbv)) ? -1 : dbv.dVal; cc->parentID = (0 != GetContactSetting(dwContactID, META_PROTO, "ParentMeta", &dbv)) ? NULL : dbv.dVal; // whether we need conversion or not if (!GetContactSetting(dwContactID, META_PROTO, "MetaID", &dbv)) arMetas.insert(new COldMeta(dbv.dVal, cc)); dwOffset = p->ofsNext; } // no need in conversion? quit then if (m_bReadOnly || arMetas.getCount() == 0) return; DBVARIANT dbv; dbv.type = DBVT_DWORD; for (MCONTACT hh = FindFirstContact(); hh; hh = FindNextContact(hh)) { if (GetContactSetting(hh, META_PROTO, "MetaLink", &dbv)) continue; COldMeta *p = arMetas.find((COldMeta*)&dbv.dVal); if (p == NULL) continue; if (GetContactSetting(hh, META_PROTO, "ContactNumber", &dbv)) continue; DBCONTACTWRITESETTING dbws = { META_PROTO }; dbws.value.type = DBVT_DWORD; DBCachedContact *ccMeta = p->cc; if (int(dbv.dVal) < ccMeta->nSubs) { ccMeta->pSubs[dbv.dVal] = hh; char setting[100]; mir_snprintf(setting, SIZEOF(setting), "Handle%d", dbv.dVal); dbws.szSetting = setting; dbws.value.dVal = hh; WriteContactSetting(ccMeta->contactID, &dbws); } // store contact id instead of the old mc number dbws.szSetting = "ParentMeta"; dbws.value.dVal = ccMeta->contactID; WriteContactSetting(hh, &dbws); // wipe out old data from subcontacts DeleteContactSetting(hh, META_PROTO, "ContactNumber"); DeleteContactSetting(hh, META_PROTO, "MetaLink"); } for (int i = 0; i < arMetas.getCount(); i++) { COldMeta &p = arMetas[i]; DBCachedContact *ccMeta = p.cc; MCONTACT hContact = ccMeta->contactID; // we don't need it anymore if (!GetContactSetting(hContact, META_PROTO, "MetaID", &dbv)) { DeleteContactSetting(hContact, META_PROTO, "MetaID"); WipeContactHistory((DBContact*)DBRead(ccMeta->dwDriverData, NULL)); } for (int k = 0; k < ccMeta->nSubs; k++) { DBCachedContact *ccSub = m_cache->GetCachedContact(ccMeta->pSubs[k]); if (ccSub) { ccSub->parentID = hContact; MetaMergeHistory(ccMeta, ccSub); } } } }
int CDbxKyoto::InitCrypt() { CRYPTO_PROVIDER *pProvider; bool bMissingKey = false; DBVARIANT dbv = { 0 }; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "Provider", &dbv)) { LBL_CreateProvider: CRYPTO_PROVIDER **ppProvs; int iNumProvs; Crypto_EnumProviders(&iNumProvs, &ppProvs); if (iNumProvs == 0) return 1; pProvider = ppProvs[0]; //!!!!!!!!!!!!!!!!!! DBCONTACTWRITESETTING dbcws = { "CryptoEngine", "Provider" }; dbcws.value.type = DBVT_BLOB; dbcws.value.pbVal = (PBYTE)pProvider->pszName; dbcws.value.cpbVal = (int)strlen(pProvider->pszName) + 1; WriteContactSetting(NULL, &dbcws); } else { if (dbv.type != DBVT_BLOB) { // old version, clean it up bMissingKey = true; goto LBL_CreateProvider; } pProvider = Crypto_GetProvider(LPCSTR(dbv.pbVal)); FreeVariant(&dbv); if (pProvider == NULL) goto LBL_CreateProvider; } if ((m_crypto = pProvider->pFactory()) == NULL) return 3; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "StoredKey", &dbv)) { bMissingKey = true; LBL_SetNewKey: m_crypto->generateKey(); // unencrypted key StoreKey(); } else { size_t iKeyLength = m_crypto->getKeyLength(); if (dbv.cpbVal != (WORD)iKeyLength) goto LBL_SetNewKey; if (!m_crypto->setKey(dbv.pbVal, iKeyLength)) if (!EnterPassword(dbv.pbVal, iKeyLength)) // password protected? return 4; FreeVariant(&dbv); } if (bMissingKey) EnumModuleNames(sttModuleEnum, this); dbv.type = DBVT_BYTE; if (!GetContactSetting(NULL, "CryptoEngine", "DatabaseEncryption", &dbv)) m_bEncrypted = dbv.bVal != 0; InitDialogs(); return 0; }
int CDb3Mmap::InitCrypt() { if (m_dbHeader.version == DB_OLD_VERSION) return 0; CRYPTO_PROVIDER *pProvider; bool bMissingKey = false; DBVARIANT dbv = { 0 }; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "Provider", &dbv)) { LBL_CreateProvider: CRYPTO_PROVIDER **ppProvs; int iNumProvs; Crypto_EnumProviders(&iNumProvs, &ppProvs); if (iNumProvs == 0) return 1; if (iNumProvs > 1) { CSelectCryptoDialog dlg(ppProvs, iNumProvs); dlg.DoModal(); pProvider = dlg.GetSelected(); } else pProvider = ppProvs[0]; DBCONTACTWRITESETTING dbcws = { "CryptoEngine", "Provider" }; dbcws.value.type = DBVT_BLOB; dbcws.value.pbVal = (PBYTE)pProvider->pszName; dbcws.value.cpbVal = (int)mir_strlen(pProvider->pszName) + 1; WriteContactSetting(NULL, &dbcws); } else { if (dbv.type != DBVT_BLOB) { // old version, clean it up bMissingKey = true; goto LBL_CreateProvider; } pProvider = Crypto_GetProvider(LPCSTR(dbv.pbVal)); FreeVariant(&dbv); if (pProvider == NULL) goto LBL_CreateProvider; } if ((m_crypto = pProvider->pFactory()) == NULL) return 3; dbv.type = DBVT_BLOB; if (GetContactSetting(NULL, "CryptoEngine", "StoredKey", &dbv)) { bMissingKey = true; LBL_SetNewKey: m_crypto->generateKey(); // unencrypted key StoreKey(); } else { size_t iKeyLength = m_crypto->getKeyLength(); if (dbv.cpbVal != (WORD)iKeyLength) goto LBL_SetNewKey; if (!m_crypto->setKey(dbv.pbVal, iKeyLength)) { if (memcmp(m_dbHeader.signature, &dbSignatureE, sizeof(m_dbHeader.signature))) goto LBL_SetNewKey; if (!EnterPassword(dbv.pbVal, iKeyLength)) { // password protected? if (m_dbHeader.version >= DB_094_VERSION) return 4; // one of the early used version of mmap was replaced then by mmap_sa // simply remove old badly generated key bMissingKey = true; goto LBL_SetNewKey; } } FreeVariant(&dbv); } if (bMissingKey) EnumModuleNames(sttModuleEnum, this); dbv.type = DBVT_BYTE; if (!GetContactSetting(NULL, "CryptoEngine", "DatabaseEncryption", &dbv)) m_bEncrypted = dbv.bVal != 0; InitDialogs(); return 0; }