2303 Commits

Author SHA1 Message Date
Dominik Schulz f4f2d9a4bf chore: Fix age tests (#3561)
Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2026-08-21 22:41:00 +02:00
Pavel Lavrukhin 867f54d563 tools: add SSA semantic duplicate analyzer (#3558)
* tools: add SSA semantic duplicate analyzer

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

* run go mod tidy

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>

---------

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
Co-authored-by: Dominik Schulz <dominik.schulz@gauner.org>
2026-08-21 22:36:46 +02:00
Daniel Lublin 19e4aa4410 fix: require --age-sshkeys (or age.sshkeys config) to access ~/.ssh (#3525)
This makes actual functionality follow status quo documentation. Also
does not access ~/.ssh unless user ir explicit about that.

If age.ssh-key-path is set, it is loaded in addition to age.sshkeys, if
that is enabled, or instead of those, if not.

Fixes #3522

Signed-off-by: Daniel Lublin <daniel@lublin.se>
2026-08-21 19:07:53 +02:00
Pavel Lavrukhin 2b095cb7f7 refactor(age): share identity file parsing (#3559)
Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
2026-08-21 11:28:04 +02:00
dependabot[bot] f4a6c85977 chore(deps): bump github/codeql-action/upload-sarif (#3550)
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.3 to 4.37.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 11:24:18 +02:00
dependabot[bot] be89f246a6 chore(deps): bump github.com/ProtonMail/go-crypto from 1.3.0 to 1.4.1 (#3548)
Bumps [github.com/ProtonMail/go-crypto](https://github.com/ProtonMail/go-crypto) from 1.3.0 to 1.4.1.
- [Release notes](https://github.com/ProtonMail/go-crypto/releases)
- [Commits](https://github.com/ProtonMail/go-crypto/compare/v1.3.0...v1.4.1)

---
updated-dependencies:
- dependency-name: github.com/ProtonMail/go-crypto
  dependency-version: 1.4.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 11:23:51 +02:00
dependabot[bot] 24d777eb38 chore(deps): bump the terminal group across 1 directory with 4 updates (#3542)
Bumps the terminal group with 4 updates in the / directory: [github.com/fatih/color](https://github.com/fatih/color), [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable), [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) and [github.com/mattn/go-tty](https://github.com/mattn/go-tty).


Updates `github.com/fatih/color` from 1.18.0 to 1.19.0
- [Release notes](https://github.com/fatih/color/releases)
- [Commits](https://github.com/fatih/color/compare/v1.18.0...v1.19.0)

Updates `github.com/mattn/go-colorable` from 0.1.14 to 0.1.15
- [Commits](https://github.com/mattn/go-colorable/compare/v0.1.14...v0.1.15)

Updates `github.com/mattn/go-isatty` from 0.0.20 to 0.0.24
- [Commits](https://github.com/mattn/go-isatty/compare/v0.0.20...v0.0.24)

Updates `github.com/mattn/go-tty` from 0.0.7 to 0.0.8
- [Commits](https://github.com/mattn/go-tty/compare/v0.0.7...v0.0.8)

---
updated-dependencies:
- dependency-name: github.com/fatih/color
  dependency-version: 1.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: terminal
- dependency-name: github.com/mattn/go-colorable
  dependency-version: 0.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: terminal
- dependency-name: github.com/mattn/go-isatty
  dependency-version: 0.0.24
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: terminal
- dependency-name: github.com/mattn/go-tty
  dependency-version: 0.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: terminal
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 11:23:31 +02:00
dependabot[bot] 91805367aa chore(deps): bump github.com/gopasspw/gopass-hibp from 1.15.18 to 1.16.1 (#3549)
Bumps [github.com/gopasspw/gopass-hibp](https://github.com/gopasspw/gopass-hibp) from 1.15.18 to 1.16.1.
- [Release notes](https://github.com/gopasspw/gopass-hibp/releases)
- [Changelog](https://github.com/gopasspw/gopass-hibp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gopasspw/gopass-hibp/compare/v1.15.18...v1.16.1)

---
updated-dependencies:
- dependency-name: github.com/gopasspw/gopass-hibp
  dependency-version: 1.16.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:46:33 +02:00
dependabot[bot] 26fca24732 chore(deps): bump the golang-x group across 1 directory with 6 updates (#3541)
Bumps the golang-x group with 2 updates in the / directory: [golang.org/x/crypto](https://github.com/golang/crypto) and [golang.org/x/oauth2](https://github.com/golang/oauth2).


Updates `golang.org/x/crypto` from 0.52.0 to 0.55.0
- [Commits](https://github.com/golang/crypto/compare/v0.52.0...v0.55.0)

Updates `golang.org/x/mod` from 0.35.0 to 0.38.0
- [Commits](https://github.com/golang/mod/compare/v0.35.0...v0.38.0)

Updates `golang.org/x/net` from 0.54.0 to 0.57.0
- [Commits](https://github.com/golang/net/compare/v0.54.0...v0.57.0)

Updates `golang.org/x/oauth2` from 0.33.0 to 0.36.0
- [Commits](https://github.com/golang/oauth2/compare/v0.33.0...v0.36.0)

Updates `golang.org/x/sys` from 0.45.0 to 0.47.0
- [Commits](https://github.com/golang/sys/compare/v0.45.0...v0.47.0)

Updates `golang.org/x/term` from 0.43.0 to 0.45.0
- [Commits](https://github.com/golang/term/compare/v0.43.0...v0.45.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.55.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
- dependency-name: golang.org/x/mod
  dependency-version: 0.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
- dependency-name: golang.org/x/net
  dependency-version: 0.57.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
- dependency-name: golang.org/x/oauth2
  dependency-version: 0.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
- dependency-name: golang.org/x/sys
  dependency-version: 0.47.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
- dependency-name: golang.org/x/term
  dependency-version: 0.45.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:45:55 +02:00
dependabot[bot] bad4c1564d chore(deps): bump github/codeql-action/init from 4.37.3 to 4.37.7 (#3554)
Bumps [github/codeql-action/init](https://github.com/github/codeql-action) from 4.37.3 to 4.37.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd)

---
updated-dependencies:
- dependency-name: github/codeql-action/init
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:44:55 +02:00
dependabot[bot] fd0ff4e3d8 chore(deps): bump step-security/harden-runner from 2.20.0 to 2.20.1 (#3556)
Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.20.0 to 2.20.1.
- [Release notes](https://github.com/step-security/harden-runner/releases)
- [Commits](https://github.com/step-security/harden-runner/compare/bf7454d06d71f1098171f2acdf0cd4708d7b5920...b09bb98e06d4d774595224525879c09bc6e98c40)

---
updated-dependencies:
- dependency-name: step-security/harden-runner
  dependency-version: 2.20.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:43:18 +02:00
dependabot[bot] 73c7fb50be chore(deps): bump github.com/stretchr/testify from 1.11.1 to 1.12.0 (#3546)
Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.11.1 to 1.12.0.
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](https://github.com/stretchr/testify/compare/v1.11.1...v1.12.0)

---
updated-dependencies:
- dependency-name: github.com/stretchr/testify
  dependency-version: 1.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:38:52 +02:00
dependabot[bot] 8b2fe80b14 chore(deps): bump github.com/urfave/cli/v3 from 3.9.0 to 3.10.1 (#3547)
Bumps [github.com/urfave/cli/v3](https://github.com/urfave/cli) from 3.9.0 to 3.10.1.
- [Release notes](https://github.com/urfave/cli/releases)
- [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/urfave/cli/compare/v3.9.0...v3.10.1)

---
updated-dependencies:
- dependency-name: github.com/urfave/cli/v3
  dependency-version: 3.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:38:15 +02:00
dependabot[bot] 052fffe274 chore(deps): bump github/codeql-action/autobuild from 4.37.3 to 4.37.7 (#3553)
Bumps [github/codeql-action/autobuild](https://github.com/github/codeql-action) from 4.37.3 to 4.37.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd)

---
updated-dependencies:
- dependency-name: github/codeql-action/autobuild
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:37:38 +02:00
dependabot[bot] 5e0532e955 chore(deps): bump github/codeql-action/analyze from 4.37.3 to 4.37.7 (#3555)
Bumps [github/codeql-action/analyze](https://github.com/github/codeql-action) from 4.37.3 to 4.37.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81...ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd)

---
updated-dependencies:
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-21 10:27:04 +02:00
Pavel Lavrukhin cacbc237ac test(gpg): isolate package GnuPG home (#3557)
* test(gpg): isolate package GnuPG home

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

* test(gpg): normalize test home on Windows

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

---------

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
2026-08-21 10:26:25 +02:00
Zexin Yuan 1a8eff00e5 docs: replace retired Go Report Card badge with golangci-lint CI badge (#3560)
Go Report Card has been retired, so the badge no longer renders useful
status. Replace it with a GitHub Actions workflow status badge for our
golangci-lint workflow, styled like the existing build status badge.

Assisted-by: Claude-Code:GLM-5.3

Signed-off-by: Zexin Yuan <git@yzx9.xyz>
2026-08-21 10:24:45 +02:00
Pavel Lavrukhin f17aff3918 ci: update golangci-lint to v2.13.1 and migrate gomodguard (#3498)
* ci: bump golangci-lint to v2.12.2 and migrate gomodguard to gomodguard_v2

golangci-lint v2.12.0 deprecated the gomodguard linter in favour of
gomodguard_v2. Running the current .golangci.yml under v2.12.2 emits:

    The linter 'gomodguard' is deprecated (since v2.12.0) due to:
    new major version. Replaced by gomodguard_v2.

Bump both pins (Makefile and the golangci-lint-action workflow) and rename
the linter in one commit: naming gomodguard_v2 while CI still ran v2.11.4
would hard-fail the lint job on an unknown linter.

The rename carries no semantic change -- .golangci.yml has no
settings.gomodguard block, so the linter is currently allow-everything.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* ci: update golangci-lint to v2.13.1

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

---------

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 23:00:57 +02:00
Pavel Lavrukhin d0bb2fea57 fix: eliminate audit, queue, and test initialization races (#3540)
* fix(audit): initialize progress before workers

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

* test: serialize global main state

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

* fix(store): avoid queued context capture race

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

* refactor(store): discard noop queue context

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

---------

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
2026-08-20 22:59:36 +02:00
dependabot[bot] 6eaa853c3b chore(deps): bump github.com/twpayne/go-pinentry/v4 from 4.0.0 to 4.0.1 (#3543)
Bumps [github.com/twpayne/go-pinentry/v4](https://github.com/twpayne/go-pinentry) from 4.0.0 to 4.0.1.
- [Commits](https://github.com/twpayne/go-pinentry/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: github.com/twpayne/go-pinentry/v4
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 22:57:25 +02:00
dependabot[bot] 38ae9ce4a8 chore(deps): bump github.com/godbus/dbus/v5 from 5.1.0 to 5.2.2 (#3551)
Bumps [github.com/godbus/dbus/v5](https://github.com/godbus/dbus) from 5.1.0 to 5.2.2.
- [Release notes](https://github.com/godbus/dbus/releases)
- [Commits](https://github.com/godbus/dbus/compare/v5.1.0...v5.2.2)

---
updated-dependencies:
- dependency-name: github.com/godbus/dbus/v5
  dependency-version: 5.2.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 22:54:37 +02:00
dependabot[bot] 6522e82788 chore(deps): bump go.yaml.in/yaml/v3 from 3.0.4 to 3.0.5 (#3552)
Bumps [go.yaml.in/yaml/v3](https://github.com/yaml/go-yaml) from 3.0.4 to 3.0.5.
- [Commits](https://github.com/yaml/go-yaml/compare/v3.0.4...v3.0.5)

---
updated-dependencies:
- dependency-name: go.yaml.in/yaml/v3
  dependency-version: 3.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 22:54:00 +02:00
Pavel Lavrukhin d5a7cb18c7 ci: restore security workflow reliability (#3538)
Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>
2026-08-20 22:11:42 +02:00
Pavel Lavrukhin 1ac7645300 ci(deps): add gomod ecosystem, cooldown and grouping to dependabot (#3501)
.github/dependabot.yml only configured the github-actions ecosystem, so Go
module updates were never raised. The result is 18 outdated direct
dependencies in go.mod today, including golang.org/x/net 0.47 -> 0.57 and
golang.org/x/crypto 0.45 -> 0.54. Dependabot did open #3490 for x/crypto,
but only because that is a security advisory, which it raises without any
configuration.

Add the gomod ecosystem on a weekly schedule, and:

- cooldown on both ecosystems, so a freshly published release has a few
  days to be pulled if it turns out to be broken or compromised before we
  adopt it. Go major bumps get 30 days; patch releases get 3.
- a golang-x group, because golang.org/x/* modules move in lockstep and
  pull each other in transitively -- one pull request per module produces
  a pile of mutually conflicting branches.
- a terminal group for the mattn/* and fatih/color modules, which are all
  small and share one manual smoke test.
- an explicit commit-message prefix, so the "chore(deps):" subjects the
  repository already gets are configured rather than inferred from history.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 22:10:32 +02:00
Pavel Lavrukhin 276de5ea3c ci: pin dependabot/fetch-metadata by SHA and annotate action versions (#3500)
.github/workflows/build.yml pinned dependabot/fetch-metadata to the
mutable @v3 tag while every other action in the repository is pinned by
commit SHA. A mutable tag can be repointed at arbitrary code by anyone who
can push to that repository, and this particular step runs in a job that
auto-approves and squash-merges pull requests. OpenSSF Scorecard reports
this under Pinned-Dependencies, and .github/workflows/scorecard.yml is
enabled here.

v3 and v3.1.0 currently resolve to the same commit
(25dd0e34f4fe68f24cc83900b1fe3fe149efef98, verified via the GitHub API),
so this is a pure pin with no version change.

While here, add the missing "# vX.Y.Z" comments to the four docker/*
actions that were pinned by SHA without one, so every "uses:" line in the
repository states which release the SHA corresponds to. Tags verified via
the GitHub API against each pinned SHA; no SHAs were changed.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-20 22:09:04 +02:00
Copilot 38f9248b64 fix(updater): cap archive/icon extraction writes and surface oversize errors (#3530)
* Initial plan

* fix(updater): bound extraction copy sizes

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

* fix(notify): clean up icon file on write errors

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-20 21:49:55 +02:00
Copilot 1a0ecb4bc0 fix: honor core.autopush during root-store move operations (#3535)
* Initial plan

* fix: honor core.autopush in root move push path

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-20 21:46:54 +02:00
Copilot 402c780801 fix: highlight linked secrets in ls output (#3536)
* Initial plan

* fix: highlight linked secrets in tree output

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-20 21:07:05 +02:00
Dominik Schulz a86172d474 chore(updater): Add 2026 release signing key (#3534)
The 2025 key is about to expire in a few months and we need
to make a release with the new key soon or we risk breaking
the upgrade workflow.

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2026-08-20 21:05:32 +02:00
Copilot 7ab7ba2b63 fix(pwgen): remove math/rand fallback (#3531)
* Initial plan

* fix(pwgen): remove math/rand fallback

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@example.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-20 10:05:57 +02:00
Copilot de38cfaff1 fix: add hidden pull and push commands (#3532)
* Initial plan

* fix: add hidden pull and push commands

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

* test: cover hidden pull and push commands

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-20 10:05:12 +02:00
Dominik Schulz c4fa655746 ci(updater): move key expiration canary test to dedicated workflow (#3533)
Move TestGPGVerifyIn6Months from verify_test.go to verify_canary_test.go
behind the canary build tag. This prevents upcoming key expiration from
failing the standard test suite and obscuring other test results.

Add a dedicated GitHub Actions workflow (key-canary.yml) that runs the
canary test on push, pull request, and a weekly schedule. When the
updater signing key is within 6 months of expiration, the canary workflow
will fail in isolation, providing a clear indication in the Actions
summary.

Closes #3523

Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
2026-08-19 20:59:51 +02:00
Copilot f697302102 fix: drain background queue before exiting on failure (#3528)
* Initial plan

* fix: drain the background queue before exiting on failure

Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: dominikschulz <1449175+dominikschulz@users.noreply.github.com>
2026-08-19 20:28:14 +02:00
Zexin Yuan d060513d7d fix(age): raise agent scanner buffer limit to handle large decrypt payloads (#3529)
The age agent read its line-oriented protocol with a default
bufio.Scanner, which caps lines at 64 KiB (bufio.MaxScanTokenSize).
The decrypt command carries the base64-encoded ciphertext on a
single line, so any secret larger than ~48 KiB made scanner.Scan()
fail with bufio.ErrTooLong, silently dropping the connection and
leaving the client with EOF (e.g. "failed to send identities to
agent: EOF" from gopass age agent unlock).

Raise the scanner buffer cap to 16 MiB, matching the
privateKeySizeLimit already used when parsing identities. No buffer
is preallocated: the scanner starts at bufio's small initial size and
only doubles as the longest line actually received requires, so
this does not allocate anything upfront. Also log
scanner.Err() so future scan failures are no longer silent.

Implements Option 1 from #3508. A chunked or length-prefixed
protocol (Option 2) requires agent protocol versioning first.

Signed-off-by: Zexin Yuan <git@yzx9.xyz>

Assisted-by: Claude-Code:GLM-5.2
2026-08-17 21:56:47 +02:00
Pavel Lavrukhin 7cef068ed9 test(action): use t.Chdir instead of manual os.Chdir save/restore (#3499)
golangci-lint's usetesting linter flags both the os.Chdir call and its
deferred restore in TestBinaryCopyNameAmbiguity. t.Chdir does the same
thing and registers the restore with the testing framework, so it also
runs when the test fails early.

Safe here: the test does not call t.Parallel (t.Chdir panics if it does),
and it already mutates the global out.Stdout, so it is inherently serial.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 10:56:09 +02:00
Ryosuke Akiyama 7ce984eb74 fix(tempfile): mount macOS ramdisk read-write (#3527)
diskutil mount without an explicit "rw" mount option can mount the
ramdisk read-only, causing gopass edit to fail with "Read-only file
system" when writing the temporary plaintext file. Pass "rw,noatime"
explicitly to -mountOptions so the ramdisk is always mounted
read-write.

Signed-off-by: Ryosuke Akiyama <r@554.jp>
2026-08-12 13:22:50 +02:00
carfeii 4f76ed537d Merge commit from fork
Get, Set, Move, Delete, and Exists all validate a name resolves to a
path under the store root via safePath before touching the
filesystem. IsDir and Prune build their path directly with an
unguarded filepath.Join instead. Prune then calls os.RemoveAll on that
unguarded path, so a name containing ../ segments deletes a directory
tree entirely outside the store root.

Route both functions through safePath, matching the other five. Doing
so surfaces a related bug in safePath itself: its traversal check
required a trailing path separator after the store root, which
incorrectly rejected the store root's own path (name "" or ".") as a
traversal. This was never exercised by the four functions already
using it, but is reachable once IsDir is corrected (a store's own
root is a legitimate "is this a directory" query, e.g. for a mounted
sub-store). Fixed by also accepting the resolved path being exactly
equal to the store root.

Adds a regression test covering both functions against a traversal
payload.

Co-authored-by: Gogs <gogs@fake.local>
2026-08-12 13:21:17 +02:00
Q-er ebc51bdd4a feat(gpg): support v5/v6 PGP keys with 64-character fingerprints (#3496)
GnuPG 2.5+ can produce v5 keys (e.g. with PQC algorithms like
ky768_cv25519) whose fingerprints are 64 hex characters instead of
the traditional 40. The colons-output parser and Key.ID() only
expected 40-character fingerprints, causing v5 keys to be silently
ignored or to produce empty short IDs.

- Key.ID(): add a branch for 64-char fingerprints, taking the first
  16 characters as the short ID (matching GnuPG's own convention).
- ReadNamesFromKey/GetFingerprint: replace ProtonMail/go-crypto
  openpgp calls with gpg --show-keys --with-colons, since go-crypto
  does not support v5 key packets and fails to parse them.
- Add unit tests for v5 key parsing and ID extraction.

Signed-off-by: Q-er <q-er@mailbox.org>
2026-08-12 12:30:11 +02:00
Zexin Yuan 5ce247f892 docs: point Android clients to the maintained agrahn fork (#3524)
The original Android Password Store projects (zeapo/Android-Password-Store
and android-password-store/Android-Password-Store) are archived and no
longer maintained. Update the docs to reference the active fork
agrahn/Android-Password-Store, distributed via F-Droid (app.passwordstore.agrahn).

Signed-off-by: Zexin Yuan <git@yzx9.xyz>
2026-08-11 09:49:25 +02:00
dependabot[bot] a938330f63 chore(deps): bump msys2/setup-msys2 from 2.31.1 to 2.32.0 (#3475)
Bumps [msys2/setup-msys2](https://github.com/msys2/setup-msys2) from 2.31.1 to 2.32.0.
- [Release notes](https://github.com/msys2/setup-msys2/releases)
- [Changelog](https://github.com/msys2/setup-msys2/blob/main/CHANGELOG.md)
- [Commits](https://github.com/msys2/setup-msys2/compare/e9898307ac31d1a803454791be09ab9973336e1c...66cd2cce69caa17b53920067426061ca1de3a884)

---
updated-dependencies:
- dependency-name: msys2/setup-msys2
  dependency-version: 2.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 23:13:59 +02:00
dependabot[bot] 2c290d9d68 chore(deps): bump golang.org/x/crypto from 0.45.0 to 0.52.0 (#3490)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.45.0 to 0.52.0.
- [Commits](https://github.com/golang/crypto/compare/v0.45.0...v0.52.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.52.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 23:13:37 +02:00
Ivan Kovnatsky 0ad084f651 fix: use imperative mood in generated commit messages (#3492)
I am trying gopass as an enhanced alternative to pass and as a backup vault
for my primary password manager. I used pass occasionally for many years and
noticed that gopass uses the past tense in some generated commit messages.

Even though it is really a nit, I see the usual pass commit messages alongside
gopass's slightly off past-tense ones in the same vault as I adapt to using
gopass.

This aligns those messages with the imperative-mood convention accepted in
#1222.

Most changes were edited and reviewed with AI assistance.

Signed-off-by: Ivan Kovnatsky <75213+ivankovnatsky@users.noreply.github.com>
2026-08-10 23:12:59 +02:00
Zexin Yuan 9c71d39e00 feat(pwgen): add memorable generator support (#3494)
Add the memorable (BIP39 word-based) generator to the pwgen subcommand via
the existing pwgen.GenerateMemorablePassword, matching what generate already
supports.

- --memorable (-m) and --memorable-capitalize (--mc) flags; dispatch to
  memorableGen after the xkcd branch (matching flag-registration order).
- memorableGen reuses --symbols, reads pwgen.memorable-capitalize config
  (overridden by --memorable-capitalize and --no-capitalize), and rejects
  the contradictory --no-numerals since memorable always injects a digit
  per word.
- --memorable and --xkcd are mutually exclusive (both select a generator):
  combining them is a usage error rather than a silent precedence choice.
- Fix ArgsUsage to [length] [count].
- Document flags in docs/commands/pwgen.md and the config key in docs/config.md.

Assisted-by: Claude-Code:GLM-5.2

Signed-off-by: Zexin Yuan <git@yzx9.xyz>
2026-08-10 23:12:05 +02:00
Pavel Lavrukhin cb53065994 feat(changelog): migrate to Keep a Changelog 1.1.0 (#3506)
* docs(adr): resolve the A-13 collision, zero-pad numbers and add an index

Two records carried the number A-13:

  docs/adr/A-13-expired-gpg-key-handling.md
  docs/adr/A-13-screenshot-build-tag.md

An ADR number is a stable identifier, so a duplicate makes every citation
ambiguous. A-13-expired-gpg-key-handling.md keeps the number: it is cited
from docs/commands/recipients.md, docs/usecases/team-workflows.md and
docs/adr/A-14-team-workflows.md. The screenshot record has no inbound
citations and is renumbered to A-15.

Zero-pad A-3 through A-9 to A-03 through A-09 so the directory sorts
correctly now that the set has passed ten entries. None of these has an
inbound citation from another document; the single reference in
internal/backend/storage/fs/rcs.go is updated in this commit.

Add docs/adr/README.md as the index, recording the naming rules, the status
and authoring date of every record, and three facts that are otherwise only
discoverable from git history:

- A-01 and A-02 are cited from the CHANGELOG unreleased section but no file
  was ever written for either; the numbers stay reserved.
- The A-13 collision and which record was renumbered.
- SECURITY_AUDIT_REPORT.md and CODE_QUALITY_REPORT.md, cited as the Source
  of A-03 through A-10, were removed in 77894053 and are not in the tree.

No record content is changed apart from the H1 lines, which must match the
file names.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: add docs/conventions.md and adopt Conventional Commits

CONTRIBUTING.md required a bracketed [TAG] prefix on every commit subject.
That has not matched practice for some time: of the 344 commit subjects
since 2025-01-01, 225 are Conventional Commits and 67 use a [TAG]. The
CHANGELOG unreleased section uses a third set including [SECURITY] and
[PKG-BREAK], neither of which CONTRIBUTING.md lists.

Replace the [TAG] rule with Conventional Commits and add
docs/conventions.md as the single normative reference for:

- commit types (a closed list) and the scopes derived from the package
  layout, including the five values that appear as types in the history but
  are scopes: otp, age, bug, fscopy, openbsd;
- the distinction between a CLI break, which uses "!" and a
  BREAKING CHANGE: footer and forces a major release, and a break confined
  to pkg/gopass, which uses a PKG-BREAK: footer and does not (ADR A-12);
- Semantic Versioning, and which surfaces it does and does not cover;
- branch and tag names, including the release/ and prep/ prefixes owned by
  the release automation;
- file naming for ADRs, documentation and Go sources.

The Developer Certificate of Origin requirement is unchanged. Conventional
Commits governs the subject line and the DCO adds a trailer, so the two are
independent.

Also correct the API Stability section of ARCHITECTURE.md, which still
described pkg/gopass/doc.go as carrying "an explicit instability warning"
and instructed consumers to "treat any pkg/ type or function change as
potentially breaking". Both statements predate ADR A-12: doc.go now
declares the package best-effort stable and permits additive changes in any
release. The section also referred to issue #3414 as an open decision; that
decision is recorded in A-12 with status accepted.

Extend the folder list in AGENTS.md with the five pkg/ directories it does
not mention (otp, passkey, pinentry/cli, protect, qrcon), using each
package's own doc comment as the description.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(changelog): migrate to Keep a Changelog 1.1.0

CHANGELOG.md used a bespoke format with three overlapping entry conventions:
the bracketed [TAG] prefixes CONTRIBUTING.md mandated, the Conventional
Commit subjects that have been in use since 2025, and a third set in the
unreleased section including [SECURITY] and [PKG-BREAK] that appeared in
neither. Release 1.16.0 contains the first two mixed together.

Adopt Keep a Changelog 1.1.0 and generate the entries from commit subjects.

New package helpers/commitmsg

  Parse and classify commit subjects. It is the single source of truth for
  both the changelog generator and any future commit linting, so the two
  cannot disagree about what a valid subject is. It implements the closed
  type list from docs/conventions.md, the Changelog-Section:, PKG-BREAK:,
  BREAKING CHANGE: and RELEASE_NOTES= footers, and the legacy [TAG] and
  bracketed-type forms so a release spanning the transition still classifies
  its older commits.

  Classify returns a disposition rather than a bare boolean, distinguishing
  a deliberate omission -- a dependency bump, a CI change -- from a subject
  it could not recognise. That distinction matters: over the 137 commits
  since v1.16.1 it classifies 47, omits 60 and cannot recognise 30. Among
  the 30 are real user-facing changes such as "otp: hide --snip flag when
  built with noscreenshot tag", which uses a scope where a type belongs.
  The release helper now prints those subjects instead of dropping them
  silently.

helpers/release: fix the section ordering defect

  writeChangelog inserted the new release before the first "## " heading.
  Once an unreleased section existed, that heading was the unreleased one,
  so the release landed above it and the hand-written entries below were
  orphaned -- never published, and silently carried into every subsequent
  release. The 30 entries currently under "## Next" are in exactly that
  state.

  The new implementation in helpers/release/changelog.go parses the file
  into header, unreleased block, released body and link references; merges
  the hand-written entries with the generated ones and de-duplicates;
  renders the release with only its non-empty subsections, in Keep a
  Changelog order; leaves an empty Unreleased section behind; and rewrites
  the two link references a release changes.

helpers/changelog: skip the unreleased section

  The extractor printed everything between the first and second "## "
  heading. After the migration the first heading is an empty
  "## [Unreleased]", which would have produced empty GitHub release notes.
  It now extracts the first *versioned* section.

CHANGELOG.md data migration

  The 30 entries under "## Next" move into "## [Unreleased]" and are
  distributed by their existing tags. Three are placed by meaning rather
  than by tag, because Keep a Changelog has sections their tags do not:
  the two [UX] entries that remove a CLI alias go to Removed, and the [UX]
  entry about the GOPASS_AUTOSYNC_INTERVAL deprecation goes to Deprecated.
  The bracketed prefixes are dropped; the trailing audit identifiers such
  as (A-1) and (B-8) are kept, since they are the only trace back to the
  audit that produced those entries.

  All 86 released headings become "## [X.Y.Z] - YYYY-MM-DD" with their
  entry text untouched. The two headings that carried no date, 1.10.0 and
  1.10.1, take theirs from their git tags. A link reference block is
  appended; every one of the 86 versions has a matching tag.

  The bullet count is unchanged at 837.

Verified end to end: "go run ./helpers/changelog" against the migrated file
extracts the 1.16.1 section and does not capture [Unreleased].

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(release): correct the swapped Next/Prev labels and fold duplicate entries

Two follow-ups found while verifying the changelog migration end to end.

The "Version overview" block printed by every release run labels its third
and fourth values "Next version flag" and "Prev version flag", but passes
them as prevVerFlag, nextVerFlag. Running

    go run helpers/release/main.go --dry-run v1.17.0

therefore reported "Next version flag: ''" and "Prev version flag: '1.17.0'"
for a flag that sets the next version. The values are swapped to match the
labels. Output only; no behaviour depends on it.

Changelog entries are now de-duplicated case-insensitively. A hand-written
unreleased entry and the subject of the commit that implemented it commonly
differ only in their first letter, for example "Add gopass doctor diagnostic
command (I-4)" against "add gopass doctor diagnostic command (I-4)". This
cannot catch two genuinely different wordings of the same change; those
still need a human pass before the release.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(adr): align A-12 with the Keep a Changelog format

Three statements in A-12 no longer hold once CHANGELOG.md follows Keep a
Changelog:

- The entry goes in "## [Unreleased]", not "## Next".
- "The existing helpers/changelog generator reads CHANGELOG.md verbatim; no
  changes to that tool are needed" is false. The extractor had to learn to
  skip the unreleased section, and the release helper now classifies commits
  rather than copying subjects.
- "[SECURITY], [BUGFIX] and [FEATURE]" are no longer tags. They are the
  Security, Fixed and Added subsections.

State the mechanism instead: a PKG-BREAK: commit footer, which
helpers/commitmsg reads and helpers/release renders as a [PKG-BREAK]-prefixed
bullet inside the appropriate subsection. [PKG-BREAK] survives as a bullet
prefix because it qualifies an entry rather than categorising it, which is
exactly what a Keep a Changelog subsection cannot express.

Writing the prefix by hand into "## [Unreleased]" still works; the release
helper preserves it.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 23:05:23 +02:00
Pavel Lavrukhin fa4e2678ac docs(adr): resolve the A-13 collision, zero-pad numbers and add an index (#3502)
Two records carried the number A-13:

  docs/adr/A-13-expired-gpg-key-handling.md
  docs/adr/A-13-screenshot-build-tag.md

An ADR number is a stable identifier, so a duplicate makes every citation
ambiguous. A-13-expired-gpg-key-handling.md keeps the number: it is cited
from docs/commands/recipients.md, docs/usecases/team-workflows.md and
docs/adr/A-14-team-workflows.md. The screenshot record has no inbound
citations and is renumbered to A-15.

Zero-pad A-3 through A-9 to A-03 through A-09 so the directory sorts
correctly now that the set has passed ten entries. None of these has an
inbound citation from another document; the single reference in
internal/backend/storage/fs/rcs.go is updated in this commit.

Add docs/adr/README.md as the index, recording the naming rules, the status
and authoring date of every record, and three facts that are otherwise only
discoverable from git history:

- A-01 and A-02 are cited from the CHANGELOG unreleased section but no file
  was ever written for either; the numbers stay reserved.
- The A-13 collision and which record was renumbered.
- SECURITY_AUDIT_REPORT.md and CODE_QUALITY_REPORT.md, cited as the Source
  of A-03 through A-10, were removed in 77894053 and are not in the tree.

No record content is changed apart from the H1 lines, which must match the
file names.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 23:03:06 +02:00
Pavel Lavrukhin dda7b30fcf docs: add docs/conventions.md and adopt Conventional Commits (#3503)
* docs(adr): resolve the A-13 collision, zero-pad numbers and add an index

Two records carried the number A-13:

  docs/adr/A-13-expired-gpg-key-handling.md
  docs/adr/A-13-screenshot-build-tag.md

An ADR number is a stable identifier, so a duplicate makes every citation
ambiguous. A-13-expired-gpg-key-handling.md keeps the number: it is cited
from docs/commands/recipients.md, docs/usecases/team-workflows.md and
docs/adr/A-14-team-workflows.md. The screenshot record has no inbound
citations and is renumbered to A-15.

Zero-pad A-3 through A-9 to A-03 through A-09 so the directory sorts
correctly now that the set has passed ten entries. None of these has an
inbound citation from another document; the single reference in
internal/backend/storage/fs/rcs.go is updated in this commit.

Add docs/adr/README.md as the index, recording the naming rules, the status
and authoring date of every record, and three facts that are otherwise only
discoverable from git history:

- A-01 and A-02 are cited from the CHANGELOG unreleased section but no file
  was ever written for either; the numbers stay reserved.
- The A-13 collision and which record was renumbered.
- SECURITY_AUDIT_REPORT.md and CODE_QUALITY_REPORT.md, cited as the Source
  of A-03 through A-10, were removed in 77894053 and are not in the tree.

No record content is changed apart from the H1 lines, which must match the
file names.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: add docs/conventions.md and adopt Conventional Commits

CONTRIBUTING.md required a bracketed [TAG] prefix on every commit subject.
That has not matched practice for some time: of the 344 commit subjects
since 2025-01-01, 225 are Conventional Commits and 67 use a [TAG]. The
CHANGELOG unreleased section uses a third set including [SECURITY] and
[PKG-BREAK], neither of which CONTRIBUTING.md lists.

Replace the [TAG] rule with Conventional Commits and add
docs/conventions.md as the single normative reference for:

- commit types (a closed list) and the scopes derived from the package
  layout, including the five values that appear as types in the history but
  are scopes: otp, age, bug, fscopy, openbsd;
- the distinction between a CLI break, which uses "!" and a
  BREAKING CHANGE: footer and forces a major release, and a break confined
  to pkg/gopass, which uses a PKG-BREAK: footer and does not (ADR A-12);
- Semantic Versioning, and which surfaces it does and does not cover;
- branch and tag names, including the release/ and prep/ prefixes owned by
  the release automation;
- file naming for ADRs, documentation and Go sources.

The Developer Certificate of Origin requirement is unchanged. Conventional
Commits governs the subject line and the DCO adds a trailer, so the two are
independent.

Also correct the API Stability section of ARCHITECTURE.md, which still
described pkg/gopass/doc.go as carrying "an explicit instability warning"
and instructed consumers to "treat any pkg/ type or function change as
potentially breaking". Both statements predate ADR A-12: doc.go now
declares the package best-effort stable and permits additive changes in any
release. The section also referred to issue #3414 as an open decision; that
decision is recorded in A-12 with status accepted.

Extend the folder list in AGENTS.md with the five pkg/ directories it does
not mention (otp, passkey, pinentry/cli, protect, qrcon), using each
package's own doc comment as the description.

Signed-off-by: Pavel Lavrukhin <46395539+dantte-lp@users.noreply.github.com>

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 23:02:45 +02:00
Zexin Yuan 0c0193a938 fix(age): send agent identities space-separated on a single line (#3509)
The age agent reads its line-oriented protocol with a bufio.Scanner and
parses only the tokens on the "identities" command line (it re-joins args
with newlines before parsing). The client, however, serialized identities
newline-separated and wrote them with a single Fprintln, so every identity
after the first landed on its own line and was discarded as an "unknown
command". As a result the agent loaded at most one identity per send.

This was masked by Go's randomized map iteration order in getAllIds: each
gopass process (e.g. a short-lived browser jsonapi process vs. a CLI
invocation) sent the identities in a different order. When a native X25519
identity happened to sort first the agent loaded it and decryption via the
agent succeeded; when an SSH identity sorted first the whole bundle failed
to parse and nothing loaded. Hence the browser extension and the CLI
appeared to behave differently.

SSH identities (filippo.io/age/agessh) compound this: their private-key
types implement no String() method, so they formatted as an unparseable Go
struct (e.g. "&{[185 .. 233]}") and could never be sent to the agent at
all.

Fix, client-side (the agent already expected this format):

  * identitiesToString now emits all identities space-separated on one
    line, matching what the agent parses. All included encodings are
    bech32 and thus whitespace-free, so space-separation is unambiguous.
  * Only natively serializable identity types (X25519, Hybrid, plugin and
    gopass plugin/wrapped identities) are included; SSH identities are
    skipped (decryption for them falls back to the local code path exactly
    as before — they never worked via the agent).
  * tryStartAgent now uses identitiesToString too, replacing its own
    fmt.Sprintf("%s", id) + newline-join loop (which additionally mangled
    non-Stringer types as %!s(...)).
  * Callers skip the send when there is nothing serializable to avoid a
    noisy "missing identities" agent error.

Regression tests:
  * TestIdentitiesToStringSpaceSeparated - serialization is single-line,
    space-separated, and skips non-serializable identities.
  * TestAgentMultipleIdentities - the agent loads all identities from a
    single space-separated command (decrypts ciphertext encrypted to the
    second identity).
  * TestDecryptMultipleIdentitiesViaAgent - full self-heal path: a keyring
    with two identities, Age.Decrypt routes through the agent, and a secret
    encrypted to the non-first identity decrypts via the agent.

Assisted-by: Claude-Code:GLM-5.2

Signed-off-by: Zexin Yuan <git@yzx9.xyz>
2026-08-10 22:35:55 +02:00
dependabot[bot] 33b281f11c chore(deps): bump docker/metadata-action from 6.1.0 to 6.2.0 (#3511)
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](https://github.com/docker/metadata-action/compare/80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9...dc802804100637a589fabce1cb79ff13a1411302)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 22:28:49 +02:00
dependabot[bot] 242e80c04f chore(deps): bump ossf/scorecard-action from 2.4.3 to 2.4.4 (#3514)
Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.3 to 2.4.4.
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](https://github.com/ossf/scorecard-action/compare/4eaacf0543bb3f2c246792bd56e8cdeffafb205a...2d1146689b8cda280b9bc96326124645441f03bc)

---
updated-dependencies:
- dependency-name: ossf/scorecard-action
  dependency-version: 2.4.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 22:27:26 +02:00
dependabot[bot] 759e0e4eee chore(deps): bump step-security/harden-runner from 2.19.4 to 2.20.0 (#3515)
Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.19.4 to 2.20.0.
- [Release notes](https://github.com/step-security/harden-runner/releases)
- [Commits](https://github.com/step-security/harden-runner/compare/9af89fc71515a100421586dfdb3dc9c984fbf411...bf7454d06d71f1098171f2acdf0cd4708d7b5920)

---
updated-dependencies:
- dependency-name: step-security/harden-runner
  dependency-version: 2.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 22:27:15 +02:00