Example #1
0
    def test_import_entry(self):

        name = 'testimport1'
        url = 'http://www.launchpad.net/pasaffe'
        user = '******'
        password = '******'
        note = "This is a note"

        rc = subprocess.call([
            'bin/pasaffe-import-entry', '-q', '-f', self.test_db, '-m',
            'pasaffe', '-e', name, '-l', url, '-u', user, '-p', password, '-n',
            note
        ])

        self.assertEqual(rc, 0)

        passfile = PassSafeFile(self.test_db, 'pasaffe')
        self.assertEqual(len(passfile.records), 4)

        # Locate the new entry
        for uuid in passfile.records:
            if passfile.records[uuid][3] == name:
                break

        self.assertEqual(passfile.records[uuid][3], name)
        self.assertEqual(passfile.records[uuid][4], user)
        self.assertEqual(passfile.records[uuid][5], note)
        self.assertEqual(passfile.records[uuid][6], password)
        self.assertEqual(passfile.records[uuid][13], url)
 def setUp(self):
     self.tempdir = tempfile.mkdtemp()
     self.imported_db = os.path.join(self.tempdir, 'imported.psafe3')
     subprocess.call(['bin/pasaffe-import-figaroxml', '-q',
                      '-f', './tests/databases/figaro-079.xml',
                      '-d', self.imported_db,
                      '-y', '-m', 'pasaffe'])
     self.passfile = PassSafeFile(self.imported_db, 'pasaffe')
Example #3
0
def create_test_db():
    passfile = PassSafeFile()
    passfile.new_db('pasaffe')

    entries, empty_folders = get_test_data()

    for entry in entries:
        uuid = passfile.new_entry()
        for key in entry.keys():
            passfile.records[uuid][key] = entry[key]

    for folder in empty_folders:
        passfile.add_empty_folder(folder)

    return passfile
Example #4
0
 def test_orig_db(self):
     passfile = PassSafeFile(self.test_db, 'pasaffe')
     self.assertEqual(len(passfile.records), 3)
 def setUp(self):
     self.passfile = PassSafeFile(
         './tests/databases/pw-gorilla-1537.psafe3', 'pasaffe')
class TestPasswordGorilla1537(unittest.TestCase):
    def setUp(self):
        self.passfile = PassSafeFile(
            './tests/databases/pw-gorilla-1537.psafe3', 'pasaffe')

    def test_num_entries(self):
        self.assertEqual(len(self.passfile.records), 6)

    def test_empty_folders(self):
        # This version of Password Gorilla doesn't save empty folders
        self.assertEqual(len(self.passfile.empty_folders), 0)

    def test_get_database_version_string(self):
        self.assertEqual(self.passfile.get_database_version_string(), "03.00")

    def test_get_database_uuid(self):
        self.assertEqual(self.passfile.header[1],
                         b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
                         b'\x00\x00\x00\x00\x00')

    def test_get_saved_name(self):
        self.assertEqual(self.passfile.get_saved_name(), None)

    def test_get_saved_host(self):
        self.assertEqual(self.passfile.get_saved_host(), None)

    def test_get_saved_application(self):
        self.assertEqual(self.passfile.get_saved_application(), None)

    def test_get_saved_date_string(self):
        self.assertEqual(self.passfile.get_saved_date_string(), None)

    def test_entry_1(self):
        uuid = '009eeceaad754732634e37d2f70b0985'
        self.assertEqual(self.passfile.records[uuid][2], 'top\\.withdot')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['top.withdot'])
        self.assertEqual(self.passfile.records[uuid][3], 'insidedot')
        self.assertEqual(self.passfile.records[uuid][4], 'usernamedot')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'passworddot')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Sat, 25 Oct 2014 15:05:30')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:05:30')

    def test_entry_2(self):
        uuid = 'd68cee64c2794300561837e248abddd1'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'toplevel1')
        self.assertEqual(self.passfile.records[uuid][4], 'usernametop')
        self.assertEqual(self.passfile.records[uuid][5], 'This is a note')
        self.assertEqual(self.passfile.records[uuid][6], 'passwordtop')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Sat, 25 Oct 2014 15:04:48')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:04:48')

    def test_entry_3(self):
        uuid = '8e869cc656a942fd7beecf36605140d8'
        self.assertEqual(self.passfile.records[uuid][2],
                         'topgroup1.topgroup2.topgroup3')
        self.assertEqual(self.passfile.get_folder_list(uuid),
                         ['topgroup1', 'topgroup2', 'topgroup3'])
        self.assertEqual(self.passfile.records[uuid][3], 'entrylevel3')
        self.assertEqual(self.passfile.records[uuid][4], 'username3')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'password3')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Sat, 25 Oct 2014 15:06:51')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:06:51')

    def test_entry_4(self):
        uuid = '3e317b83f4d645056abc5526f9c1f7e6'
        self.assertEqual(self.passfile.records[uuid][2], 'topgroup1')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['topgroup1'])
        self.assertEqual(self.passfile.records[uuid][3], 'entrylevel1')
        self.assertEqual(self.passfile.records[uuid][4], 'username1')
        self.assertEqual(self.passfile.records[uuid][5],
                         'This is a note\nThis is a second line\n'
                         'Unicode: éléphant')
        self.assertEqual(self.passfile.records[uuid][6], 'password1')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Sat, 25 Oct 2014 15:07:24')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:07:24')

    def test_entry_5(self):
        uuid = '11fbf64e83e240a25e8bb657cea6edcd'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'topnopass')
        self.assertEqual(self.passfile.records[uuid][4], 'topusername')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], '')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         None)
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:07:52')

    def test_entry_6(self):
        uuid = 'd0b7295a7fc447fa4d8c1aa701ba8c30'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'topnouser')
        self.assertEqual(self.passfile.records[uuid][4], '')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'toppassword')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Sat, 25 Oct 2014 15:07:40')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Sat, 25 Oct 2014 15:07:40')
Example #7
0
 def setUp(self):
     self.passfile = PassSafeFile('./tests/databases/pwsafe-331.psafe3',
                                  'pasaffe')
Example #8
0
class TestPasswordSafe331(unittest.TestCase):
    def setUp(self):
        self.passfile = PassSafeFile('./tests/databases/pwsafe-331.psafe3',
                                     'pasaffe')

    def test_num_entries(self):
        self.assertEqual(len(self.passfile.records), 3)

    def test_empty_folders(self):

        empty_folders = [['emptygroup1'], ['emptygroup1', 'emptygroup2'],
                         ['emptygroup1', 'emptygroup2', 'emptygroup3'],
                         ['level1group',
                          'level2group'], ['emptygroup1', 'test'],
                         ['emptygroup1', 'with/slash']]

        empty_fields = [
            'emptygroup1', 'emptygroup1.emptygroup2',
            'emptygroup1.emptygroup2.emptygroup3', 'level1group.level2group',
            'emptygroup1.test', 'emptygroup1.with/slash'
        ]

        self.assertEqual(len(self.passfile.empty_folders), len(empty_fields))
        self.assertEqual(self.passfile.get_empty_folders(), empty_folders)
        self.assertEqual(self.passfile.empty_folders, empty_fields)

    def test_get_database_version_string(self):
        self.assertEqual(self.passfile.get_database_version_string(), "03.0b")

    def test_get_database_uuid(self):
        self.assertEqual(self.passfile.header[1],
                         b'cf\xfe\xea\x00wBU\xa2TM\xc3k\x0f>\x0f')

    def test_get_saved_name(self):
        self.assertEqual(self.passfile.get_saved_name(), "mdeslaur")

    def test_get_saved_host(self):
        self.assertEqual(self.passfile.get_saved_host(), "mdlinux")

    def test_get_saved_application(self):
        self.assertEqual(self.passfile.get_saved_application(),
                         'Password Safe V3.31')

    def test_get_saved_date_string(self):
        self.assertEqual(self.passfile.get_saved_date_string(False),
                         'Thu, 25 Jul 2013 23:57:08')

    def test_entry_1(self):
        uuid = '4a32a8ad616343b692e85c721bfce0e2'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'topentry1')
        self.assertEqual(self.passfile.records[uuid][4], 'username1')
        self.assertEqual(
            self.passfile.records[uuid][5],
            'This is a note\nThis is a second line\n'
            'Unicode: éléphant')
        self.assertEqual(self.passfile.records[uuid][6], 'password1')
        self.assertEqual(self.passfile.get_creation_time(uuid, False),
                         'Thu, 25 Jul 2013 00:21:00')
        self.assertEqual(self.passfile.records[uuid][13],
                         'http://www.example.com')

    def test_entry_2(self):
        uuid = '722328d418584201803a119fa517b799'
        self.assertEqual(self.passfile.records[uuid][2], 'level1group')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['level1group'])
        self.assertEqual(self.passfile.records[uuid][3], 'level1entry')
        self.assertEqual(self.passfile.records[uuid][4], 'username1')
        self.assertEqual(self.passfile.records[uuid][5], 'This is a note\n')
        self.assertEqual(self.passfile.records[uuid][6], 'password1')
        self.assertEqual(self.passfile.get_creation_time(uuid, False),
                         'Thu, 25 Jul 2013 00:25:42')

    def test_entry_3(self):
        uuid = 'cb16d230853247ad8cb12ef6ea615cb4'
        self.assertEqual(self.passfile.records[uuid][2],
                         'level1group.level2group.level3group')
        self.assertEqual(self.passfile.get_folder_list(uuid),
                         ['level1group', 'level2group', 'level3group'])
        self.assertEqual(self.passfile.records[uuid][3], 'level3entry')
        self.assertEqual(self.passfile.records[uuid][4], 'usernamelevel3')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'passwordlevel3')
        self.assertEqual(self.passfile.get_creation_time(uuid, False),
                         'Thu, 25 Jul 2013 00:26:36')
class TestPasswordGorilla15363(unittest.TestCase):
    def setUp(self):
        self.passfile = PassSafeFile(
            './tests/databases/pw-gorilla-15363.psafe3', 'pasaffe')

    def test_num_entries(self):
        self.assertEqual(len(self.passfile.records), 4)

    def test_empty_folders(self):
        # This version of Password Gorilla doesn't save empty folders
        self.assertEqual(len(self.passfile.empty_folders), 0)

    def test_get_database_version_string(self):
        self.assertEqual(self.passfile.get_database_version_string(), "03.00")

    def test_get_database_uuid(self):
        self.assertEqual(
            self.passfile.header[1],
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x00\x00\x00\x00')

    def test_get_saved_name(self):
        self.assertEqual(self.passfile.get_saved_name(), None)

    def test_get_saved_host(self):
        self.assertEqual(self.passfile.get_saved_host(), None)

    def test_get_saved_application(self):
        self.assertEqual(self.passfile.get_saved_application(), None)

    def test_get_saved_date_string(self):
        self.assertEqual(self.passfile.get_saved_date_string(), None)

    def test_entry_1(self):
        uuid = '8642342dfd444e044f50ca8b3b12fd67'
        self.assertEqual(self.passfile.records[uuid][2], 'top\\.withdot')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['top.withdot'])
        self.assertEqual(self.passfile.records[uuid][3], 'insidedot')
        self.assertEqual(self.passfile.records[uuid][4], 'usernamedot')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'passworddot')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Thu, 25 Jul 2013 23:58:56')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Thu, 25 Jul 2013 23:58:56')

    def test_entry_2(self):
        uuid = '666b02ae0f574d4549f8f57ddae70d77'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'toplevel1')
        self.assertEqual(self.passfile.records[uuid][4], 'usernametop')
        self.assertEqual(self.passfile.records[uuid][5], 'This is a note')
        self.assertEqual(self.passfile.records[uuid][6], 'passwordtop')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Thu, 25 Jul 2013 23:58:06')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Thu, 25 Jul 2013 23:58:06')

    def test_entry_3(self):
        uuid = 'aff6f326353f4be86009bf342e0a0af7'
        self.assertEqual(self.passfile.records[uuid][2],
                         'topgroup1.topgroup2.topgroup3')
        self.assertEqual(self.passfile.get_folder_list(uuid),
                         ['topgroup1', 'topgroup2', 'topgroup3'])
        self.assertEqual(self.passfile.records[uuid][3], 'entrylevel3')
        self.assertEqual(self.passfile.records[uuid][4], 'username3')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'password3')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Thu, 25 Jul 2013 00:33:33')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Thu, 25 Jul 2013 00:33:33')

    def test_entry_4(self):
        uuid = '66d1cf5e60dc424d6a3b19c89aed2f1e'
        self.assertEqual(self.passfile.records[uuid][2], 'topgroup1')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['topgroup1'])
        self.assertEqual(self.passfile.records[uuid][3], 'entrylevel1')
        self.assertEqual(self.passfile.records[uuid][4], 'username1')
        self.assertEqual(
            self.passfile.records[uuid][5],
            'This is a note\nThis is a second line\n'
            'Unicode: éléphant')
        self.assertEqual(self.passfile.records[uuid][6], 'password1')
        self.assertEqual(self.passfile.get_password_time(uuid, False),
                         'Thu, 25 Jul 2013 00:33:06')
        self.assertEqual(self.passfile.get_modification_time(uuid, False),
                         'Thu, 25 Jul 2013 00:33:06')
Example #10
0
 def setUp(self):
     self.passfile = PassSafeFile('./tests/databases/passwdsafe-510.psafe3',
                                  'pasaffe')
Example #11
0
class TestPasswdSafeAndroid510(unittest.TestCase):
    def setUp(self):
        self.passfile = PassSafeFile('./tests/databases/passwdsafe-510.psafe3',
                                     'pasaffe')

    def test_num_entries(self):
        self.assertEqual(len(self.passfile.records), 4)

    def test_empty_folders(self):
        self.assertEqual(len(self.passfile.empty_folders), 0)

    def test_get_database_version_string(self):
        self.assertEqual(self.passfile.get_database_version_string(), "03.0d")

    def test_get_database_uuid(self):
        self.assertEqual(self.passfile.header[1],
                         b'b\xfb\x00\x00\x9al2\x13\x05\xb8\xccnh\x81L\xb5')

    def test_get_saved_name(self):
        self.assertEqual(self.passfile.get_saved_name(), 'User')

    def test_get_saved_host(self):
        self.assertEqual(self.passfile.get_saved_host(), 'Galaxy Nexus')

    def test_get_saved_application(self):
        self.assertEqual(self.passfile.get_saved_application(),
                         'PasswdSafe 5.1.0')

    def test_get_saved_date_string(self):
        self.assertEqual(self.passfile.get_saved_date_string(),
                         'Sat, 25 Oct 2014 12:05:42')

    def test_entry_1(self):
        uuid = 'af5304edb06c32131d502487eeb21009'
        self.assertEqual(self.passfile.records[uuid][2], 'Toplevel2')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['Toplevel2'])
        self.assertEqual(self.passfile.records[uuid][3], 'Intoplevel2')
        self.assertEqual(self.passfile.records[uuid][4], 'username')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'password')
        self.assertFalse(8 in self.passfile.records[uuid])
        self.assertFalse(12 in self.passfile.records[uuid])

    def test_entry_2(self):
        uuid = '7f1f06b3a36c3213061dc476b88f83fd'
        self.assertFalse(2 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.get_folder_list(uuid), [])
        self.assertEqual(self.passfile.records[uuid][3], 'Toplevel')
        self.assertEqual(self.passfile.records[uuid][4], 'topuser')
        self.assertEqual(
            self.passfile.records[uuid][5],
            'This is a note\n' + 'This is line 2\n' + 'Unicode: éléphant')
        self.assertEqual(self.passfile.records[uuid][6], 'toppass')
        self.assertFalse(8 in self.passfile.records[uuid])
        self.assertFalse(12 in self.passfile.records[uuid])

    def test_entry_3(self):
        uuid = '82bd036bb86c32130facf0a8e3e3809b'
        self.assertEqual(self.passfile.records[uuid][2], 'Top.withdot')
        self.assertEqual(self.passfile.get_folder_list(uuid),
                         ['Top', 'withdot'])
        self.assertEqual(self.passfile.records[uuid][3], 'Indot')
        self.assertEqual(self.passfile.records[uuid][4], '')
        self.assertFalse(5 in self.passfile.records[uuid])
        self.assertEqual(self.passfile.records[uuid][6], 'password')
        self.assertFalse(8 in self.passfile.records[uuid])
        self.assertFalse(12 in self.passfile.records[uuid])

    def test_entry_4(self):
        uuid = '116301c0aa6c321334769a2131e417c5'
        self.assertEqual(self.passfile.records[uuid][2], 'Toplevel1')
        self.assertEqual(self.passfile.get_folder_list(uuid), ['Toplevel1'])
        self.assertEqual(self.passfile.records[uuid][3], 'Intoplevel1')
        self.assertEqual(self.passfile.records[uuid][4], 'username')
        self.assertEqual(self.passfile.records[uuid][6], 'password')
        self.assertEqual(self.passfile.records[uuid][13],
                         'http://www.example.com')
        self.assertFalse(8 in self.passfile.records[uuid])
        self.assertFalse(12 in self.passfile.records[uuid])
Example #12
0
 def setUp(self):
     self.passfile = PassSafeFile()
Example #13
0
class TestReadDB(unittest.TestCase):
    def setUp(self):
        self.passfile = PassSafeFile()

    def test_folder_list_to_field(self):

        folder_list = [
            [[], ""],
            [["foldera"], "foldera"],
            [["folder.a"], "folder\.a"],  # noqa: W605
            [["foldera."], "foldera\."],  # noqa: W605
            [[".foldera"], "\.foldera"],  # noqa: W605
            [["foldera.", "folderb."], "foldera\..folderb\."],  # noqa: W605
            [["foldera", "folderb"], "foldera.folderb"],
            [["folder.a", "folderb"], "folder\.a.folderb"],  # noqa: W605
            [["foldera", "folder.b"], "foldera.folder\.b"],
            [["folder.a", "folder.b"], "folder\.a.folder\.b"],
            [["folder.a", "folder.b", "folder.c"],
             "folder\.a.folder\.b.folder\.c"],
            [["", "foldera", "folderb"], ".foldera.folderb"],
            [["", "", "folderb"], "..folderb"],
            [["foldera", "", "folderb"], "foldera..folderb"],
            [["foldera", "folderb", ""], "foldera.folderb."],
        ]

        for (folder, field) in folder_list:
            self.assertEqual(self.passfile._folder_list_to_field(folder),
                             field)

    def test_field_to_folder_list(self):

        folder_list = [
            ["", []],
            ["foldera", ["foldera"]],
            ["folder\.a", ["folder.a"]],  # noqa: W605
            ["foldera\.", ["foldera."]],  # noqa: W605
            ["\.foldera", [".foldera"]],  # noqa: W605
            ["foldera\..folderb\.", ["foldera.", "folderb."]],  # noqa: W605
            ["foldera.folderb", ["foldera", "folderb"]],
            ["folder\.a.folderb", ["folder.a", "folderb"]],
            ["foldera.folder\.b", ["foldera", "folder.b"]],
            ["folder\.a.folder\.b", ["folder.a", "folder.b"]],
            [
                "folder\.a.folder\.b.folder\.c",
                ["folder.a", "folder.b", "folder.c"]
            ],
            [".foldera.folderb", ["", "foldera", "folderb"]],
            ["..folderb", ["", "", "folderb"]],
            ["foldera..folderb", ["foldera", "", "folderb"]],
            ["foldera.folderb.", ["foldera", "folderb", ""]],
        ]

        for (field, folder) in folder_list:
            self.assertEqual(self.passfile._field_to_folder_list(field),
                             folder)

    def test_get_database_version_string(self):

        self.passfile.new_db("test")

        expected = '%s.%s' % (hexlify(self.passfile.db_version[1:2]).decode(
            'utf-8'), hexlify(self.passfile.db_version[0:1]).decode('utf-8'))

        self.assertEqual(self.passfile.get_database_version_string(), expected)

        self.passfile.header[0] = b'\x0B\x03'

        self.assertEqual(self.passfile.get_database_version_string(), "03.0b")

    def test_new_entry(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        self.assertEqual(len(uuid_hex), 32)
        self.assertTrue(uuid_hex in self.passfile.records)

        for field in [1, 3, 4, 5, 6, 7, 8, 12, 13]:
            self.assertTrue(field in self.passfile.records[uuid_hex])

    def test_delete_entry(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        self.assertTrue(uuid_hex in self.passfile.records)

        self.passfile.delete_entry(uuid_hex)

        self.assertTrue(uuid_hex not in self.passfile.records)

    def test_update_modification_time(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        old_time = self.passfile.records[uuid_hex][12]
        time.sleep(1.1)
        self.passfile.update_modification_time(uuid_hex)
        new_time = self.passfile.records[uuid_hex][12]

        self.assertTrue(old_time != new_time)

    def test_update_password_time(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        old_time = self.passfile.records[uuid_hex][8]
        time.sleep(1.1)
        self.passfile.update_password_time(uuid_hex)
        new_time = self.passfile.records[uuid_hex][8]

        self.assertTrue(old_time != new_time)

    def test_get_title(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        test_title = "Test title"
        self.passfile.records[uuid_hex][3] = test_title

        title = self.passfile.get_title(uuid_hex)
        self.assertTrue(title == test_title)

    def test_get_username(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        test_username = "******"
        self.passfile.records[uuid_hex][4] = test_username

        username = self.passfile.get_username(uuid_hex)
        self.assertTrue(username == test_username)

    def test_get_notes(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        test_note = "This is a note."
        self.passfile.records[uuid_hex][5] = test_note

        note = self.passfile.get_notes(uuid_hex)
        self.assertTrue(note == test_note)

    def test_get_password(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        test_password = "******"
        self.passfile.records[uuid_hex][6] = test_password

        password = self.passfile.get_password(uuid_hex)
        self.assertTrue(password == test_password)

    def test_get_url(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        test_url = "http://www.example.com"
        self.passfile.records[uuid_hex][13] = test_url

        url = self.passfile.get_url(uuid_hex)
        self.assertTrue(url == test_url)

    def test_update_folder_list(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        self.assertTrue(2 not in self.passfile.records[uuid_hex])

        folder = ['folderA', 'folderB', 'folderC']
        folder_field = 'folderA.folderB.folderC'

        self.passfile.update_folder_list(uuid_hex, folder)

        self.assertTrue(2 in self.passfile.records[uuid_hex])
        self.assertTrue(self.passfile.records[uuid_hex][2] == folder_field)

        self.passfile.update_folder_list(uuid_hex, [])
        self.assertTrue(2 not in self.passfile.records[uuid_hex])

    def test_get_folder_list(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        self.assertTrue(2 not in self.passfile.records[uuid_hex])
        self.assertTrue(self.passfile.get_folder_list(uuid_hex) == [])

        folder = ['folderA', 'folderB', 'folderC']
        folder_field = 'folderA.folderB.folderC'

        self.passfile.update_folder_list(uuid_hex, folder)

        self.assertTrue(2 in self.passfile.records[uuid_hex])
        self.assertTrue(self.passfile.records[uuid_hex][2] == folder_field)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex) == folder)

        self.assertTrue(self.passfile.get_folder_list('nonexistent') == [])

    def test_get_empty_folders(self):

        folder_fields = [
            'folderA', 'folderA.folderB', 'folderA.folderB.folderC'
        ]

        folder_list = [['folderA'], ['folderA', 'folderB'],
                       ['folderA', 'folderB', 'folderC']]

        self.assertTrue(self.passfile.get_empty_folders() == [])
        self.passfile.empty_folders = folder_fields

        self.assertTrue(self.passfile.get_empty_folders() == folder_list)

    def test_add_empty_folder(self):

        folder_fields = [
            'folderA', 'folderA.folderB', 'folderA.folderB.folderC'
        ]

        folder = ['folderA', 'folderB', 'folderC']

        # Make sure it's empty
        self.assertTrue(self.passfile.empty_folders == [])

        # Add a folder, and make sure it created the children
        self.passfile.add_empty_folder(folder)
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Make sure empty parameters work
        self.passfile.add_empty_folder(None)
        self.assertTrue(self.passfile.empty_folders == folder_fields)
        self.passfile.add_empty_folder([])
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Try adding it again, to make sure we don't have duplicates
        self.passfile.add_empty_folder(folder)
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Make sure adding an empty folder that isn't actually empty
        # works
        uuid_hex = self.passfile.new_entry()
        entry_folder = ['otherA']
        self.passfile.update_folder_list(uuid_hex, entry_folder)
        self.passfile.add_empty_folder(entry_folder)
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Adding an empty folder that only has an empty subfolder should
        # only add the subfolder
        uuid_hex = self.passfile.new_entry()
        entry_folder = ['thirdA', 'thirdB']
        self.passfile.update_folder_list(uuid_hex, entry_folder)
        self.passfile.add_empty_folder(entry_folder)

        folder_fields.append('thirdA')
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Do the same, but for 3 levels
        uuid_hex = self.passfile.new_entry()
        entry_folder = ['fourthA', 'fourthB', 'fourthC']
        self.passfile.update_folder_list(uuid_hex, entry_folder)
        self.passfile.add_empty_folder(entry_folder)

        folder_fields.append('fourthA')
        folder_fields.append('fourthA.fourthB')
        self.assertTrue(self.passfile.empty_folders == folder_fields)

    def test_remove_empty_folder(self):

        folder_fields = [
            'folderA', 'folderA.folderB', 'folderA.folderB.folderC'
        ]

        # pass by value
        self.passfile.empty_folders = folder_fields[:]

        # Try and remove a bogus folder
        self.passfile.remove_empty_folder(['bogus'])
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Make sure empty parameters work
        self.passfile.remove_empty_folder(None)
        self.assertTrue(self.passfile.empty_folders == folder_fields)
        self.passfile.remove_empty_folder([])
        self.assertTrue(self.passfile.empty_folders == folder_fields)

        # Now, remove an empty folder
        self.passfile.remove_empty_folder(['folderA', 'folderB'])
        folder_fields.remove('folderA.folderB')
        self.assertTrue(self.passfile.empty_folders == folder_fields)

    def test_get_all_folders(self):
        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        # First make sure there's no folders at all
        self.assertTrue(self.passfile.get_all_folders() == [])

        # Now handle an entry, but no empty folders
        folder = ['folderA', 'folderB']
        self.passfile.update_folder_list(uuid_hex, folder)
        self.assertTrue(self.passfile.get_all_folders() == [folder])

        # Now handle empty folders, but no entry
        self.passfile.update_folder_list(uuid_hex, [])
        self.assertTrue(self.passfile.get_all_folders() == [])

        folder_fields = [
            'folderA', 'folderA.folderB', 'folderA.folderB.folderC'
        ]
        self.passfile.empty_folders = folder_fields

        folder_list = [['folderA'], ['folderA', 'folderB'],
                       ['folderA', 'folderB', 'folderC']]

        self.assertTrue(self.passfile.get_all_folders() == folder_list)

        # Now handle multiple entries, and empty folders
        self.passfile.update_folder_list(uuid_hex, folder)

        folderB = ['OtherFolderA', 'OtherFolderB']

        uuid_hex_B = self.passfile.new_entry()
        self.passfile.new_entry()
        self.passfile.update_folder_list(uuid_hex_B, folderB)

        all_folders = folder_list + [folderB]
        self.assertTrue(self.passfile.get_all_folders() == all_folders)

    def test_rename_folder_list(self):

        self.passfile.new_db("test")

        # Create a few entries
        folderA = ['firstA', 'firstB']
        folderB = ['firstA', 'firstB', 'firstC']
        folderC = ['secondA', 'secondB']

        uuid_hex_A = self.passfile.new_entry()
        uuid_hex_B = self.passfile.new_entry()
        uuid_hex_C = self.passfile.new_entry()
        uuid_hex_D = self.passfile.new_entry()

        self.passfile.update_folder_list(uuid_hex_A, folderA)
        self.passfile.update_folder_list(uuid_hex_B, folderB)
        self.passfile.update_folder_list(uuid_hex_C, folderC)

        self.assertTrue(self.passfile.get_folder_list(uuid_hex_A) == folderA)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_B) == folderB)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])

        # Ok, let's rename one
        new_folderA = ['firstA', 'renamedB']
        new_folderB = ['firstA', 'renamedB', 'firstC']
        self.passfile.rename_folder_list(folderA, new_folderA)

        self.assertTrue(
            self.passfile.get_folder_list(uuid_hex_A) == new_folderA)
        self.assertTrue(
            self.passfile.get_folder_list(uuid_hex_B) == new_folderB)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])

        # Now add some empty_folders
        folder_fields = ['firstA', 'secondA', 'thirdA', 'thirdA.thirdB']

        # pass by value
        self.passfile.empty_folders = folder_fields[:]

        # OK, rename entries and empty_folders
        another_new_folderA = ['renamedA', 'renamedB']
        another_new_folderB = ['renamedA', 'renamedB', 'firstC']
        new_empty_folders = [['secondA'], ['thirdA'], ['thirdA', 'thirdB'],
                             ['renamedA']]

        self.passfile.rename_folder_list(['firstA'], ['renamedA'])

        self.assertTrue(
            self.passfile.get_folder_list(uuid_hex_A) == another_new_folderA)
        self.assertTrue(
            self.passfile.get_folder_list(uuid_hex_B) == another_new_folderB)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])

        self.assertTrue(self.passfile.get_empty_folders() == new_empty_folders)

    def test_delete_folder(self):

        self.passfile.new_db("test")

        # Create a few entries
        folderA = ['firstA', 'firstB']
        folderB = ['firstA', 'firstB', 'firstC']
        folderC = ['secondA', 'secondB']

        uuid_hex_A = self.passfile.new_entry()
        uuid_hex_B = self.passfile.new_entry()
        uuid_hex_C = self.passfile.new_entry()
        uuid_hex_D = self.passfile.new_entry()

        self.passfile.update_folder_list(uuid_hex_A, folderA)
        self.passfile.update_folder_list(uuid_hex_B, folderB)
        self.passfile.update_folder_list(uuid_hex_C, folderC)

        self.assertTrue(self.passfile.get_folder_list(uuid_hex_A) == folderA)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_B) == folderB)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])

        self.assertTrue(self.passfile.get_empty_folders() == [])

        # Try and delete some invalid things
        self.passfile.delete_folder(None)
        self.passfile.delete_folder([])
        self.passfile.delete_folder(['banana'])

        self.assertTrue(self.passfile.get_folder_list(uuid_hex_A) == folderA)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_B) == folderB)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])

        self.assertTrue(self.passfile.get_empty_folders() == [])

        # Now, delete a third level.
        self.passfile.delete_folder(folderB)

        self.assertTrue(self.passfile.get_folder_list(uuid_hex_A) == folderA)
        self.assertTrue(uuid_hex_B not in self.passfile.records)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])
        self.assertTrue(uuid_hex_D in self.passfile.records)
        self.assertTrue(self.passfile.get_empty_folders() == [])

        # Add some empty_folders and delete a toplevel
        emptyA = [['firstA'], ['firstA', 'firstB', 'emptyC']]
        emptyB = emptyA + [['some'], ['some', 'random']]
        for folder in emptyB:
            self.passfile.add_empty_folder(folder)

        self.assertTrue(self.passfile.get_empty_folders() == emptyB)
        self.passfile.delete_folder(['some'])
        self.assertTrue(self.passfile.get_empty_folders() == emptyA)

        self.assertTrue(self.passfile.get_folder_list(uuid_hex_A) == folderA)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])
        self.assertTrue(uuid_hex_D in self.passfile.records)

        # Now delete a top level
        self.passfile.delete_folder(['firstA'])
        self.assertTrue(self.passfile.get_empty_folders() == [])
        self.assertTrue(uuid_hex_A not in self.passfile.records)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_C) == folderC)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])
        self.assertTrue(uuid_hex_D in self.passfile.records)

        # Delete the remaining second level. We should gain an empty folder.
        self.passfile.delete_folder(['secondA', 'secondB'])
        self.assertTrue(uuid_hex_C not in self.passfile.records)
        self.assertTrue(self.passfile.get_folder_list(uuid_hex_D) == [])
        self.assertTrue(uuid_hex_D in self.passfile.records)
        self.assertTrue(self.passfile.get_empty_folders() == [['secondA']])

    def test_get_tree_status(self):

        self.passfile.new_db("test")
        self.assertEqual(self.passfile.get_tree_status(), None)

        self.passfile.header[6] = "Pasaffe test"
        self.assertEqual(self.passfile.get_tree_status(), None)

        self.passfile.header[3] = "101010"
        self.assertEqual(self.passfile.get_tree_status(), "101010")

        self.passfile.header[6] = "AnotherApp v1"
        self.assertEqual(self.passfile.get_tree_status(), None)

    def test_set_tree_status(self):

        self.passfile.new_db("test")
        self.passfile.header[6] = "Pasaffe test"
        self.assertEqual(self.passfile.get_tree_status(), None)

        self.passfile.set_tree_status("101010")
        self.assertEqual(self.passfile.get_tree_status(), "101010")
        self.assertTrue(3 in self.passfile.header)

        self.passfile.set_tree_status(None)
        self.assertEqual(self.passfile.get_tree_status(), None)
        self.assertFalse(3 in self.passfile.header)

    def test_fixups(self):

        self.passfile.new_db("test")
        uuid_hex = self.passfile.new_entry()

        # New entry should have empty strings
        self.assertEqual(self.passfile.records[uuid_hex][3], '')
        self.assertEqual(self.passfile.records[uuid_hex][4], '')
        self.assertEqual(self.passfile.records[uuid_hex][5], '')
        self.assertEqual(self.passfile.records[uuid_hex][6], '')

        # Delete title, username and password
        del self.passfile.records[uuid_hex][3]
        del self.passfile.records[uuid_hex][4]
        del self.passfile.records[uuid_hex][6]

        # add a comment with CRLF terminators
        crlf = ("First line\r\n" + "Second line\r\n" + "Third line")

        lf = ("First line\n" + "Second line\n" + "Third line")

        self.passfile.records[uuid_hex][5] = crlf

        self.assertTrue(3 not in self.passfile.records[uuid_hex])
        self.assertTrue(4 not in self.passfile.records[uuid_hex])
        self.assertTrue(6 not in self.passfile.records[uuid_hex])
        self.assertEqual(self.passfile.records[uuid_hex][5], crlf)

        # Now do the postread fixup
        self.passfile._postread_fixup()

        self.assertEqual(self.passfile.records[uuid_hex][3], '')
        self.assertEqual(self.passfile.records[uuid_hex][4], '')
        self.assertEqual(self.passfile.records[uuid_hex][5], lf)
        self.assertEqual(self.passfile.records[uuid_hex][6], '')

        # OK, do the presave fixup
        self.assertEqual(self.passfile._presave_fixup(uuid_hex, 5), crlf)

    def _create_find_db(self):

        entries = [{
            3: "carte de crédit",
            4: "username1",
            5: "This is a note",
            6: "password1",
            13: "http://www.example.com"
        }, {
            2: "folder1",
            3: "carte de credit",
            4: "username1",
            5: "anothernote",
            6: "password1"
        }, {
            2: "level1group.level2group.level3group",
            3: "level3entry",
            4: "usernamelevel3",
            6: "passwordlevel3",
            13: "http://note.com"
        }]

        self.passfile.new_db('pasaffe')

        for entry in entries:
            uuid = self.passfile.new_entry()
            for key in entry.keys():
                self.passfile.records[uuid][key] = entry[key]

    def test_update_find_results(self):

        self._create_find_db()

        self.passfile.update_find_results("")
        self.assertEqual(self.passfile.find_results, [])
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "")

        # Test field 3
        self.passfile.update_find_results("level3entry")
        self.assertEqual(len(self.passfile.find_results), 1)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "level3entry")

        # Test field 5
        self.passfile.update_find_results("another")
        self.assertEqual(len(self.passfile.find_results), 1)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "another")

        # Test field 13
        self.passfile.update_find_results("example.com")
        self.assertEqual(len(self.passfile.find_results), 1)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "example.com")

        # Test matching entries with accents
        self.passfile.update_find_results("credit")
        self.assertEqual(len(self.passfile.find_results), 2)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "credit")

        # Test specifying search term with accent
        self.passfile.update_find_results("crédit")
        self.assertEqual(len(self.passfile.find_results), 2)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "crédit")

        # Test force option
        self.passfile.find_results = []
        self.passfile.update_find_results("crédit")
        self.assertEqual(len(self.passfile.find_results), 0)
        self.passfile.update_find_results("crédit", True)
        self.assertEqual(len(self.passfile.find_results), 2)

        # Test clearing out values
        self.passfile.update_find_results("")
        self.assertEqual(self.passfile.find_results, [])
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "")

    def test_get_next_find_result(self):

        self._create_find_db()

        self.assertEqual(self.passfile.get_next_find_result(), None)
        self.assertEqual(self.passfile.get_next_find_result(True), None)

        self.passfile.update_find_results("note")
        self.assertEqual(len(self.passfile.find_results), 3)
        self.assertEqual(self.passfile.find_results_index, None)
        self.assertEqual(self.passfile.find_value, "note")

        self.assertEqual(self.passfile.find_results_index, None)

        uuid1 = self.passfile.get_next_find_result()
        self.assertEqual(self.passfile.find_results_index, 0)
        self.assertNotEqual(uuid1, None)

        uuid2 = self.passfile.get_next_find_result()
        self.assertEqual(self.passfile.find_results_index, 1)
        self.assertNotEqual(uuid2, None)
        self.assertNotEqual(uuid1, uuid2)

        uuid3 = self.passfile.get_next_find_result()
        self.assertEqual(self.passfile.find_results_index, 2)
        self.assertNotEqual(uuid3, None)
        self.assertNotEqual(uuid1, uuid3)
        self.assertNotEqual(uuid2, uuid3)

        # This should wrap around
        uuid4 = self.passfile.get_next_find_result()
        self.assertEqual(self.passfile.find_results_index, 0)
        self.assertNotEqual(uuid4, None)
        self.assertEqual(uuid1, uuid4)

        # And now try backwards
        uuid5 = self.passfile.get_next_find_result(True)
        self.assertEqual(self.passfile.find_results_index, 2)
        self.assertNotEqual(uuid5, None)
        self.assertEqual(uuid3, uuid5)