TEST_F(FileV4Test, CoreRWTest) { PWScore core; const StringX passkey(L"3rdMambo"); fullItem.SetAttUUID(attItem.GetUUID()); EXPECT_EQ(0U, attItem.GetRefcount()); core.SetPassKey(passkey); core.Execute(AddEntryCommand::Create(&core, fullItem, pws_os::CUUID::NullUUID(), &attItem)); EXPECT_TRUE(core.HasAtt(attItem.GetUUID())); EXPECT_EQ(1U, core.GetAtt(attItem.GetUUID()).GetRefcount()); EXPECT_EQ(PWSfile::SUCCESS, core.WriteFile(fname.c_str(), PWSfile::V40)); core.ClearDBData(); EXPECT_EQ(PWSfile::FAILURE, core.ReadFile(fname.c_str(), L"WrongPassword", true)); EXPECT_EQ(PWSfile::SUCCESS, core.ReadFile(fname.c_str(), passkey, true)); ASSERT_EQ(1, core.GetNumEntries()); ASSERT_EQ(1, core.GetNumAtts()); ASSERT_TRUE(core.Find(fullItem.GetUUID()) != core.GetEntryEndIter()); const CItemData readFullItem = core.GetEntry(core.Find(fullItem.GetUUID())); EXPECT_TRUE(readFullItem.HasAttRef()); EXPECT_EQ(attItem.GetUUID(), readFullItem.GetAttUUID()); EXPECT_EQ(fullItem, readFullItem); ASSERT_TRUE(core.HasAtt(attItem.GetUUID())); EXPECT_EQ(1U, core.GetAtt(attItem.GetUUID()).GetRefcount()); core.Execute(DeleteEntryCommand::Create(&core, readFullItem)); ASSERT_EQ(0, core.GetNumEntries()); ASSERT_EQ(0, core.GetNumAtts()); // Get core to delete any existing commands core.ClearCommands(); }
bool PWSFilterManager::PassesAttFiltering(const CItemData *pci, const PWScore &core) const { bool thistest_rc; const bool bPresent = pci->HasAttRef(); bool bValue(false); for (auto group_iter = m_vAflgroups.begin(); group_iter != m_vAflgroups.end(); group_iter++) { const vfiltergroup &group = *group_iter; int tests(0); bool thisgroup_rc = false; for (auto num_iter = group.begin(); num_iter != group.end(); num_iter++) { const int &num = *num_iter; if (num == -1) // Padding for FT_PWHIST & FT_POLICY - shouldn't happen here continue; const st_FilterRow &st_fldata = m_currentfilter.vAfldata.at(num); thistest_rc = false; PWSMatch::MatchType mt(PWSMatch::MT_INVALID); const FieldType ft = st_fldata.ftype; switch (ft) { case AT_PRESENT: bValue = bPresent; mt = PWSMatch::MT_BOOL; break; case AT_TITLE: case AT_FILENAME: case AT_FILEPATH: case AT_MEDIATYPE: mt = PWSMatch::MT_STRING; break; case AT_CTIME: case AT_FILECTIME: case AT_FILEMTIME: case AT_FILEATIME: mt = PWSMatch::MT_DATE; break; default: ASSERT(0); } const int ifunction = (int)st_fldata.rule; switch (mt) { case PWSMatch::MT_BOOL: thistest_rc = PWSMatch::Match(bValue, ifunction); tests++; break; case PWSMatch::MT_STRING: if (bPresent) { const CItemAtt &att = core.GetAtt(pci->GetAttUUID()); thistest_rc = att.Matches(st_fldata.fstring.c_str(), (int)ft, st_fldata.fcase ? -ifunction : ifunction); } else { thistest_rc = false; } tests++; break; case PWSMatch::MT_DATE: if (bPresent) { const CItemAtt &att = core.GetAtt(pci->GetAttUUID()); time_t t1(st_fldata.fdate1), t2(st_fldata.fdate2); if (st_fldata.fdatetype == 1 /* Relative */) { time_t now; time(&now); t1 = now + (st_fldata.fnum1 * 86400); if (ifunction == PWSMatch::MR_BETWEEN) t2 = now + (st_fldata.fnum2 * 86400); } thistest_rc = att.Matches(t1, t2, (int)ft, ifunction); } else { thistest_rc = false; } tests++; break; default: ASSERT(0); } if (tests <= 1) thisgroup_rc = thistest_rc; else { //Within groups, tests are always "AND" connected thisgroup_rc = thistest_rc && thisgroup_rc; } } // This group of tests completed - // if 'thisgroup_rc == true', leave now; else go on to next group if (thisgroup_rc) return true; } // We finished all the groups and haven't found one that is true - exclude entry. return false; }