kdbx 2.6.0
kdbx: ^2.6.0 copied to clipboard
KeepassX format implementation in pure dart. (kdbx 3.x and 4.x support).
2.6.0 #
- Entry history is now bounded by the
HistoryMaxItemsandHistoryMaxSizethe database itself declares, which nothing had ever read. Oldest-first by modification time, when a revision is taken and once at the end of a merge, never on save — so a database already over its limits keeps the history of every entry nobody touches. A negative limit means unlimited, zero keeps nothing, and a limit the file does not declare at all is treated as unlimited rather than defaulted. - The revisions a duplicate-uuid repair folds into the survivor are held back from those limits until the file has been saved and read again. They are stamped older than the survivor's own revisions, so the limits would reach for them first and delete the last copy of that content on the user's next unrelated edit.
- Fix: merging a copy which was older than the local one appended a revision of that copy's state on every merge, because the check for whether we already had that state compared against our own modification time, which can never appear in our own history. Repeated syncs against a replica that was never written to again piled up identical revisions.
- Unreferenced attachments are now dropped from the binary pool when a file is saved, instead of staying in it for good. Nothing used to shrink the pool: detaching an attachment deliberately left the bytes for the revisions which still held it, and when those revisions went there was no second pass. With the history limits above, a revision can now disappear without the user deleting anything, which makes those limits the one thing that can orphan an attachment by itself - so the two belong together. The pool is rebuilt from what the entries and their revisions still point at, which is also what renumbers it.
- Fix: a merge discarded the changes to an object which the incoming copy had both edited and moved. The move was applied first and bumped the object's own modification time, so the comparison which decides whose data is newer then found the local copy newer and kept it - the incoming edit was lost with no record of it anywhere.
- A move is no longer treated as a modification of the object. Moving an entry
between groups, which includes sending it to the recycle bin, updates
LocationChangedand leavesLastModificationTimealone, and no longer records a history revision - so a trashed entry keeps the history someone restoring it would want. The revision belonging to the next real change is still recorded. - Fix: a merge copied the incoming copy's
LocationChangedalong with its data, so an object that had been moved locally kept its new group but recorded the location time of the group it came from. The two copies then never agreed on where it belongs, and a third copy with an older move could move it back out again. - Fix: merging a file which contained an entry the local copy did not have yet
added every one of that entry's history revisions to the group as a live
entry, sharing the new entry's uuid, so the database gained duplicate
entries which look identical in the entry list. The entry's own history was
unaffected. With assertions enabled the first revision instead tripped an
assertion in
KdbxGroup.addEntry, leaving the file partially merged. - Databases which were already merged by an affected release build still carry
those duplicates, and nothing noticed them. Reading one now logs it and
records the uuids in
KdbxFile.duplicateUuidsOnOpen; reading still succeeds.KdbxFile.findDuplicateUuidObjects()answers the same question about the current state. - Merging a file which carries duplicates reports them as merge warnings
instead of failing with an unhelpful
StateErrorpart way through, and an incoming deleted object now removes every copy of that uuid instead of leaving the rest behind forever. - Fix: an object removed by an incoming deletion during a merge kept pointing
at the group it was removed from, so code still holding it saw a parent that
no longer listed it - and
deletePermanentlyon such an object recorded a second deleted object for that uuid before failing. It is now detached, the wayKdbxDao.deletePermanentlydetaches, andKdbxDao.movesays so instead of failing on a null parent. - New
KdbxDao.mergeDuplicateUuidEntries()repairs such a file: for each affected uuid the newest entry which is not in the recycle bin survives, and the other copies are folded into its history. It records no deleted object, since the uuid lives on, and it has to be run on every replica. - Breaking:
KdbxGroup.addEntrynow throws aKdbxDuplicateUuidExceptionwhere it previously only asserted that the uuid is not already in the group, so it no longer passes unnoticed in a release build.KdbxDao.movechecks the same condition up front and throws the same exception, which meansmove,deleteEntryanddeleteGroupcan now throw where they used to return - on a file that carries duplicates, they have to, because completing the move would drop an entry. Callers moving entries around in a file that may carry duplicates need to catch it. - Fix: a
TransformedKeyCredentialsof the wrong length is rejected instead of deriving the wrong cipher key and reporting itself as a wrong password - the length assertion only fired in debug builds. Refusing to save now says 'original credentials' rather than 'master password', andgetHashis documented as able to throw.
2.5.0 #
TransformedKeyCredentials: open a file from the post-KDF key, skipping argon2 entirely. Intended for memory constrained callers such as an iOS autofill extension. Export one fromKdbxFile.transformedKeyCredentialsafter a read or save.KdbxFile.kdfFingerprintto tell whether a stored transformed key still matches a file; a mismatch throwsKdbxTransformedKeyStaleException.- Fix:
generateSalts()did not actually rotate the kdbx4 kdf salt, so every save reused the salt the file was created with.
2.4.2 #
- Update dependencies. (archive, pointycastle)
2.4.1 #
- Update dependencies.
2.4.0 #
- Migrate to latest dart version.
2.3.0 #
- Mark objects only as clean when saving was successful.
- Only mark objects as clean if they have not been modified since we started saving.
- Make credentials changeable.
- Add support for CustomData in entries.
- Upgrade dependencies.
2.2.0 #
- If argon2 ffi implementation is not available, fallback to pointycastle (dart-only) implementation.
2.1.1 #
- Throw KdbxInvalidFileStructure for invalid files.
2.1.0 #
- Implement permanently removing entries and groups.
- Fix merging of files with incoming deleted objects.
2.0.0+1 #
- Small Null-safety improvement.
- add debugging to AES decryption.
2.0.0 #
- Null-safety migration
1.0.0 #
- Use kdbx 4.x by default when creating new files.
- Implemented support for custom icons.
- Implemented file merging/synchronization.
- Fixed threading problem on save: only allow one save at a time for each file.
- Support for V2 keyfile https://forum.authpass.app/t/issuues-with-keyfile/84/3
0.4.1 #
- fix bug saving files with history entries which contain attachments.
- fix bug which would create wrong history entries.
0.4.0+1 #
- Fix UsageCount typo (vs. Usagecount) #1
0.4.0 #
- Upgraded xml package dependency to 4.x
0.3.1 #
- Fixed error handling nil UUIDs in recycle bin. Also, only create recycle bin on demand (when deleting items).
0.3.0+1 #
- Minor fixes for kdbx 4.x
0.3.0 #
- Initial support for kdbx 4.x
0.2.1 #
- Throw unsupported exception when trying to read kdbx 4.x files.
0.2.0 #
- Fixed writing of packet index for payload.
- Fixed big endian vs. little endian encoding.
- Compatibility fixes with other kdbx apps.
0.1.0 #
- Support for reading and writing kdbx 2.x files (with a master password)
0.0.1 #
- Initial version, created by Stagehand