3.2.1.1 #5301
Replies: 1 comment
-
|
Hi Nils, Thanks a lot for reviewing PR #5298 and including the Bash API client in the release notes! I was checking the repo to verify the setup, but I couldn't locate Also, to support Windows users, I've put together a PowerShell equivalent of the client ( Thanks again for all your work on TeamPass. Best regards, |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
What's Changed
This is a major feature and security release, and the first stable build of the 3.2.1 line (superseding the 3.2.1.0 pre-release). It hardens the cryptographic core, closes nine security advisories (two of them exploitable without authentication), adds a full set of security-posture, governance and productivity features, and introduces configurable RFC 6238 TOTP profiles. Upgrading is strongly recommended for all installations.
On an upgrade, all new features arrive disabled and are opt-in from the admin settings — upgrading alone changes nothing until you enable them. New installations start with the hardened encryption format already enabled.
🔐 Encryption hardening
The cryptographic core has been reworked. The migration is automatic, transparent and reversible: data upgrades itself to the new format as it is read, with no downtime and no re-typing. See the new Encryption hardening page.
aes_v2_write_enabledtoggle (Settings → Security). The previous format stays readable indefinitely.KEY_LENGTH16 → 64). Backward compatible, existing keys still decrypt.--dry-runremediation script cleans up existing data, see Security hardening.🔒 Security fixes
ga_generate_qraction trusted the client-supplieddemand_originfield. Sendingdemand_origin=users_management_listskipped the password check and the "already enrolled" guard, letting an unauthenticated caller overwrite any user's TOTP secret, enumerate logins and probe passwords with no lockout. The administrative right is now derived from the session, the password is mandatory in self-service, the answer is uniform (no enumeration or password oracle), and failures are recorded under the standard anti-bruteforce lock.show_details_itemgate granted metadata reads without checking folder access, exposing label/login/url/email/description of every unrestricted item across all folders, including other users' personal items. The folder predicate is now applied first, so the role restriction is additive and never replaces the folder boundary.typeparameter wrote thepwcolumn verbatim (unhashed, no complexity check) and theadminflag, both outside the manager/admin target-scope guard. Chaining them gave full admin takeover. Both branches removed. An adjacent escalation found during the audit is fixed in the same release:update_users_rights_sharingtargeteddestination_idsrather thanuser_id, so the upstream guard never fired and a manager could setadmin=1on any account, including their own.ItemModel::validateData()called the sanitizer but discarded its return value, so the API stored every field verbatim while the web path encodes. Payloads then rendered raw in the items list and the recycle bin. Sanitization is now applied field by field (passwords and TOTP secrets untouched, so exact bytes are preserved) and both rendering sinks escape their output.itemspage right, which every authenticated user holds, with the client-supplieduserIdas the only scoping predicate. It is now gated on theusersright with a per-target check, and a refusal answers an empty datatable rather than an enumeration oracle.namewhile authorizing an unrelatedfileid. It was dead code and has been removed rather than patched.allow_importre-validated in the handler.✨ New features
Security posture
Governance and compliance (new Governance & compliance settings tab)
Productivity
items_otptable now carries algorithm, digits and period, anotpauth://provisioning URI can be parsed and validated to set them up in one paste, and Base32 secrets are accepted with the spaces and hyphens services display. The API exposes and documents the new fields.Ctrl+Kto search items and pages, scoped to the user's accessible folders.PUT /api/v1/folder/updateandDELETE /api/v1/folder/delete, plus a fix tofolder/createwhich did not rebuild the tree nor populate permissions. Web and API now share oneFolderManagerengine.🛠️ Improvements
GET /api/v1/folder/writableFoldersnow sorts bynested_tree.nleft(MPTT pre-order) and exposes apositionfield, so a client can rebuild the exact folder hierarchy, sibling order included, in a single call. The endpoint is now documented, and thelistFoldersresponse shape was corrected in the docs./authorizeand/authorizeTokennow returnteampass_version,teampass_version_majorandteampass_version_minor(also served bymisc/refreshExtensionSettings), so the browser extension can report the server version without waiting for token expiry.scripts/teampass-cli.sh, a Bash client for the API with single authentication per run, optional PAT mode and 429 handling (contributed by @danfossi, PR #5298).prefers-color-schemeas the first-visit default,:focus-visiblestyling and mobile media queries.🐛 Bug fixes
main.functions.phpstarted an HTTP session at include time, soNativeSessionStorage::start()threw and the upgrade exited with code 255, aborting the whole container.SessionManagernow uses an in-memory session storage under the CLI SAPI, and the Docker entrypoint guards the upgrade so a failure no longer tripsset -e.2fa_not_setanswer left the user on an empty page; an unguarded read of the OAuth2 context also threw and stopped initialization. The box is now restored when MFA is requested or authentication fails, and the context is captured before the store is cleared.getAllUsers()returned an error map on failure while the caller always iterated the result as a user list, producing a fatalCannot access offset of type string on stringinstead of a message. It now returns a proper{error, message, users}envelope, paginates the Graph collection through@odata.nextLink(only the first page was read), and no longer aborts the whole sync on a failingmemberOfcall.escapeshellarg()destroyed the JSON, so every task failed. The worker now reads the payload from the database by task id, which also removes the Windows command-line length limit and keeps encrypted credentials out of the process list.ldap_set_option()requires the integer value, raising a TypeError on PHP 8;LdapExtraalso read a misspelled key that is never written, silently ignoring the admin setting. Both are fixed with a shared conversion helper.browserSession('init')never seeded 15 store keys, sohighlightFavorites/highlightSelectedstayed undefined until a deep-link navigation. The merge logic is rewritten, the highlight settings are re-applied before the first render, and the two divergent favorite flags (is_favourited/is_favorite) are normalized so search results are highlighted too.userPrincipalNamepassed topreg_match()threw a fatal TypeError and aborted the whole synchronization. Such objects are now skipped and counted for diagnostics.add_foldermasked every failure as "you are not allowed to do that" (a regression from 3.1.2) while the real cause was usually a complexity below the parent folder's minimum. The real reason is now returned, and both creation forms preset the selector to the parent's minimum level.public/restructure — the bruteforce unlock link emailed to locked-out users returned HTTP 500. The handler was moved and two latent defects fixed while reviving it (cross-account unlock and ignored timezone).<p><b>coucou</b></p><p&. Descriptions are now normalized into safe plain-text previews before truncation, and the expanded detail renders as sanitized rich HTML.corruption_severityreturned by the backend. The renderer now uses the persisted severity, and the corruption tooltip no longer surfaces raw scanner exception messages to non-admin users.⬆️ Upgrade notes
upgrade_run_3.2.1.phpstep creates the tables for the new features (item_health,user_nudges,rotation_flags,user_notifications,access_reviews,access_review_items,data_classification,import_tracking), extends theotvtable for Secure Send, adds theonboarding_completedcolumn on users, and adds thealgorithm,digitsandperiodcolumns onitems_otpfor the configurable TOTP profiles. NoALTER TABLEis required on the sensitive data tables.aes_v2_write_enabled(Settings → Security) when you are ready; the previous format stays readable indefinitely and the toggle is reversible.--dry-run(the default) first.Full Changelog: 3.2.0.9...3.2.1.1
Important
PHP 8.2Languages
Please join Teampass v3 translation project on Poeditor and translate it for your language.
Installation
Follow instructions from Documentation.
Upgrade
Follow instructions from Documentation.
Ideas and comments
Are welcome ... please use Discussions.
This discussion was created from the release 3.2.1.1.
Beta Was this translation helpful? Give feedback.
All reactions