- fixed #314 - correctly handle binaries with no data
- fixed #265 - check for keepass signature
- fixed #319 - support pathlib for filename/keyfile
- fixed #194 - added 'protected' arg to _set_string_field
- use official icon names from KeePass source and deprecate old icons
- added Entry.is_custom_property_protected()
- add otp support
- add debug_setup() function
- added support for argon2id key derivation function
- added credential expiry functions
- fixes #223 - safe saving
- added Entry.delete_history()
- added HistoryEntry class
- added Group.touch()
- support 2.0 keyfiles
- added PyKeePass.reload()
- dropped python2 tests
- fixed #284 - autotype_sequence returns string 'None'
- fixed #244 - incorrect PKCS padding error
- paths changed from strings to lists
- added PyKeePass.recyclebin_group
- added PyKeePass.trash_group()
- added PyKeePass.trash_entry()
- added PyKeePass.empty_group()
- support reading/saving from streams
- fixed PyKeePass.dump_xml() pretty printing
- fixed #212 - properly pad encrypted payload
- fixed #222 - corrected transform_rounds field length
- pin construct version to last supporting python2
- hard dependency on pycryptodomex
- fixed #193 - kp.groups, kp.entries not returning elements with name/title None
- added PyKeePass.xml()
- added create_database()
- added tag searching - #182
- fixed #181 - binary attachments missing Compressed attribute unparseable
- fixed #129 - protected multiline fields missing newline
- fixed problem where entries are protected after save
- removed context manager
- added autotype string support
- added attachments
- fixed find_entries(path=xxx) behavior
- Entry.uuid, Group.uuid now return uuid.UUID object instead of string
- added context manager
- added custom string field searching
- added 'Notes' field
- renamed 'tree' argument to 'group'
- KDBX4 support