Skip to content

fix: single Keychain entry for all credentials; prepare v0.5.1 release - #36

Merged
DimazzzZ merged 2 commits into
mainfrom
fix/keychain-single-vault
Sep 23, 2026
Merged

DimazzzZ merged 2 commits into
mainfrom
fix/keychain-single-vault

Conversation

@DimazzzZ

Copy link
Copy Markdown
Owner

Release v0.5.1 (patch)

Fixes the macOS Keychain prompt storm and prepares the 0.5.1 release.

Problem

CredentialsStore kept one PasswordSafe (Keychain) entry per account. macOS ties an "Always Allow" grant to the IDE's code signature, so every IDE update (EAP builds especially) revoked the grant and re-prompted once per account — with ten accounts that meant ten password dialogs after every update.

Fix

  • All secrets now live in a single PasswordSafe entry (TokenPulse — vault), a JSON map accountId → secret, read once per IDE session and cached in memory. An IDE update now costs at most one prompt.
  • Lazy migration: a legacy per-account entry is moved into the vault on first access and then deleted. The vault is written before the legacy entry is removed, so a secret is never lost mid-migration. Missing legacy entries are looked up at most once per session.
  • The public CredentialsStore API is unchanged, so no callers had to change. Storage sits behind an internal SecretBackend seam, which keeps the store unit-testable without PasswordSafe.

Release prep (same as #35)

  • gradle.properties — pluginVersion = 0.5.1
  • CHANGELOG.md — [0.5.1] - 2026-09-23 entry + Quick Navigation row
  • README.md — version badge + Beta callout → 0.5.1
  • DEVELOPMENT.md — example pluginVersion and git tag → 0.5.1
  • WhatsNewNotificationActivity.kt — leads with the Keychain fix and keeps the 0.5.0 highlights
  • plugin.xml — change-notes for 0.5.1, plus the 0.5.0 entry that was missing

Testing

  • New CredentialsStoreTest (10 cases): single vault entry, round-trip, one backend read for 10 accounts, remove, legacy migration + deletion, one-time lookup for missing legacy entries, corrupt vault.
  • ./gradlew test platformTest koverVerify detekt — 791 tests, 0 failures.
  • ./gradlew verifyPlugin against IU-2026.2.3 — Compatible.

Known limitation

If the user clicks Deny on the single vault prompt, the store treats the vault as empty for that session. Adding or editing an account in that same session then overwrites the vault, and secrets already migrated into it are lost. Secrets not yet migrated stay in their per-account entries.

After merge

Tag v0.5.1 on the merge commit and push — release.yml handles the rest.

macOS ties a Keychain "Always Allow" grant to the IDE code signature, so
every IDE (especially EAP) update re-prompted once per stored account.

CredentialsStore now keeps every secret in one PasswordSafe entry (a JSON
vault accountId -> secret), read once per session and cached in memory.
Legacy per-account entries are migrated into the vault on first access
and deleted, so after migration an IDE update costs a single prompt.
Bump pluginVersion to 0.5.1, add the 0.5.1 CHANGELOG entry, update the
README/DEVELOPMENT version references, the What's New notification and
the Marketplace change-notes (backfilling the missing 0.5.0 entry).
@DimazzzZ DimazzzZ self-assigned this Sep 23, 2026
@DimazzzZ DimazzzZ added the type: bug Defect or unexpected behavior label Sep 23, 2026
@DimazzzZ
DimazzzZ merged commit 2275bb7 into main Sep 23, 2026
4 checks passed
@DimazzzZ
DimazzzZ deleted the fix/keychain-single-vault branch September 23, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: bug Defect or unexpected behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant