git.schokokeks.org
Repositories
Help
Report an Issue
derivepassphrase.git
Code
Commits
Branches
Tags
Suche
Strukturansicht:
f428ac1
Branches
Tags
documentation-tree
master
unstable/modularize-and-refactor-test-machinery
unstable/ssh-agent-socket-providers
wishlist
0.1.0
0.1.1
0.1.2
0.1.3
0.2.0
0.3.0
0.3.1
0.3.2
0.3.3
0.4.0
0.5.1
0.5.2
derivepassphrase.git
0.x
changelog
index.html
Deployed 74b94268335a to 0.x with MkDocs 1.6.1 and mike 2.1.3
Marco Ricci
commited
f428ac1
at 2025-08-03 22:00:48
index.html
Blame
History
Raw
<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="description" content="An almost faithful Python reimplementation of James Coglan's vault."> <meta name="author" content="Marco Ricci"> <link rel="canonical" href="https://the13thletter.info/derivepassphrase/0.x/changelog/"> <link rel="prev" href="../explanation/faq-vault-interchangable-passphrases/"> <link rel="next" href="../upgrade-notes/"> <link rel="icon" href="../assets/images/favicon.png"> <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16"> <title>Changelog - derivepassphrase</title> <link rel="stylesheet" href="../assets/stylesheets/main.7e37652d.min.css"> <style>:root{--md-text-font:"Noto Sans";--md-code-font:"Noto Mono"}</style> <link rel="stylesheet" href="../assets/_mkdocstrings.css"> <link rel="stylesheet" href="../mkdocstrings_recommended_styles.css"> <link rel="stylesheet" href="../wishlist_styling.css"> </head> <body dir="ltr"> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a href="#changelog-for-derivepassphrase" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <div data-md-color-scheme="default" data-md-component="outdated" hidden> </div> <div class="md-container" data-md-component="container"> <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> <div class="md-grid"> <ul class="md-tabs__list"> <li class="md-tabs__item"> <a href=".." class="md-tabs__link"> Overview </a> </li> <li class="md-tabs__item"> <a href="../tutorials/" class="md-tabs__link"> Tutorials & Examples </a> </li> <li class="md-tabs__item"> <a href="../how-tos/" class="md-tabs__link"> How-Tos </a> </li> <li class="md-tabs__item"> <a href="../reference/" class="md-tabs__link"> Reference </a> </li> <li class="md-tabs__item"> <a href="../explanation/" class="md-tabs__link"> Design & Background </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href="./" class="md-tabs__link"> Changelog </a> </li> <li class="md-tabs__item"> <a href="../wishlist/" class="md-tabs__link"> Wishlist </a> </li> </ul> </div> </nav> <main class="md-main" data-md-component="main"> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> <label class="md-nav__title" for="__drawer"> <a href=".." title="derivepassphrase" class="md-nav__button md-logo" aria-label="derivepassphrase" data-md-component="logo"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> derivepassphrase </label> <div class="md-nav__source"> <a href="https://git.schokokeks.org/derivepassphrase.git" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg> </div> <div class="md-source__repository"> the-13th-letter/derivepassphrase </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href=".." class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" > <div class="md-nav__link md-nav__container"> <a href="../tutorials/" class="md-nav__link "> <span class="md-ellipsis"> Tutorials & Examples </span> </a> <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0"> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_2"> <span class="md-nav__icon md-icon"></span> Tutorials & Examples </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../tutorials/basic-setup-passphrase/" class="md-nav__link"> <span class="md-ellipsis"> Setting up derivepassphrase vault for three accounts, with a master passphrase </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" > <div class="md-nav__link md-nav__container"> <a href="../how-tos/" class="md-nav__link "> <span class="md-ellipsis"> How-Tos </span> </a> <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0"> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3"> <span class="md-nav__icon md-icon"></span> How-Tos </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../how-tos/ssh-key/" class="md-nav__link"> <span class="md-ellipsis"> How to set up derivepassphrase vault with an SSH key </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" > <div class="md-nav__link md-nav__container"> <a href="../reference/" class="md-nav__link "> <span class="md-ellipsis"> Reference </span> </a> <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0"> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4"> <span class="md-nav__icon md-icon"></span> Reference </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" > <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0"> <span class="md-ellipsis"> Man pages </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_2"> <span class="md-nav__icon md-icon"></span> Man pages </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../reference/derivepassphrase.1/" class="md-nav__link"> <span class="md-ellipsis"> derivepassphrase(1) </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase-vault.1/" class="md-nav__link"> <span class="md-ellipsis"> derivepassphrase-vault(1) </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase-export.1/" class="md-nav__link"> <span class="md-ellipsis"> derivepassphrase-export(1) </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase-export-vault.1/" class="md-nav__link"> <span class="md-ellipsis"> derivepassphrase-export-vault(1) </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" > <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0"> <span class="md-ellipsis"> API docs: Module derivepassphrase </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_3"> <span class="md-nav__icon md-icon"></span> API docs: Module derivepassphrase </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../reference/derivepassphrase.cli/" class="md-nav__link"> <span class="md-ellipsis"> Submodule cli </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase.exporter/" class="md-nav__link"> <span class="md-ellipsis"> Subpackage exporter </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase.sequin/" class="md-nav__link"> <span class="md-ellipsis"> Submodule sequin </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase.ssh_agent/" class="md-nav__link"> <span class="md-ellipsis"> Submodule ssh_agent </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase._types/" class="md-nav__link"> <span class="md-ellipsis"> Submodule _types </span> </a> </li> <li class="md-nav__item"> <a href="../reference/derivepassphrase.vault/" class="md-nav__link"> <span class="md-ellipsis"> Submodule vault </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" > <label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0"> <span class="md-ellipsis"> Technical prerequisites </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_4"> <span class="md-nav__icon md-icon"></span> Technical prerequisites </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../reference/prerequisites-ssh-key/" class="md-nav__link"> <span class="md-ellipsis"> Using derivepassphrase vault with an SSH key </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > <div class="md-nav__link md-nav__container"> <a href="../explanation/" class="md-nav__link "> <span class="md-ellipsis"> Design & Background </span> </a> <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0"> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5"> <span class="md-nav__icon md-icon"></span> Design & Background </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../explanation/faq-altered-versions/" class="md-nav__link"> <span class="md-ellipsis"> "altered versions" license requirement </span> </a> </li> <li class="md-nav__item"> <a href="../explanation/faq-vault-interchangable-passphrases/" class="md-nav__link"> <span class="md-ellipsis"> "interchangable passphrases" in vault </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked> <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex=""> <span class="md-ellipsis"> Changelog </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_6"> <span class="md-nav__icon md-icon"></span> Changelog </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Changelog </span> <span class="md-nav__icon md-icon"></span> </label> <a href="./" class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Changelog </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#v0.5.2" class="md-nav__link"> <span class="md-ellipsis"> 0.5.2 (2025-08-03) </span> </a> <nav class="md-nav" aria-label="0.5.2 (2025-08-03)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.5.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.5.1" class="md-nav__link"> <span class="md-ellipsis"> 0.5.1 (2025-06-24) </span> </a> <nav class="md-nav" aria-label="0.5.1 (2025-06-24)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.5.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.5" class="md-nav__link"> <span class="md-ellipsis"> 0.5 (2025-06-14) </span> </a> <nav class="md-nav" aria-label="0.5 (2025-06-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#removed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Removed </span> </a> </li> <li class="md-nav__item"> <a href="#added-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> 0.4.0 (2025-01-07) </span> </a> <nav class="md-nav" aria-label="0.4.0 (2025-01-07)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> 0.3.3 (2024-11-28) </span> </a> <nav class="md-nav" aria-label="0.3.3 (2024-11-28)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.2" class="md-nav__link"> <span class="md-ellipsis"> 0.3.2 (2024-10-21) </span> </a> <nav class="md-nav" aria-label="0.3.2 (2024-10-21)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.3.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.1" class="md-nav__link"> <span class="md-ellipsis"> 0.3.1 (2024-10-21) </span> </a> <nav class="md-nav" aria-label="0.3.1 (2024-10-21)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.3.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> 0.3.0 (2024-10-15) </span> </a> <nav class="md-nav" aria-label="0.3.0 (2024-10-15)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> 0.2.0 (2024-09-12) </span> </a> <nav class="md-nav" aria-label="0.2.0 (2024-09-12)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#deprecated-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Deprecated </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.3" class="md-nav__link"> <span class="md-ellipsis"> 0.1.3 (2024-07-28) </span> </a> <nav class="md-nav" aria-label="0.1.3 (2024-07-28)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.3" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.2" class="md-nav__link"> <span class="md-ellipsis"> 0.1.2 (2024-07-22) </span> </a> <nav class="md-nav" aria-label="0.1.2 (2024-07-22)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.1" class="md-nav__link"> <span class="md-ellipsis"> 0.1.1 (2024-07-14) </span> </a> <nav class="md-nav" aria-label="0.1.1 (2024-07-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.0" class="md-nav__link"> <span class="md-ellipsis"> 0.1.0 (2024-07-14) </span> </a> <nav class="md-nav" aria-label="0.1.0 (2024-07-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.1.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="../upgrade-notes/" class="md-nav__link"> <span class="md-ellipsis"> Upgrade notes </span> </a> </li> <li class="md-nav__item"> <a href="../pycompatibility/" class="md-nav__link"> <span class="md-ellipsis"> Python compatibility </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" > <div class="md-nav__link md-nav__container"> <a href="../wishlist/" class="md-nav__link "> <span class="md-ellipsis"> Wishlist </span> </a> </div> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_7"> <span class="md-nav__icon md-icon"></span> Wishlist </label> <ul class="md-nav__list" data-md-scrollfix> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#v0.5.2" class="md-nav__link"> <span class="md-ellipsis"> 0.5.2 (2025-08-03) </span> </a> <nav class="md-nav" aria-label="0.5.2 (2025-08-03)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.5.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.5.1" class="md-nav__link"> <span class="md-ellipsis"> 0.5.1 (2025-06-24) </span> </a> <nav class="md-nav" aria-label="0.5.1 (2025-06-24)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.5.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.5" class="md-nav__link"> <span class="md-ellipsis"> 0.5 (2025-06-14) </span> </a> <nav class="md-nav" aria-label="0.5 (2025-06-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#removed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Removed </span> </a> </li> <li class="md-nav__item"> <a href="#added-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.5" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> 0.4.0 (2025-01-07) </span> </a> <nav class="md-nav" aria-label="0.4.0 (2025-01-07)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.4.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> 0.3.3 (2024-11-28) </span> </a> <nav class="md-nav" aria-label="0.3.3 (2024-11-28)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.3.3" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.2" class="md-nav__link"> <span class="md-ellipsis"> 0.3.2 (2024-10-21) </span> </a> <nav class="md-nav" aria-label="0.3.2 (2024-10-21)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.3.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.1" class="md-nav__link"> <span class="md-ellipsis"> 0.3.1 (2024-10-21) </span> </a> <nav class="md-nav" aria-label="0.3.1 (2024-10-21)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.3.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> 0.3.0 (2024-10-15) </span> </a> <nav class="md-nav" aria-label="0.3.0 (2024-10-15)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.3.0" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> 0.2.0 (2024-09-12) </span> </a> <nav class="md-nav" aria-label="0.2.0 (2024-09-12)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> <li class="md-nav__item"> <a href="#fixed-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> <li class="md-nav__item"> <a href="#changed-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Changed </span> </a> </li> <li class="md-nav__item"> <a href="#deprecated-in-v0.2.0" class="md-nav__link"> <span class="md-ellipsis"> Deprecated </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.3" class="md-nav__link"> <span class="md-ellipsis"> 0.1.3 (2024-07-28) </span> </a> <nav class="md-nav" aria-label="0.1.3 (2024-07-28)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.3" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.2" class="md-nav__link"> <span class="md-ellipsis"> 0.1.2 (2024-07-22) </span> </a> <nav class="md-nav" aria-label="0.1.2 (2024-07-22)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.2" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.1" class="md-nav__link"> <span class="md-ellipsis"> 0.1.1 (2024-07-14) </span> </a> <nav class="md-nav" aria-label="0.1.1 (2024-07-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#fixed-in-v0.1.1" class="md-nav__link"> <span class="md-ellipsis"> Fixed </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#v0.1.0" class="md-nav__link"> <span class="md-ellipsis"> 0.1.0 (2024-07-14) </span> </a> <nav class="md-nav" aria-label="0.1.0 (2024-07-14)"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#added-in-v0.1.0" class="md-nav__link"> <span class="md-ellipsis"> Added </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <a href="https://git.schokokeks.org/derivepassphrase.git/raw/master/docs/changelog.md" title="View source of this page" class="md-content__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg> </a> <h1 id="changelog-for-derivepassphrase">Changelog for <code>derivepassphrase</code><a class="headerlink" href="#changelog-for-derivepassphrase" title="Permanent link">¶</a></h1> <p><a href="https://keepachangelog.com/en/1.1.0/" title="Keeping a changelog"><img alt="Keeping a changelog" src="../Keep_a_changelog-E05735.svg" /></a> <a href="https://semver.org/" title="Using Semantic Versioning"><img alt="Using Semantic Versioning" src="../SemVer-3F4551.svg" /></a></p> <details class="info"> <summary>Definition: the <q>public API</q> of <code>derivepassphrase</code></summary> <p>The <dfn>public API</dfn>, as defined by Semantic Versioning, is outlined in the <a href="../reference/">Reference section</a>: the set of documented modules, classes, attributes, methods, functions and function parameters, and the documented behavior, options and arguments of the command-line tools.</p> <p>Certain <strong>exceptions to this rule</strong> are explicitly and prominently marked as implementation details/not part of the public API.</p> </details> <details class="info"> <summary>Interpretation of the version number</summary> <p>The terminology <b>major</b>, <b>minor</b> and <b>patch</b> follows the Semantic Versioning and Keep a Changelog definitions.</p> <ul> <li>For version numbers with major version zero, <em>any</em> new release may effectively constitute a new <b>major</b> release.</li> <li>For version numbers with major version one or higher,<ul> <li><b>Fixed</b> entries justify a <b>patch</b> release;</li> <li><b>Added</b> and <b>Deprecated</b> entries justify a <b>minor</b> release;</li> <li><b>Changed</b> and <b>Removed</b> entries justify a <b>major</b> release.</li> <li><b>Security</b> can justify any type of release; if <b>major</b> or <b>minor</b>, these are accompanied by corresponding entries of the respective types above.</li> </ul> </li> </ul> </details> <div class="admonition abstract inline end"> <p class="admonition-title">Legend: symbols</p> <p><ul style="list-style-type: none;"> <li><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span> — a related bug entry from the wishlist page <li><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span> — a related wishlist entry from the wishlist page </ul></p> </div> <aside> <p><small> (All entries are from the perspective of a user of the program or the API. As an exception, entries partaining to developers of <code>derivepassphrase</code> are specifically marked as such.) </small></p> </aside> <!-- scriv changelog start --> <h2 id="v0.5.2">0.5.2 (2025-08-03)<a class="headerlink" href="#v0.5.2" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.5.2">Fixed<a class="headerlink" href="#fixed-in-v0.5.2" title="Permanent link">¶</a></h3> <ul> <li> <p>Correctly report (in <code>--version</code> output) the current version as v0.5.2, instead of v0.5 alpha 1, development build #1. This happened because—ironically—our machinery for updating embedded version numbers automatically overlooked the <em>one</em> embedded version number that the <code>--version</code> output handler actually uses.</p> </li> <li> <p>For developers: Add slightly more details to the release checklist.</p> </li> <li> <p>For developers: Fix some errors in the test suite (both code and dependency declaration) that cause the suite to fail to even start on <abbr title="Microsoft Windows">The Annoying OS</abbr>.<sup id="fnref:the-annoying-os"><a class="footnote-ref" href="#fn:the-annoying-os">1</a></sup> These mistakes were already present in v0.5.</p> </li> <li> <p>For developers: Fix a copy-and-paste error in the parsed data for the ECDSA NIST P-521 SSH test key, which would cause <em>all</em> agents to fail when signing with that key, even if the agent otherwise supported the key type. Add additional testing code to catch this kind of test data inconsistency.</p> </li> <li> <p>For developers: Provide expected signatures and equivalent master passphrases for all test keys under Pageant, using both the <a href="https://www.rfc-editor.org/rfc/rfc6979">RFC 6979</a> scheme and the Pageant pre-0.80 scheme.</p> <p>Furthermore, provide a script to emit test key data for all defined test keys, augmented with the current agent’s signatures and equivalent master passphrases, in a format that can be easily pasted into the test module’s code (with only minor reformatting).</p> </li> </ul> <h2 id="v0.5.1">0.5.1 (2025-06-24)<a class="headerlink" href="#v0.5.1" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.5.1">Fixed<a class="headerlink" href="#fixed-in-v0.5.1" title="Permanent link">¶</a></h3> <ul> <li> <p>Add icons and more internal links (reference documentation, wishlist entries) to the changelog.</p> </li> <li> <p>Change the upstream URLs for the issue/wishlist tracking and the source code away from the GitHub mirror, and to the private hosting sites.</p> </li> <li> <p>Declare support for Python 3.14 (as of beta 3).</p> </li> </ul> <h2 id="v0.5">0.5 (2025-06-14)<a class="headerlink" href="#v0.5" title="Permanent link">¶</a></h2> <h3 id="removed-in-v0.5">Removed<a class="headerlink" href="#removed-in-v0.5" title="Permanent link">¶</a></h3> <ul> <li> <p>For <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>, remove <a href="#added-in-v0.4.0-color-support">support for (automatic) colored output or output with embedded text styling, as introduced in v0.4.0</a>.</p> <p>This is a stopgap measure. There exist pseudo-standards (the <code>NO_COLOR</code> and <code>FORCE_COLOR</code> environment variables) governing how to influence this automatic detection, but they are under-specified with regard to their interaction with each other. Until a consensus is reached and automatic colored/styled output can be requested or rejected reliably across different terminal programs, we will rather emit only uncolored, unstyled, lowest-common-denominator device-independent output. →<a href="../wishlist/conventional-configurable-text-styling/" title="Wish entry: “derivepassphrase vault should support conventional and configurable text styling”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> </ul> <h3 id="added-in-v0.5">Added<a class="headerlink" href="#added-in-v0.5" title="Permanent link">¶</a></h3> <ul> <li> <p>For the <a class="autorefs autorefs-internal" title=" Vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault"><code>Vault</code></a> API, support reporting on whether two master passphrases are interchangable with respect to the service passphrases they can derive. This is an artefact of how the master passphrase is converted to the random bit sequence with which the service passphrases are generated. See the corresponding <a href="../explanation/faq-vault-interchangable-passphrases/">FAQ entry: What are “interchangable passphrases” in vault?</a> for details, including the practical security (non-)implications.</p> <p>The <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> command-line interface does not address this in any manner, mostly because the “non-standard” interchangable variants of a given master password tend to be ugly to type in, and because they do not have practical security implications.</p> </li> <li> <p>For the <a class="autorefs autorefs-internal" title=" Vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault"><code>Vault</code></a> API, accept arbitrary <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Buffer">Buffer</a> objects as passphrases or service names, beyond <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#bytes"><code>bytes</code></a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#bytearray"><code>bytearray</code></a>.</p> </li> <li> <p>Expose <a class="autorefs autorefs-internal" title=" UUID class-attribute instance-attribute " href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault.UUID">the vault UUID</a> and <a class="autorefs autorefs-internal" title=" CHARSETS class-attribute instance-attribute " href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault.CHARSETS">the character sets</a> as public attributes.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, support selecting the <a href="#changed-in-v0.5-editor-interface">editor interface</a> when editing notes via the <code>--modern-editor-interface</code> and <code>--vault-legacy-editor-interface</code> options.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, support printing the service notes before the passphrase, as an alternative, instead of always printing them <em>after</em> the passphrase. →<a href="../wishlist/print-service-notes-above/" title="Wish entry: “derivepassphrase vault should be able to print service notes above the passphrase”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> <li> <p>In the <code>--version</code> option of <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a> and each subcommand, additionally report build and environment information, such as supported subcommands, derivation schemes, foreign configuration formats and active <a href="https://peps.python.org/pep-0508/">PEP 508 extras</a>. (Each subcommand only reports the items relevant to that subcommand.) →<a href="../wishlist/report-build-flags-and-features/" title="Wish entry: “derivepassphrase should report its build flags and supported features”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> <li> <p>For developers: Rewrite the tests concerning <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> and <code>--notes</code> usage into <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests where feasible.</p> </li> <li> <p>For developers: Add scripts to the source tree to ensure consistent code quality: automatic linting, formatting and type checking, and optional running of the test suite and building of the documentation. The master quality control script doubles as a servicable (but heavyweight) “pre-commit” hook for git.</p> </li> </ul> <h3 id="changed-in-v0.5">Changed<a class="headerlink" href="#changed-in-v0.5" title="Permanent link">¶</a></h3> <ul> <li> <p>Support a new, unified interface <a class="autorefs autorefs-internal" title=" ExportVaultConfigDataFunction" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.ExportVaultConfigDataFunction"><code>ExportVaultConfigDataFunction</code></a> in the export handlers for “storeroom” and “vault-native” configuration data, <a class="autorefs autorefs-internal" title=" export_storeroom_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.storeroom.export_storeroom_data"><code>export_storeroom_data</code></a> and <a class="autorefs autorefs-internal" title=" export_vault_native_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.vault_native.export_vault_native_data"><code>export_vault_native_data</code></a>. A new dispatch function <a class="autorefs autorefs-internal" title=" export_vault_config_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.export_vault_config_data"><code>export_vault_config_data</code></a> automatically calls the correct backend, based on the requested format.</p> <p>This is a <strong>breaking API change</strong> due to the change in function parameter names and return types.</p> </li> <li> <p>Convert <code>KeyCommentPair</code> from <a class="autorefs autorefs-internal" title=" derivepassphrase._types" href="../reference/derivepassphrase._types/#derivepassphrase._types"><code>derivepassphrase._types</code></a>, and <code>KeyPair</code> and <code>MasterKeys</code> from <a class="autorefs autorefs-internal" title=" derivepassphrase.exporter.storeroom" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.storeroom"><code>derivepassphrase.exporter.storeroom</code></a>, to <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/typing.html#typing.NamedTuple"><code>NamedTuple</code>s</a>. Also rename them to <a class="autorefs autorefs-internal" title=" SSHKeyCommentPair" href="../reference/derivepassphrase._types/#derivepassphrase._types.SSHKeyCommentPair"><code>SSHKeyCommentPair</code></a>, <a class="autorefs autorefs-internal" title=" StoreroomKeyPair" href="../reference/derivepassphrase._types/#derivepassphrase._types.StoreroomKeyPair"><code>StoreroomKeyPair</code></a> and <a class="autorefs autorefs-internal" title=" StoreroomMasterKeys" href="../reference/derivepassphrase._types/#derivepassphrase._types.StoreroomMasterKeys"><code>StoreroomMasterKeys</code></a>, respectively, in the <a class="autorefs autorefs-internal" title=" derivepassphrase._types" href="../reference/derivepassphrase._types/#derivepassphrase._types"><code>derivepassphrase._types</code></a> module.</p> <p>This is a <strong>breaking API change</strong>.</p> </li> <li> <p>Move the non-essential content of the <a class="autorefs autorefs-internal" title=" derivepassphrase.cli" href="../reference/derivepassphrase.cli/#derivepassphrase.cli"><code>derivepassphrase.cli</code></a> module into the “internals” subpackage.</p> <p>This is a <strong>breaking API change</strong> due to the removal of most functions from the <a class="autorefs autorefs-internal" title=" derivepassphrase.cli" href="../reference/derivepassphrase.cli/#derivepassphrase.cli"><code>derivepassphrase.cli</code></a> module.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, change the handling of the notes for better compatibility with <i>vault</i>(1) and for better internal consistency:</p> <ol> <li> <p>Correctly require the <code>--config</code> option in addition to the <code>--notes</code> option to request that the service notes be edited, for compatibility with <i>vault</i>(1). Issue a warning if <code>--notes</code> is used without <code>--config</code>.</p> </li> <li> <p><code>notes</code> is now also a valid setting name for <code>--unset</code> to take.</p> </li> <li> <p>Editing the notes successfully in any way, including no-op edits, will register the service name as a known service to <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, even if the settings are otherwise empty.</p> </li> </ol> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, by default, use an <b id="changed-in-v0.5-editor-interface">editor interface</b> that matches <i>vault</i>(1): the contents of the edited text file are used directly as the service notes, without interpretation.</p> <p>Previously, we post-processed the text file to remove comments and our instruction texts, and interpreted an empty file as a request to abort the edit. These two editor interfaces (“legacy” and “modern”) can be explicitly selected, and for the legacy interface, which is less resilient against data entry or usage errors, a backup copy of the old notes content is made.</p> </li> <li> <p>For developers: Use a different feature matrix and different <a href="https://pypi.org/project/hypothesis/">hypothesis</a> profiles in the test suite. The slowdown caused by coverage measurement is now more accurately estimated and adjusted for in the <a href="https://pypi.org/project/hypothesis/">hypothesis</a> settings.</p> </li> <li> <p>For developers: Clean up, partly reorganize, and document the test suite, at least rudimentarily. Also add several new <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests, particularly to test the core assumptions of the <a class="autorefs autorefs-internal" title=" derivepassphrase.vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault">vault</a> derivation scheme about sensitivity (or lack thereof) to its inputs and its input formats.</p> </li> <li> <p>For developers: For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, store our <code>vault.json</code> data file in pretty-printed form. This is a stopgap measure to ease debugging and introspection until better built-in query functionality for the effective configuration is available, because users should not be rewarded for meddling around in data files. →<a href="../wishlist/pretty-print-json/" title="Wish entry: “derivepassphrase vault should store and export the vault configuration in pretty-printed JSON”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> </ul> <h3 id="fixed-in-v0.5">Fixed<a class="headerlink" href="#fixed-in-v0.5" title="Permanent link">¶</a></h3> <ul> <li> <p>Fix the misbehaving shell completion for <code>zsh</code> in the presence of colons in the completion item. This was due to an overzealous workaround for <a href="https://github.com/pallets/click/issues/2703"><code>pallets/click#2703</code></a>.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when exporting a vault configuration, export a pretty-printed configuration, to ease debugging and introspection. →<a href="../wishlist/pretty-print-json/" title="Wish entry: “derivepassphrase vault should store and export the vault configuration in pretty-printed JSON”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, also print the service notes (if any) when deriving a service passphrase, just like <i>vault</i>(1) does. →<a href="../wishlist/print-service-notes/" title="Bug entry: “derivepassphrase vault does not print service notes”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> </li> <li> <p>Lock our internals and their configuration against concurrent modifications. →<a href="../wishlist/concurrency-audit/" title="Bug entry: “Audit derivepassphrase for concurrency/thread-safety issues”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> </li> <li> <p>Test against PyPy 3.11.</p> </li> <li> <p>Test on <abbr title="Microsoft Windows">The Annoying OS</abbr> in its baseline version, i.e., without SSH agent functionality but with <code>cryptography</code> support. Fix all incompatibilities in the test suite if essential and/or feasible, otherwise document them as skips or expected failures.</p> <p>(The latter case currently only concerns one single test that is supposed to trigger OS errors while attempting to read the <code>derivepassphrase</code> configuration files. <abbr title="Microsoft Windows">The Annoying OS</abbr> happily returns an empty file instead.)</p> </li> <li> <p>For developers: Include build machinery to ensure consistency of our version number and our diagnostic messages between the documentation and the code, instead of having to check this by hand.</p> <p>(The canonical way to get the version number is the <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/importlib.metadata.html#importlib.metadata.version"><code>importlib.metadata.version</code></a> standard library interface.)</p> </li> <li> <p>For developers: Test our locking implementation for correctness, on both sides of the API. Specifically, test that the respective platform-specific locking primitives provide the requested mutual exclusion properties, and that the locking system as a whole, when given functioning locking primitives, correctly serializes access to the facilities it is supposed to guard. →<a href="../wishlist/concurrency-testing-in-test-suite/" title="Bug entry: “Test for concurrency and assert thread-safety in derivepassphrase's test suite”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> </li> </ul> <h2 id="v0.4.0">0.4.0 (2025-01-07)<a class="headerlink" href="#v0.4.0" title="Permanent link">¶</a></h2> <h3 id="added-in-v0.4.0">Added<a class="headerlink" href="#added-in-v0.4.0" title="Permanent link">¶</a></h3> <ul> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> and <a href="../reference/derivepassphrase-export-vault.1/"><code>derivepassphrase export vault</code></a>, support changing the amount of diagnostic output we emit via new command-line options <code>--debug</code>, <code>-v</code>/<code>--verbose</code> and <code>-q</code>/<code>--quiet</code>. Internally, we use Python’s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a> systems.</p> </li> <li> <p>Use a central configuration file, and additional data files, some of which are service-specific. (The <code>vault.json</code> configuration file is now rebranded as a data file.) The configuration files are user-editable, the data files are <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>-editable.</p> <p>The configuration files are in TOML format, so installing <code>derivepassphrase</code> on Python 3.10 and older requires the <a href="https://pypi.org/project/tomli/"><code>tomli</code></a> package.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault --config</code></a>, support an <code>--unset</code> option which unsets any given named setting prior to applying any other configuration changes.</p> </li> <li> <p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault --export</code></a>, support exporting the current configuration as a POSIX <code>sh</code> script, using the <code>--export-as=sh</code> option. The default (and previous behavior) is <code>--export-as=json</code>.</p> </li> <li> <p>Include basic support for localization: if the necessary translations are installed, then the diagnostics and help texts can be emitted in different languages. Internally, we use Python’s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/gettext.html#module-gettext"><code>gettext</code></a> system.</p> <p>(As of this version, no translations have actually been prepared yet.)</p> </li> <li> <p>For <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>, explicitly support shell completion, in particular filename and service name completion in the <a href="../reference/derivepassphrase-export-vault.1/"><code>export vault</code></a> and <a href="../reference/derivepassphrase-vault.1/"><code>vault</code></a> subcommands.</p> <p>However, because of restrictions regarding the exchange of data between <code>derivepassphrase</code> and the shell, <code>derivepassphrase</code> will not offer any service names containing ASCII control characters for completion, and a warning will be issued when importing or configuring such a service. They may still otherwise be used normally.</p> </li> <li> <p><b id="added-in-v0.4.0-color-support">Support the semi-standard <code>NO_COLOR</code> and the <code>FORCE_COLOR</code> environment variables</b> to suppress or force color output from <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>. (<code>FORCE_COLOR</code> overrides <code>NO_COLOR</code> if both are set.)</p> </li> </ul> <h3 id="changed-in-v0.4.0">Changed<a class="headerlink" href="#changed-in-v0.4.0" title="Permanent link">¶</a></h3> <ul> <li> <p>Calling <a class="autorefs autorefs-internal" title=" derivepassphrase_export" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase_export"><code>derivepassphrase_export</code></a>, <a class="autorefs autorefs-internal" title=" derivepassphrase_export_vault" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase_export_vault"><code>derivepassphrase_export_vault</code></a> or <a class="autorefs autorefs-internal" title=" derivepassphrase_vault" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase_vault"><code>derivepassphrase_vault</code></a>, or calling <a class="autorefs autorefs-internal" title=" derivepassphrase" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase"><code>derivepassphrase</code></a> via its <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/stable/api/#click.Command.main"><code>.main</code></a> method, causes those functions to use the standard Python <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a> facilities to issue diagnostic messages, without output to standard error. (This includes using <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/stable/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a>, which uses <code>.main</code> calls under the hood.) Calling <a class="autorefs autorefs-internal" title=" derivepassphrase" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase"><code>derivepassphrase</code></a> directly as a function diverts diagnostic messages to standard error.</p> </li> <li> <p>Unicode normalization settings for <code>vault</code> service names and stored passphrases are now stored in the central configuration file, instead of the <code>vault</code> data file.</p> </li> <li> <p><code>derivepassphrase</code> changed its license from <a href="https://spdx.org/licenses/MIT.html">MIT</a> to <a href="https://spdx.org/licenses/Zlib.html">zlib/libpng</a>. This should only make a difference to people redistributing altered versions of <code>derivepassphrase</code>; the basic freedoms, and the combinability of <code>derivepassphrase</code> with other software should be unaffected.</p> </li> </ul> <h2 id="v0.3.3">0.3.3 (2024-11-28)<a class="headerlink" href="#v0.3.3" title="Permanent link">¶</a></h2> <h3 id="added-in-v0.3.3">Added<a class="headerlink" href="#added-in-v0.3.3" title="Permanent link">¶</a></h3> <ul> <li>Checking whether an SSH key is suitable now also depends on the SSH agent in use. API functions now optionally take an additional <a class="autorefs autorefs-internal" title=" SSHAgentClient" href="../reference/derivepassphrase.ssh_agent/#derivepassphrase.ssh_agent.SSHAgentClient"><code>SSHAgentClient</code></a> object to test agent-specific key suitability. If not given, then the old behavior is retained: SSH keys are suitable if they are suitable under any (conforming) SSH agent.</li> </ul> <h3 id="fixed-in-v0.3.3">Fixed<a class="headerlink" href="#fixed-in-v0.3.3" title="Permanent link">¶</a></h3> <ul> <li>If the SSH agent supports deterministic DSA/ECDSA signatures (e.g. <a href="https://www.rfc-editor.org/rfc/rfc6979">RFC 6979</a>), then mark DSA and ECDSA SSH keys as suitable.</li> </ul> <h2 id="v0.3.2">0.3.2 (2024-10-21)<a class="headerlink" href="#v0.3.2" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.3.2">Fixed<a class="headerlink" href="#fixed-in-v0.3.2" title="Permanent link">¶</a></h3> <ul> <li><em><em>Actually</em> actually</em> remove the <code>derivepassphrase_export</code> program, which was turned into a subcommand in v0.2.0 and supposed to have been removed in v0.3.1 already. Removed on disk is not the same as removed in version control.</li> </ul> <h2 id="v0.3.1">0.3.1 (2024-10-21)<a class="headerlink" href="#v0.3.1" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.3.1">Fixed<a class="headerlink" href="#fixed-in-v0.3.1" title="Permanent link">¶</a></h3> <ul> <li>Fix PyPI classification: Python 3.9 is supported.</li> <li><em>Actually</em> remove the <code>derivepassphrase_export</code> program, which was turned into a subcommand in v0.2.0.</li> </ul> <h2 id="v0.3.0">0.3.0 (2024-10-15)<a class="headerlink" href="#v0.3.0" title="Permanent link">¶</a></h2> <h3 id="added-in-v0.3.0">Added<a class="headerlink" href="#added-in-v0.3.0" title="Permanent link">¶</a></h3> <ul> <li>Convert changelog management from towncrier to <a href="https://pypi.org/project/scriv/">scriv</a>.</li> <li>Add SSH agent spawning support to the test suite. Use this support to test the agent functionality on all known major SSH agent implementations automatically. →<a href="../wishlist/test-suite-isolated-ssh-agent/" title="Wish entry: “Support and isolate OpenSSH's ssh-agent and PuTTY's pageant in the test suite”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></li> <li>Add <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests to the test suite.</li> <li>Update README to add explanations for virtual environments and package extras.</li> <li>Update README to demonstrate configuration storing and SSH agent use. Include comments on Windows support for SSH agents. →<a href="../wishlist/windows-ssh-agent-support/" title="Bug entry: “Support PuTTY/Pageant (and maybe OpenSSH/ssh-agent) on Windows”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Use cross-references in the documentation of function signatures.</li> <li>Add proper support for Buffer types in the SSH agent client. Any Python object supporting the buffer protocol can be used as input to a function of the client, and any output from the client is returned as bytes objects. Because of the zero-copy semantics of the underlying data/memory block, this should stay relatively time- and space-efficient.</li> <li>Add <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests for serialization to and deserialization from the SSH agent wire format.</li> <li>Support Python 3.9 and 3.13.</li> </ul> <h3 id="changed-in-v0.3.0">Changed<a class="headerlink" href="#changed-in-v0.3.0" title="Permanent link">¶</a></h3> <ul> <li> <p>Change links to point to public project repositories, if possible. For legal reasons.</p> </li> <li> <p>Use the same filename/URL convention for API reference as the Python standard library does.</p> </li> <li> <p>Rewrite functionality for checking for valid <i>vault</i>(1) configurations: include an actual validation function which throws errors upon encountering format violations, and which allows specifying which types of extensions (unknown settings, <code>derivepassphrase</code>-only settings) to tolerate during validation.</p> <p>This is a <strong>breaking API change</strong> because the function return annotation changed, from <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/typing.html#typing.TypeGuard"><code>typing.TypeGuard</code></a> to <a class="autorefs autorefs-external" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.TypeIs"><code>typing_extensions.TypeIs</code></a>. These were the originally intended semantics, but when <code>derivepassphrase</code> was first designed, the Python type system did not support this kind of partial type narrowing.</p> </li> <li> <p>Fail earlier, and more gracefully/specifically, when we cannot talk to the SSH agent because Python does not support UNIX domain sockets on this system. In particular, this is the current situation on Windows. →<a href="../wishlist/fail-gracefully-without-af-unix/" title="Bug entry: “Fail gracefully if support for UNIX domain sockets is unavailable”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a> <a href="../wishlist/windows-ssh-agent-support/" title="Bug entry: “Support PuTTY/Pageant (and maybe OpenSSH/ssh-agent) on Windows”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> <p>This adds another failure case to the <code>SSHAgentClient</code> constructor, and therefore constitutes a <strong>breaking API change</strong>.</p> </li> <li> <p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, accept <code>key</code> and <code>phrase</code> entries just like <i>vault</i>(1) does: <code>key</code> always overrides <code>phrase</code> in the configuration, no matter the level.</p> <p>This is a command-line only change.</p> </li> <li> <p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when importing settings, accept falsy values everywhere <code>vault</code> does, with a warning. Depending on the setting, they are equivalent to zero, the empty string, or “not set”. →<a href="../wishlist/falsy-vault-config-values/" title="Bug entry: “derivepassphrase vault differs from vault(1) behavior with falsy stored configuration values”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> <p>This is a command-line only change, and only affects importing. The API provides a new function to normalize falsy settings, but still otherwise requires settings to be of the correct type. Storing a malformed configuration with such falsy values will still generate errors when <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> loads the settings from disk.</p> </li> <li> <p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when importing configurations, correctly merge them with the existing one, same as <i>vault</i>(1): keep all named services and their settings (and the global settings if applicable) that are not mentioned in the imported configuration. The import procedure is thus more akin to a section-wise import of the configurations, instead of a “full” import, and the resulting configuration generally is a merge of both inputs. →<a href="../wishlist/amend-vault-config/" title="Bug entry: “derivepassphrase vault --import overwrites config instead of amending it”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p> </li> <li> <p>The following operations or configuration settings now raise warnings:</p> <ul> <li>in imported configurations: using falsy values of the wrong type</li> <li>in imported configurations: using falsy values with no practical effect</li> <li>setting a passphrase in the configuration if a key is already set</li> <li>using an empty service name on the command-line or in an imported configuration</li> </ul> </li> </ul> <h3 id="fixed-in-v0.3.0">Fixed<a class="headerlink" href="#fixed-in-v0.3.0" title="Permanent link">¶</a></h3> <ul> <li>Fixed the textual description of the return value for <a class="autorefs autorefs-internal" title=" request" href="../reference/derivepassphrase.ssh_agent/#derivepassphrase.ssh_agent.SSHAgentClient.request"><code>SSHAgentClient.request</code></a>, which didn’t match the declared type annotation.</li> </ul> <h2 id="v0.2.0">0.2.0 (2024-09-12)<a class="headerlink" href="#v0.2.0" title="Permanent link">¶</a></h2> <h3 id="added-in-v0.2.0">Added<a class="headerlink" href="#added-in-v0.2.0" title="Permanent link">¶</a></h3> <ul> <li> <p>Support configuration data export from <code>vault</code> in v0.2, v0.3 and storeroom formats.</p> <p>This feature requires the <code>cryptography</code> Python module, but is available even if <code>vault</code> is not installed. →<a href="../wishlist/export-vault-formats/" title="Wish entry: “Support data export from vault v0.2, vault v0.3, and storeroom storage formats”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> </ul> <h3 id="fixed-in-v0.2.0">Fixed<a class="headerlink" href="#fixed-in-v0.2.0" title="Permanent link">¶</a></h3> <ul> <li>Deploy versioned documentation with <a href="https://pypi.org/project/mike/">mike</a>. Set up a “latest” tag and the “0.<var>x</var>” version of the documentation with the contents so far.</li> </ul> <h3 id="changed-in-v0.2.0">Changed<a class="headerlink" href="#changed-in-v0.2.0" title="Permanent link">¶</a></h3> <ul> <li>Changed <code>sequin</code> and <code>ssh_agent_client</code> to be submodules of <code>derivepassphrase</code>. Further moved <code>derivepassphrase.Vault</code> and <code>derivepassphrase.AmbiguousByteRepresentation</code> into a new submodule <code>vault</code>, and renamed submodule <code>ssh_agent_client</code> to <code>ssh_agent</code>. →<a href="../wishlist/single-toplevel-module/" title="Bug entry: “Move sequin and ssh_agent_client modules into derivepassphrase package”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Changed internal error handling and error messages, to better work in the context of a command-line tool. →<a href="../wishlist/better-error-messages/" title="Bug entry: “Improve common error messages in the command-line interface”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Combine and consolidate <code>derivepassphrase.types</code> and <code>derivepassphrase.ssh_agent.types</code> into a new submodule <code>derivepassphrase._types</code>. Despite the name, the module is public. →<a href="../wishlist/no-stdlib-module-names/" title="Bug entry: “Rename types submodules to _types”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Warn the user when entering (directly, or via configuration editing/importing) a passphrase that is not in the configured Unicode normalization form. (But don’t otherwise reject any textual master passphrases.) →<a href="../wishlist/allow-all-unicode-passphrases/" title="Bug entry: “Allow all Unicode text strings as master passphrases”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li> <p>Move all existing functionality into a subcommand, in anticipation of other passphrase derivation schemes, with different settings. Automatically forward calls without a subcommand to the “vault” subcommand.</p> <p>Also store the settings in a file specific to the respective subsystem, instead of globally. Automatically fall back to, and migrate, the old global settings file if no subsystem-specific configuration was found. →<a href="../wishlist/other-derivation-schemes/" title="Wish entry: “Consider implementing passphrase schemes other than vault's”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a> <a href="../wishlist/scheme-specific-cli-and-config/" title="Wish entry: “Move vault-specific command-line interface into a separate CLI subcommand and matching configuration file”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> <li> <p>Make <code>derivepassphrase_export</code> a subcommand: <a href="../reference/derivepassphrase-export.1/"><code>derivepassphrase export</code></a>. →<a href="../wishlist/exporter-script-as-subcommand/" title="Wish entry: “Make the exporter a subcommand of derivepassphrase”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 18h-3v-3h-2v3h-3v2h3v3h2v-3h3M6 2a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h7.81c-.36-.62-.61-1.3-.73-2H6V4h7v5h5v4.08c.33-.05.67-.08 1-.08.34 0 .67.03 1 .08V8l-6-6M8 12v2h8v-2m-8 4v2h5v-2Z"/></svg></span></a></p> </li> </ul> <h3 id="deprecated-in-v0.2.0">Deprecated<a class="headerlink" href="#deprecated-in-v0.2.0" title="Permanent link">¶</a></h3> <ul> <li>Using the implied subcommand or the implied global settings file is deprecated, and will be removed in v1.0.</li> </ul> <h2 id="v0.1.3">0.1.3 (2024-07-28)<a class="headerlink" href="#v0.1.3" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.1.3">Fixed<a class="headerlink" href="#fixed-in-v0.1.3" title="Permanent link">¶</a></h3> <ul> <li>Do not crash upon selecting a key on the command-line if there already is a key stored in the configuration. →<a href="../wishlist/one-time-key-override-fails/" title="Bug entry: “derivepassphrase -k fails when overriding the chosen key on the command-line”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Create the configuration directory upon saving, if it does not yet exist. →<a href="../wishlist/configuration-directory-must-exist/" title="Bug entry: “derivepassphrase --config requires configuration directory to exist”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Isolate the tests properly and consistently from the user’s configuration, so that user configuration problems do not cause unrelated test failures. →<a href="../wishlist/test-filesystem-isolation/" title="Bug entry: “Isolate tests properly from the filesystem”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li> <li>Add an alternate MkDocs configuration for building the documentation in offline mode.</li> <li>Fix typing issues according to <code>mypy</code>’s strict mode.</li> </ul> <h2 id="v0.1.2">0.1.2 (2024-07-22)<a class="headerlink" href="#v0.1.2" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.1.2">Fixed<a class="headerlink" href="#fixed-in-v0.1.2" title="Permanent link">¶</a></h3> <ul> <li>Include and exclude the correct files in the <code>sdist</code> and <code>wheel</code> distributions. (Previously, <code>sdist</code> contained VCS artifacts, and <code>wheel</code> was missing some paths.)</li> <li>Lint and reformat all code using <a href="https://pypi.org/project/ruff/">ruff</a>.</li> <li>Mention <a href="https://pypi.org/project/mkdocstrings-python/"><code>mkdocstrings-python</code></a> in the documentation’s page footer.</li> <li>Remove JavaScript and external font loading from documentation website, so that the site works even in restricted browser settings.</li> <li>Set up a changelog, using <a href="https://pypi.org/project/towncrier/">towncrier</a>.</li> </ul> <h2 id="v0.1.1">0.1.1 (2024-07-14)<a class="headerlink" href="#v0.1.1" title="Permanent link">¶</a></h2> <h3 id="fixed-in-v0.1.1">Fixed<a class="headerlink" href="#fixed-in-v0.1.1" title="Permanent link">¶</a></h3> <ul> <li>Restore the <code>__version__</code> attribute in all top-level packages.</li> <li>Declare compatibility with Python 3.10 in project metadata, and include necessary version-specific dependencies.</li> <li>Publish the documentation online, and link to it in the repository metadata and the Python package metadata.</li> </ul> <h2 id="v0.1.0">0.1.0 (2024-07-14)<a class="headerlink" href="#v0.1.0" title="Permanent link">¶</a></h2> <h3 id="added-in-v0.1.0">Added<a class="headerlink" href="#added-in-v0.1.0" title="Permanent link">¶</a></h3> <ul> <li>Initial release.</li> </ul> <div class="footnote"> <hr /> <ol> <li id="fn:the-annoying-os"> <p>Hat tip—and apologies—to <a href="https://github.com/pawamoy/">Timothée Mazzucotelli (<code>@pawamoy</code>)</a> for the fitting terminology. <a class="footnote-backref" href="#fnref:the-annoying-os" title="Jump back to footnote 1 in the text">↩</a></p> </li> </ol> </div> </article> </div> </div> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../explanation/faq-vault-interchangable-passphrases/" class="md-footer__link md-footer__link--prev" aria-label="Previous: "interchangable passphrases" in vault"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> "interchangable passphrases" in vault </div> </div> </a> <a href="../upgrade-notes/" class="md-footer__link md-footer__link--next" aria-label="Next: Upgrade notes"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> Upgrade notes </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Copyright © 2025 Marco Ricci (the-13th-letter) </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> and <a href="https://mkdocstrings.github.io/python/" target="_blank" rel="noopener"> mkdocstrings-python </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> </body> </html>