pwmanager.cpp
来自「一款密码保险箱源码」· C++ 代码 · 共 2,201 行 · 第 1/5 页
CPP
2,201 行
void CPwManager::_DeleteGroupList(BOOL bFreeStrings)
{
unsigned long uCurrentGroup;
if(m_pGroups == NULL) return; // Nothing to delete
if(bFreeStrings == TRUE)
{
for(uCurrentGroup = 0; uCurrentGroup < m_dwNumGroups; uCurrentGroup++)
{
SAFE_DELETE_ARRAY(m_pGroups[uCurrentGroup].pszGroupName);
}
}
if(m_dwNumGroups != 0)
{
mem_erase((unsigned char *)m_pGroups,
sizeof(PW_GROUP) * m_dwNumGroups);
}
SAFE_DELETE_ARRAY(m_pGroups);
m_dwNumGroups = 0;
m_dwMaxGroups = 0;
}
DWORD CPwManager::GetNumberOfEntries() const
{
return m_dwNumEntries;
}
DWORD CPwManager::GetNumberOfGroups() const
{
return m_dwNumGroups;
}
PW_ENTRY *CPwManager::GetEntry(DWORD dwIndex)
{
// ASSERT(dwIndex < m_dwNumEntries);
if(dwIndex >= m_dwNumEntries) return NULL;
return &m_pEntries[dwIndex];
}
PW_ENTRY *CPwManager::GetEntryByGroup(DWORD idGroup, DWORD dwIndex)
{
DWORD dwPos;
ASSERT(idGroup != DWORD_MAX);
if(idGroup == DWORD_MAX) return NULL;
ASSERT(dwIndex < m_dwNumEntries);
if(dwIndex >= m_dwNumEntries) return NULL;
dwPos = GetEntryByGroupN(idGroup, dwIndex);
if(dwPos != DWORD_MAX) return &m_pEntries[dwPos];
ASSERT(FALSE);
return NULL;
}
DWORD CPwManager::GetEntryByGroupN(DWORD idGroup, DWORD dwIndex) const
{
DWORD uCurrentEntry, uEntryInGroupCounter = 0;
ASSERT(idGroup != DWORD_MAX);
if(idGroup == DWORD_MAX) return DWORD_MAX;
ASSERT(dwIndex < m_dwNumEntries);
if(dwIndex >= m_dwNumEntries) return DWORD_MAX;
for(uCurrentEntry = 0; uCurrentEntry < m_dwNumEntries; uCurrentEntry++)
if(idGroup == m_pEntries[uCurrentEntry].uGroupId)
{
if(dwIndex == uEntryInGroupCounter) return uCurrentEntry;
uEntryInGroupCounter++;
}
return DWORD_MAX;
}
PW_ENTRY *CPwManager::GetEntryByUuid(const BYTE *pUuid)
{
ASSERT(pUuid != NULL); if(pUuid == NULL) return NULL;
DWORD dwEntryIndex = GetEntryByUuidN(pUuid);
// ASSERT(dwEntryIndex != DWORD_MAX); // Do not assert!
if(dwEntryIndex == DWORD_MAX) return NULL;
return &m_pEntries[dwEntryIndex];
}
DWORD CPwManager::GetEntryByUuidN(const BYTE *pUuid) const
{
ASSERT(pUuid != NULL); if(pUuid == NULL) return DWORD_MAX;
for(DWORD dw = 0; dw < m_dwNumEntries; dw++)
if(memcmp(m_pEntries[dw].uuid, pUuid, 16) == 0) return dw;
// Don't ASSERT here, just return DWORD_MAX
return DWORD_MAX;
}
DWORD CPwManager::GetEntryPosInGroup(__in_ecount(1) const PW_ENTRY *pEntry) const
{
DWORD uCurrentEntry, pos = 0;
ASSERT(pEntry != NULL); if(pEntry == NULL) return DWORD_MAX;
for(uCurrentEntry = 0; uCurrentEntry < m_dwNumEntries; uCurrentEntry++)
if(m_pEntries[uCurrentEntry].uGroupId == pEntry->uGroupId)
{
if(memcmp(m_pEntries[uCurrentEntry].uuid, pEntry->uuid, 16) == 0)
return pos;
pos++;
}
return DWORD_MAX;
}
PW_ENTRY *CPwManager::GetLastEditedEntry()
{
return m_pLastEditedEntry;
}
PW_GROUP *CPwManager::GetGroup(DWORD dwIndex)
{
ASSERT(dwIndex < m_dwNumGroups);
if(dwIndex >= m_dwNumGroups) return NULL;
return &m_pGroups[dwIndex];
}
PW_GROUP *CPwManager::GetGroupById(DWORD idGroup)
{
DWORD dwIndex = GetGroupByIdN(idGroup);
if(dwIndex == DWORD_MAX) return NULL;
return &m_pGroups[dwIndex];
}
DWORD CPwManager::GetGroupByIdN(DWORD idGroup) const
{
DWORD uCurrentEntry;
for(uCurrentEntry = 0; uCurrentEntry < m_dwNumGroups; uCurrentEntry++)
if(m_pGroups[uCurrentEntry].uGroupId == idGroup)
return uCurrentEntry;
return DWORD_MAX;
}
DWORD CPwManager::GetGroupId(const TCHAR *pszGroupName) const
{
DWORD i;
ASSERT(pszGroupName != NULL); if(pszGroupName == NULL) return DWORD_MAX;
for(i = 0; i < m_dwNumGroups; i++)
{
if(_tcsicmp(m_pGroups[i].pszGroupName, pszGroupName) == 0)
return m_pGroups[i].uGroupId;
}
return DWORD_MAX;
}
DWORD CPwManager::GetGroupIdByIndex(DWORD uGroupIndex) const
{
if(uGroupIndex >= m_dwNumGroups) return DWORD_MAX;
return m_pGroups[uGroupIndex].uGroupId;
}
DWORD CPwManager::GetNumberOfItemsInGroup(const TCHAR *pszGroup) const
{
ASSERT(pszGroup != NULL); if(pszGroup == NULL) return 0;
return GetNumberOfItemsInGroupN(GetGroupId(pszGroup));
}
DWORD CPwManager::GetNumberOfItemsInGroupN(DWORD idGroup) const
{
ASSERT(idGroup != DWORD_MAX);
if(idGroup == DWORD_MAX) return 0;
DWORD n = 0;
for(DWORD i = 0; i < m_dwNumEntries; i++)
if(m_pEntries[i].uGroupId == idGroup) n++;
return n;
}
BOOL CPwManager::AddEntry(__in_ecount(1) const PW_ENTRY *pTemplate)
{
PW_ENTRY pT;
// Don't ASSERT_ENTRY the pTemplate!
ASSERT(pTemplate != NULL); if(pTemplate == NULL) return FALSE;
ASSERT((pTemplate->uGroupId != 0) && (pTemplate->uGroupId != DWORD_MAX));
if((pTemplate->uGroupId == 0) || (pTemplate->uGroupId == DWORD_MAX)) return FALSE;
// If we don't have enough allocated entries, allocate 32 more
if(m_dwNumEntries == m_dwMaxEntries)
_AllocEntries(m_dwMaxEntries + 32);
pT = *pTemplate; // Copy parameter to local temporary variable
if(memcmp(pT.uuid, g_uuidZero, 16) == 0) // Shall we create a new UUID?
{
randCreateUUID(pT.uuid, &m_random); // Create it!
ASSERT(GetEntryByUuidN(pT.uuid) == DWORD_MAX);
}
// Map NULL pointers to valid pointers to a zero-length string
if(pT.pszTitle == NULL) pT.pszTitle = (TCHAR *)g_pNullString;
if(pT.pszUserName == NULL) pT.pszUserName = (TCHAR *)g_pNullString;
if(pT.pszURL == NULL) pT.pszURL = (TCHAR *)g_pNullString;
if(pT.pszPassword == NULL) pT.pszPassword = (TCHAR *)g_pNullString;
if(pT.pszAdditional == NULL) pT.pszAdditional = (TCHAR *)g_pNullString;
if(pT.pszBinaryDesc == NULL) pT.pszBinaryDesc = (TCHAR *)g_pNullString;
m_dwNumEntries++;
return SetEntry(m_dwNumEntries - 1, &pT);
}
BOOL CPwManager::AddGroup(__in_ecount(1) const PW_GROUP *pTemplate)
{
PW_GROUP pT;
DWORD i, t = 0, b;
ASSERT(pTemplate != NULL); if(pTemplate == NULL) return FALSE;
pT = *pTemplate; // Copy parameter to local temporary variable
if((pT.uGroupId == 0) || (pT.uGroupId == DWORD_MAX))
{
while(1) // Generate a new group ID that doesn't exist already
{
b = 0;
t = randXorShift();
if((t == 0) || (t == DWORD_MAX)) continue;
for(i = 0; i < m_dwNumGroups; i++)
{
if(m_pGroups[i].uGroupId == t) b = 1;
}
if(b == 0) break;
}
}
else t = pT.uGroupId;
pT.uGroupId = t;
if(m_dwNumGroups == m_dwMaxGroups)
_AllocGroups(m_dwMaxGroups + 8);
m_dwNumGroups++;
return SetGroup(m_dwNumGroups - 1, &pT);
}
BOOL CPwManager::SetGroup(DWORD dwIndex, __in_ecount(1) const PW_GROUP *pTemplate)
{
ASSERT(dwIndex < m_dwNumGroups);
ASSERT(pTemplate != NULL);
ASSERT((pTemplate->uGroupId != 0) && (pTemplate->uGroupId != DWORD_MAX));
if((pTemplate->uGroupId == 0) || (pTemplate->uGroupId == DWORD_MAX)) return FALSE;
SAFE_DELETE_ARRAY(m_pGroups[dwIndex].pszGroupName);
m_pGroups[dwIndex].pszGroupName = _TcsSafeDupAlloc(pTemplate->pszGroupName);
m_pGroups[dwIndex].uGroupId = pTemplate->uGroupId;
m_pGroups[dwIndex].uImageId = pTemplate->uImageId;
m_pGroups[dwIndex].usLevel = pTemplate->usLevel;
m_pGroups[dwIndex].dwFlags = pTemplate->dwFlags;
m_pGroups[dwIndex].tCreation = pTemplate->tCreation;
m_pGroups[dwIndex].tLastMod = pTemplate->tLastMod;
m_pGroups[dwIndex].tLastAccess = pTemplate->tLastAccess;
m_pGroups[dwIndex].tExpire = pTemplate->tExpire;
return TRUE;
}
BOOL CPwManager::DeleteEntry(DWORD dwIndex)
{
DWORD i;
ASSERT(dwIndex < m_dwNumEntries); if(dwIndex >= m_dwNumEntries) return FALSE;
ASSERT_ENTRY(&m_pEntries[dwIndex]);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszTitle);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszURL);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszUserName);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszPassword);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszAdditional);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszBinaryDesc);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pBinaryData);
if(dwIndex != (m_dwNumEntries - 1))
{
for(i = dwIndex; i < (m_dwNumEntries - 1); i++)
{
m_pEntries[i] = m_pEntries[i+1];
}
}
mem_erase((unsigned char *)&m_pEntries[m_dwNumEntries - 1], sizeof(PW_ENTRY));
m_dwNumEntries--;
return TRUE;
}
BOOL CPwManager::DeleteGroupById(DWORD uGroupId)
{
DWORD i = 0, inx;
PW_ENTRY *p;
ASSERT(GetGroupById(uGroupId) != NULL);
if(m_dwNumEntries != 0)
{
while(1) // Remove all items in that group
{
p = &m_pEntries[i];
if(p->uGroupId == uGroupId)
{
VERIFY(DeleteEntry(i));
i--;
}
i++;
if(i >= m_dwNumEntries) break;
}
}
inx = GetGroupByIdN(uGroupId);
SAFE_DELETE_ARRAY(m_pGroups[inx].pszGroupName);
if(inx != (m_dwNumGroups - 1))
{
for(i = inx; i < (m_dwNumGroups - 1); i++)
{
m_pGroups[i] = m_pGroups[i + 1];
}
}
mem_erase((unsigned char *)&m_pGroups[m_dwNumGroups - 1], sizeof(PW_GROUP));
m_dwNumGroups--;
FixGroupTree();
return TRUE;
}
BOOL CPwManager::SetEntry(DWORD dwIndex, __in_ecount(1) const PW_ENTRY *pTemplate)
{
DWORD slen;
ASSERT(dwIndex < m_dwNumEntries);
if(dwIndex >= m_dwNumEntries) return FALSE;
ASSERT_ENTRY(pTemplate);
if(pTemplate == NULL) return FALSE;
ASSERT((pTemplate->uGroupId != 0) && (pTemplate->uGroupId != DWORD_MAX));
if((pTemplate->uGroupId == 0) || (pTemplate->uGroupId == DWORD_MAX)) return FALSE;
if(pTemplate->pszTitle == NULL) return FALSE;
if(pTemplate->pszUserName == NULL) return FALSE;
if(pTemplate->pszURL == NULL) return FALSE;
if(pTemplate->pszPassword == NULL) return FALSE;
if(pTemplate->pszAdditional == NULL) return FALSE;
memcpy(m_pEntries[dwIndex].uuid, pTemplate->uuid, 16);
m_pEntries[dwIndex].uGroupId = pTemplate->uGroupId;
m_pEntries[dwIndex].uImageId = pTemplate->uImageId;
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszTitle);
m_pEntries[dwIndex].pszTitle = _TcsSafeDupAlloc(pTemplate->pszTitle);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszUserName);
m_pEntries[dwIndex].pszUserName = _TcsSafeDupAlloc(pTemplate->pszUserName);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszURL);
m_pEntries[dwIndex].pszURL = _TcsSafeDupAlloc(pTemplate->pszURL);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszPassword);
m_pEntries[dwIndex].pszPassword = _TcsSafeDupAlloc(pTemplate->pszPassword);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszAdditional);
m_pEntries[dwIndex].pszAdditional = _TcsSafeDupAlloc(pTemplate->pszAdditional);
if(!((m_pEntries[dwIndex].pBinaryData == pTemplate->pBinaryData) && (m_pEntries[dwIndex].pszBinaryDesc == pTemplate->pszBinaryDesc)))
{
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pszBinaryDesc);
m_pEntries[dwIndex].pszBinaryDesc = _TcsSafeDupAlloc(pTemplate->pszBinaryDesc);
SAFE_DELETE_ARRAY(m_pEntries[dwIndex].pBinaryData);
slen = pTemplate->uBinaryDataLen;
if((pTemplate->pBinaryData != NULL) && (slen != 0))
{
m_pEntries[dwIndex].pBinaryData = new BYTE[slen];
memcpy(m_pEntries[dwIndex].pBinaryData, pTemplate->pBinaryData, slen);
}
else
m_pEntries[dwIndex].pBinaryData = NULL;
m_pEntries[dwIndex].uBinaryDataLen = pTemplate->uBinaryDataLen;
if(m_pEntries[dwIndex].pBinaryData == NULL) m_pEntries[dwIndex].uBinaryDataLen = 0;
}
m_pEntries[dwIndex].uPasswordLen =
static_cast<DWORD>(_tcslen(m_pEntries[dwIndex].pszPassword));
LockEntryPassword(&m_pEntries[dwIndex]);
m_pEntries[dwIndex].tCreation = pTemplate->tCreation;
m_pEntries[dwIndex].tLastMod = pTemplate->tLastMod;
m_pEntries[dwIndex].tLastAccess = pTemplate->tLastAccess;
m_pEntries[dwIndex].tExpire = pTemplate->tExpire;
if(m_pEntries[dwIndex].pszBinaryDesc == NULL)
{
ASSERT(FALSE);
m_pEntries[dwIndex].pszBinaryDesc = _TcsSafeDupAlloc(NULL);
}
ASSERT_ENTRY(&m_pEntries[dwIndex]);
m_pLastEditedEntry = &m_pEntries[dwIndex];
return TRUE;
}
void CPwManager::LockEntryPassword(__inout_ecount(1) PW_ENTRY *pEntry)
{
ASSERT_ENTRY(pEntry); if(pEntry == NULL) return;
ASSERT(pEntry->pszPassword != NULL); if(pEntry->pszPassword == NULL) return;
if(pEntry->uPasswordLen != 0)
ARCFourCrypt((BYTE *)pEntry->pszPassword, pEntry->uPasswordLen * sizeof(TCHAR),
m_pSessionKey, PWM_SESSION_KEY_SIZE);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?