Showing preview only (2,174K chars total). Download the full file or copy to clipboard to get everything.
Repository: gopasspw/gopass
Branch: master
Commit: 1890055b9457
Files: 634
Total size: 19.8 MB
Directory structure:
gitextract_yjed1ue5/
├── .capabilities.json
├── .codeclimate.yml
├── .codecov.yml
├── .errcheck.excl
├── .gemini/
│ └── settings.json
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE.md
│ ├── copilot-instructions.md
│ ├── dependabot.yml
│ ├── stale.yml
│ └── workflows/
│ ├── autorelease.yml
│ ├── build.yml
│ ├── codeql-analysis.yml
│ ├── container.yml
│ ├── golangci-lint.yml
│ ├── grype.yml
│ └── scorecard.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── .license-lint.yml
├── .revive.toml
├── AGENTS.md
├── ARCHITECTURE.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── GOVERNANCE.md
├── LICENSE
├── Makefile
├── README.md
├── VERSION
├── bash.completion
├── docs/
│ ├── backends/
│ │ ├── age.md
│ │ ├── cryptfs.md
│ │ ├── fossilfs.md
│ │ ├── fs.md
│ │ ├── gitfs.md
│ │ ├── gpg.md
│ │ └── jjfs.md
│ ├── backends.md
│ ├── commands/
│ │ ├── audit.md
│ │ ├── cat.md
│ │ ├── clone.md
│ │ ├── config.md
│ │ ├── convert.md
│ │ ├── create.md
│ │ ├── delete.md
│ │ ├── edit.md
│ │ ├── env.md
│ │ ├── find.md
│ │ ├── fsck.md
│ │ ├── fscopy.md
│ │ ├── fsmove.md
│ │ ├── generate.md
│ │ ├── gopass.md
│ │ ├── grep.md
│ │ ├── history.md
│ │ ├── init.md
│ │ ├── insert.md
│ │ ├── link.md
│ │ ├── list.md
│ │ ├── mounts.md
│ │ ├── move.md
│ │ ├── otp.md
│ │ ├── process.md
│ │ ├── pwgen.md
│ │ ├── recipients.md
│ │ ├── show.md
│ │ ├── sync.md
│ │ ├── templates.md
│ │ └── update.md
│ ├── components.dot
│ ├── config.md
│ ├── entropy.md
│ ├── faq.md
│ ├── features.md
│ ├── hacking.md
│ ├── hooks.md
│ ├── releases.md
│ ├── secrets.md
│ ├── security.md
│ ├── setup.md
│ └── usecases/
│ ├── gpaste.md
│ ├── multi-store.md
│ ├── readonly-store.md
│ ├── secure-otp/
│ │ ├── sign-in.puml
│ │ └── sign-up.puml
│ └── secure-otp.md
├── fish.completion
├── go.mod
├── go.sum
├── gopass.1
├── helpers/
│ ├── changelog/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── gitutils/
│ │ └── gitutils.go
│ ├── man/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── modinfo/
│ │ └── main.go
│ ├── msipkg/
│ │ └── main.go
│ ├── postrel/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── proxy/
│ │ ├── Dockerfile.debian
│ │ ├── README-3111.md
│ │ ├── apt.debughttp
│ │ ├── gopass.sources
│ │ └── main.go
│ └── release/
│ ├── main.go
│ └── main_test.go
├── internal/
│ ├── action/
│ │ ├── action.go
│ │ ├── action_test.go
│ │ ├── aliases.go
│ │ ├── aliases_test.go
│ │ ├── audit.go
│ │ ├── audit_test.go
│ │ ├── binary.go
│ │ ├── binary_test.go
│ │ ├── clihelper.go
│ │ ├── clihelper_test.go
│ │ ├── clone.go
│ │ ├── clone_test.go
│ │ ├── commands.go
│ │ ├── commands_test.go
│ │ ├── completion.go
│ │ ├── completion_test.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── convert.go
│ │ ├── convert_test.go
│ │ ├── copy.go
│ │ ├── copy_test.go
│ │ ├── create.go
│ │ ├── create_test.go
│ │ ├── delete.go
│ │ ├── delete_test.go
│ │ ├── doc.go
│ │ ├── edit.go
│ │ ├── edit_test.go
│ │ ├── env.go
│ │ ├── env_test.go
│ │ ├── exit/
│ │ │ ├── errors.go
│ │ │ └── errors_test.go
│ │ ├── find.go
│ │ ├── find_test.go
│ │ ├── fsck.go
│ │ ├── fsck_test.go
│ │ ├── generate.go
│ │ ├── generate_test.go
│ │ ├── git.go
│ │ ├── grep.go
│ │ ├── grep_test.go
│ │ ├── history.go
│ │ ├── history_test.go
│ │ ├── init.go
│ │ ├── init_test.go
│ │ ├── insert.go
│ │ ├── insert_test.go
│ │ ├── link.go
│ │ ├── link_test.go
│ │ ├── list.go
│ │ ├── list_test.go
│ │ ├── merge.go
│ │ ├── merge_test.go
│ │ ├── mount.go
│ │ ├── mount_test.go
│ │ ├── move.go
│ │ ├── move_test.go
│ │ ├── otp.go
│ │ ├── otp_test.go
│ │ ├── process.go
│ │ ├── process_test.go
│ │ ├── pwgen/
│ │ │ ├── commands.go
│ │ │ ├── commands_test.go
│ │ │ ├── pwgen.go
│ │ │ └── pwgen_test.go
│ │ ├── rcs.go
│ │ ├── rcs_test.go
│ │ ├── recipients.go
│ │ ├── recipients_test.go
│ │ ├── reminder.go
│ │ ├── reorg.go
│ │ ├── reorg_test.go
│ │ ├── repl.go
│ │ ├── repl_test.go
│ │ ├── setup.go
│ │ ├── setup_test.go
│ │ ├── show.go
│ │ ├── show_test.go
│ │ ├── sync.go
│ │ ├── sync_test.go
│ │ ├── templates.go
│ │ ├── templates_test.go
│ │ ├── unclip.go
│ │ ├── unclip_test.go
│ │ ├── update.go
│ │ ├── update_test.go
│ │ ├── version.go
│ │ └── version_test.go
│ ├── audit/
│ │ ├── audit.go
│ │ ├── audit_test.go
│ │ ├── excludes.go
│ │ ├── excludes_test.go
│ │ ├── output.go
│ │ ├── output_test.go
│ │ ├── report.go
│ │ ├── report_test.go
│ │ └── single.go
│ ├── backend/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── crypto/
│ │ │ ├── age/
│ │ │ │ ├── age.go
│ │ │ │ ├── age_test.go
│ │ │ │ ├── agent/
│ │ │ │ │ ├── agent.go
│ │ │ │ │ ├── agent_test.go
│ │ │ │ │ ├── client.go
│ │ │ │ │ ├── client_unix.go
│ │ │ │ │ └── client_windows.go
│ │ │ │ ├── agent_starter_unix.go
│ │ │ │ ├── agent_starter_windows.go
│ │ │ │ ├── askpass.go
│ │ │ │ ├── clientUI.go
│ │ │ │ ├── commands.go
│ │ │ │ ├── context.go
│ │ │ │ ├── context_test.go
│ │ │ │ ├── decrypt.go
│ │ │ │ ├── encrypt.go
│ │ │ │ ├── encrypt_test.go
│ │ │ │ ├── identities.go
│ │ │ │ ├── identities_test.go
│ │ │ │ ├── keyring.go
│ │ │ │ ├── loader.go
│ │ │ │ ├── loader_test.go
│ │ │ │ ├── recipients.go
│ │ │ │ ├── recipients_test.go
│ │ │ │ ├── ssh.go
│ │ │ │ └── unsupported.go
│ │ │ ├── age.go
│ │ │ ├── doc.go
│ │ │ ├── gpg/
│ │ │ │ ├── cli/
│ │ │ │ │ ├── decrypt.go
│ │ │ │ │ ├── encrypt.go
│ │ │ │ │ ├── encrypt_test.go
│ │ │ │ │ ├── generate.go
│ │ │ │ │ ├── gpg.go
│ │ │ │ │ ├── gpg_others_test.go
│ │ │ │ │ ├── gpg_test.go
│ │ │ │ │ ├── gpg_windows_test.go
│ │ │ │ │ ├── identities.go
│ │ │ │ │ ├── keyring.go
│ │ │ │ │ ├── keyring_test.go
│ │ │ │ │ ├── loader.go
│ │ │ │ │ ├── recipients.go
│ │ │ │ │ ├── recipients_test.go
│ │ │ │ │ └── version.go
│ │ │ │ ├── colons/
│ │ │ │ │ ├── parse_colons.go
│ │ │ │ │ ├── parse_colons_test.go
│ │ │ │ │ ├── parse_fuzz.go
│ │ │ │ │ └── utils.go
│ │ │ │ ├── context.go
│ │ │ │ ├── context_test.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── gpgconf/
│ │ │ │ │ ├── binary.go
│ │ │ │ │ ├── binary_others.go
│ │ │ │ │ ├── binary_windows.go
│ │ │ │ │ ├── binary_windows_test.go
│ │ │ │ │ ├── gpgconf.go
│ │ │ │ │ ├── utils.go
│ │ │ │ │ ├── utils_linux.go
│ │ │ │ │ ├── utils_linux_test.go
│ │ │ │ │ ├── utils_others.go
│ │ │ │ │ ├── utils_test.go
│ │ │ │ │ ├── utils_windows.go
│ │ │ │ │ ├── version.go
│ │ │ │ │ └── version_test.go
│ │ │ │ ├── identity.go
│ │ │ │ ├── identity_test.go
│ │ │ │ ├── key.go
│ │ │ │ ├── key_list.go
│ │ │ │ ├── key_list_test.go
│ │ │ │ └── key_test.go
│ │ │ ├── gpgcli.go
│ │ │ ├── plain/
│ │ │ │ ├── backend.go
│ │ │ │ ├── backend_test.go
│ │ │ │ └── loader.go
│ │ │ └── plain.go
│ │ ├── crypto.go
│ │ ├── crypto_test.go
│ │ ├── doc.go
│ │ ├── rcs.go
│ │ ├── rcs_test.go
│ │ ├── registry.go
│ │ ├── registry_test.go
│ │ ├── storage/
│ │ │ ├── cryptfs/
│ │ │ │ ├── crypt.go
│ │ │ │ ├── crypt_test.go
│ │ │ │ └── loader.go
│ │ │ ├── cryptfs.go
│ │ │ ├── doc.go
│ │ │ ├── fossilfs/
│ │ │ │ ├── context.go
│ │ │ │ ├── context_test.go
│ │ │ │ ├── fossil.go
│ │ │ │ ├── fossil_test.go
│ │ │ │ ├── loader.go
│ │ │ │ ├── loader_test.go
│ │ │ │ ├── settings.go
│ │ │ │ ├── status.go
│ │ │ │ ├── storage.go
│ │ │ │ └── storage_test.go
│ │ │ ├── fossilfs.go
│ │ │ ├── fs/
│ │ │ │ ├── fsck.go
│ │ │ │ ├── fsck_test.go
│ │ │ │ ├── link.go
│ │ │ │ ├── link_test.go
│ │ │ │ ├── loader.go
│ │ │ │ ├── rcs.go
│ │ │ │ ├── rcs_test.go
│ │ │ │ ├── store.go
│ │ │ │ ├── store_others.go
│ │ │ │ ├── store_test.go
│ │ │ │ ├── store_windows.go
│ │ │ │ ├── walk.go
│ │ │ │ └── walk_test.go
│ │ │ ├── fs.go
│ │ │ ├── gitfs/
│ │ │ │ ├── commands.go
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ ├── git.go
│ │ │ │ ├── git_test.go
│ │ │ │ ├── loader.go
│ │ │ │ ├── ssh_darwin.go
│ │ │ │ ├── ssh_others.go
│ │ │ │ ├── ssh_windows.go
│ │ │ │ └── storage.go
│ │ │ ├── gitfs.go
│ │ │ ├── jjfs/
│ │ │ │ ├── jj.go
│ │ │ │ └── loader.go
│ │ │ └── jjfs.go
│ │ ├── storage.go
│ │ └── storage_test.go
│ ├── cache/
│ │ ├── disk.go
│ │ ├── disk_test.go
│ │ ├── ghssh/
│ │ │ ├── cache.go
│ │ │ ├── cache_test.go
│ │ │ ├── github.go
│ │ │ └── github_test.go
│ │ ├── inmem.go
│ │ └── inmem_test.go
│ ├── completion/
│ │ ├── fish/
│ │ │ ├── completion.go
│ │ │ ├── completion_escaping_test.go
│ │ │ ├── completion_test.go
│ │ │ └── template.go
│ │ └── zsh/
│ │ ├── completion.go
│ │ ├── completion_escaping_test.go
│ │ ├── completion_test.go
│ │ └── template.go
│ ├── config/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── config_windows.go
│ │ ├── context.go
│ │ ├── docs_test.go
│ │ ├── legacy/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── io.go
│ │ │ ├── io_test.go
│ │ │ ├── legacy.go
│ │ │ ├── location.go
│ │ │ └── location_xdg_test.go
│ │ ├── legacy.go
│ │ ├── location.go
│ │ ├── location_test.go
│ │ ├── location_xdg_test.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── create/
│ │ ├── helpers.go
│ │ ├── helpers_test.go
│ │ ├── templates.go
│ │ ├── wizard.go
│ │ └── wizard_test.go
│ ├── cui/
│ │ ├── actions.go
│ │ ├── actions_test.go
│ │ ├── cui.go
│ │ ├── cui_test.go
│ │ ├── recipients.go
│ │ └── recipients_test.go
│ ├── diff/
│ │ ├── diff.go
│ │ └── diff_test.go
│ ├── editor/
│ │ ├── edit_linux.go
│ │ ├── edit_others.go
│ │ ├── edit_others_test.go
│ │ ├── edit_test.go
│ │ ├── edit_windows.go
│ │ ├── edit_windows_test.go
│ │ └── editor.go
│ ├── env/
│ │ ├── doc.go
│ │ ├── env_darwin.go
│ │ └── env_others.go
│ ├── hashsum/
│ │ ├── hashsums.go
│ │ └── hashsums_test.go
│ ├── hook/
│ │ └── hook.go
│ ├── notify/
│ │ ├── doc.go
│ │ ├── icon.go
│ │ ├── notify_darwin.go
│ │ ├── notify_darwin_test.go
│ │ ├── notify_dbus.go
│ │ ├── notify_others.go
│ │ ├── notify_test.go
│ │ └── notify_windows.go
│ ├── out/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── print.go
│ │ └── print_test.go
│ ├── pwschemes/
│ │ ├── argon2i/
│ │ │ ├── argon2i.go
│ │ │ └── argon2i_test.go
│ │ ├── argon2id/
│ │ │ ├── argon2id.go
│ │ │ └── argon2id_test.go
│ │ └── bcrypt/
│ │ ├── bcrypt.go
│ │ └── bcrypt_test.go
│ ├── queue/
│ │ ├── background.go
│ │ └── background_test.go
│ ├── recipients/
│ │ ├── recipients.go
│ │ └── recipients_test.go
│ ├── reminder/
│ │ ├── reminder.go
│ │ └── reminder_test.go
│ ├── store/
│ │ ├── err.go
│ │ ├── leaf/
│ │ │ ├── context.go
│ │ │ ├── context_test.go
│ │ │ ├── convert.go
│ │ │ ├── crypto.go
│ │ │ ├── crypto_test.go
│ │ │ ├── fsck.go
│ │ │ ├── fsck_test.go
│ │ │ ├── init.go
│ │ │ ├── init_test.go
│ │ │ ├── link.go
│ │ │ ├── link_test.go
│ │ │ ├── list.go
│ │ │ ├── list_test.go
│ │ │ ├── move.go
│ │ │ ├── move_test.go
│ │ │ ├── rcs.go
│ │ │ ├── rcs_test.go
│ │ │ ├── read.go
│ │ │ ├── recipients.go
│ │ │ ├── recipients_test.go
│ │ │ ├── reencrypt.go
│ │ │ ├── storage.go
│ │ │ ├── store.go
│ │ │ ├── store_test.go
│ │ │ ├── templates.go
│ │ │ ├── templates_test.go
│ │ │ ├── write.go
│ │ │ └── write_test.go
│ │ ├── mockstore/
│ │ │ ├── inmem/
│ │ │ │ └── store.go
│ │ │ ├── store.go
│ │ │ └── store_test.go
│ │ ├── root/
│ │ │ ├── convert.go
│ │ │ ├── crypto.go
│ │ │ ├── crypto_test.go
│ │ │ ├── errors.go
│ │ │ ├── fsck.go
│ │ │ ├── fsck_test.go
│ │ │ ├── init.go
│ │ │ ├── init_test.go
│ │ │ ├── link.go
│ │ │ ├── list.go
│ │ │ ├── list_test.go
│ │ │ ├── mount.go
│ │ │ ├── mount_test.go
│ │ │ ├── move.go
│ │ │ ├── move_test.go
│ │ │ ├── rcs.go
│ │ │ ├── rcs_test.go
│ │ │ ├── read.go
│ │ │ ├── read_test.go
│ │ │ ├── recipients.go
│ │ │ ├── recipients_test.go
│ │ │ ├── store.go
│ │ │ ├── store_test.go
│ │ │ ├── templates.go
│ │ │ ├── templates_test.go
│ │ │ ├── write.go
│ │ │ └── write_test.go
│ │ ├── sort.go
│ │ ├── sort_test.go
│ │ └── store.go
│ ├── tpl/
│ │ ├── funcs.go
│ │ ├── funcs_test.go
│ │ ├── template.go
│ │ └── template_test.go
│ ├── tree/
│ │ ├── node.go
│ │ ├── node_test.go
│ │ ├── root.go
│ │ ├── root_test.go
│ │ ├── tree.go
│ │ └── tree_test.go
│ └── updater/
│ ├── README.md
│ ├── access_others.go
│ ├── access_windows.go
│ ├── download.go
│ ├── extract.go
│ ├── extract_test.go
│ ├── github.go
│ ├── github_test.go
│ ├── update.go
│ ├── update_test.go
│ ├── updateable.go
│ ├── verify.go
│ └── verify_test.go
├── main.go
├── main_test.go
├── main_unix.go
├── pkg/
│ ├── appdir/
│ │ ├── appdir.go
│ │ ├── appdir_test.go
│ │ ├── appdir_windows.go
│ │ ├── appdir_xdg.go
│ │ ├── appdir_xdg_test.go
│ │ ├── runtime_windows.go
│ │ └── runtime_xdg.go
│ ├── clipboard/
│ │ ├── clipboard.go
│ │ ├── clipboard_others.go
│ │ ├── clipboard_test.go
│ │ ├── clipboard_windows.go
│ │ ├── copy_darwin.go
│ │ ├── copy_others.go
│ │ ├── kill_others.go
│ │ ├── kill_ps.go
│ │ ├── unclip.go
│ │ ├── unclip_linux.go
│ │ ├── unclip_others.go
│ │ └── unclip_test.go
│ ├── ctxutil/
│ │ ├── ctxutil.go
│ │ ├── ctxutil_test.go
│ │ └── helper.go
│ ├── debug/
│ │ ├── debug.go
│ │ ├── debug_test.go
│ │ ├── doc.go
│ │ ├── version.go
│ │ └── version_test.go
│ ├── fsutil/
│ │ ├── fsutil.go
│ │ ├── fsutil_test.go
│ │ ├── umask.go
│ │ └── umask_test.go
│ ├── otp/
│ │ ├── otp.go
│ │ ├── otp_test.go
│ │ ├── screenshot_others.go
│ │ └── screenshot_supported.go
│ ├── passkey/
│ │ ├── passkey.go
│ │ └── passkey_test.go
│ ├── pinentry/
│ │ └── cli/
│ │ ├── fallback.go
│ │ └── fallback_test.go
│ ├── protect/
│ │ ├── protect.go
│ │ ├── protect_openbsd.go
│ │ └── protect_test.go
│ ├── pwgen/
│ │ ├── cryptic.go
│ │ ├── cryptic_test.go
│ │ ├── external.go
│ │ ├── memorable.go
│ │ ├── pwgen.go
│ │ ├── pwgen_others_test.go
│ │ ├── pwgen_test.go
│ │ ├── pwgen_windows_test.go
│ │ ├── pwrules/
│ │ │ ├── aliases.go
│ │ │ ├── aliases_test.go
│ │ │ ├── change.go
│ │ │ ├── change_test.go
│ │ │ ├── gen.go
│ │ │ ├── pwrules.go
│ │ │ ├── pwrules_gen.go
│ │ │ └── pwrules_test.go
│ │ ├── rand.go
│ │ ├── validate.go
│ │ ├── validate_test.go
│ │ ├── wordlist.go
│ │ └── xkcdgen/
│ │ ├── pwgen.go
│ │ └── pwgen_test.go
│ ├── qrcon/
│ │ ├── qrcon.go
│ │ └── qrcon_test.go
│ ├── set/
│ │ ├── filter.go
│ │ ├── filter_test.go
│ │ ├── map.go
│ │ ├── map_test.go
│ │ ├── set.go
│ │ ├── set_test.go
│ │ ├── sorted.go
│ │ └── sorted_test.go
│ ├── tempfile/
│ │ ├── file.go
│ │ ├── file_test.go
│ │ ├── mount_darwin.go
│ │ ├── mount_linux.go
│ │ └── mount_others.go
│ └── termio/
│ ├── ask.go
│ ├── ask_test.go
│ ├── context.go
│ ├── context_test.go
│ ├── identity.go
│ ├── identity_test.go
│ ├── progress.go
│ ├── progress_test.go
│ ├── promptpass_others.go
│ ├── promptpass_test.go
│ ├── promptpass_windows.go
│ ├── reader.go
│ └── reader_test.go
├── tests/
│ ├── age_agent_test.go
│ ├── audit_test.go
│ ├── binary_test.go
│ ├── can/
│ │ ├── can.go
│ │ ├── can_test.go
│ │ └── gnupg/
│ │ ├── pubring.gpg
│ │ ├── random_seed
│ │ ├── secring.gpg
│ │ └── trustdb.gpg
│ ├── completion_test.go
│ ├── config_test.go
│ ├── copy_test.go
│ ├── delete_test.go
│ ├── find_test.go
│ ├── generate_test.go
│ ├── gptest/
│ │ ├── gunit.go
│ │ ├── unit.go
│ │ └── utils.go
│ ├── grep_test.go
│ ├── init_test.go
│ ├── insert_test.go
│ ├── list_test.go
│ ├── mount_test.go
│ ├── move_test.go
│ ├── show_test.go
│ ├── sync_test.go
│ ├── tester.go
│ ├── uninitialized_test.go
│ └── yaml_test.go
├── version.go
└── zsh.completion
================================================
FILE CONTENTS
================================================
================================================
FILE: .capabilities.json
================================================
[File too large to display: 17.8 MB]
================================================
FILE: .codeclimate.yml
================================================
version: "2"
checks:
argument-count:
config:
threshold: 4
complex-logic:
config:
threshold: 4
file-lines:
config:
threshold: 250
method-complexity:
config:
threshold: 16
method-count:
config:
threshold: 20
method-lines:
config:
threshold: 100
nested-control-flow:
config:
threshold: 4
return-statements:
config:
threshold: 4
plugins:
gofmt:
enabled: true
golint:
enabled: true
govet:
enabled: true
ratings:
paths:
- "**.go"
exclude_patterns:
- "vendor/"
- "utils/notify/icon.go"
- "**/*_test.go"
================================================
FILE: .codecov.yml
================================================
coverage:
range: 40..90
round: nearest
precision: 2
status:
project:
default: on
patch:
default: off
changes:
default: off
ignore:
- "vendor/"
================================================
FILE: .errcheck.excl
================================================
fmt.Fprintf
fmt.Fprintln
fmt.Fprint
================================================
FILE: .gemini/settings.json
================================================
{
"contextFileName": "AGENTS.md"
}
================================================
FILE: .gitattributes
================================================
CHANGELOG.md merge=union
================================================
FILE: .github/FUNDING.yml
================================================
github: dominikschulz
patreon: gopass
custom: "https://paypal.me/doschulz"
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
---
name: Bug report
about: Create a report to help us improve gopass
---
### Summary
<!--
Please provide a clear and concise description of what the bug is.
-->
### Steps To Reproduce
<!--
Steps to reproduce the problem
-->
### Expected behavior
<!--
A clear and concise description of what you expected to happen.
-->
### Environment
<!--
Please complete the following information (see note below)
-->
- OS: [e.g. Mac OS X High Sierra, Ubuntu 18.04, Windows 10, ...]
- OS version: [uname -a]
- gopass Version: [gopass version]
- Installation method: [e.g. from source, brew, gopass repo]
<!--
**PLEASE NOTE**
There is a package named gopass in the official Debian repository.
This package is not related to this project in any way. If you
installed gopass from the Debian archives report any bugs in
the Debian BTS.
-->
### Additional context
<!--
Add any other context about the problem here.
-->
================================================
FILE: .github/copilot-instructions.md
================================================
Refer to [AGENTS.md](../AGENTS.md) for detailed instructions on how to set up and use agents with gopass.
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
open-pull-requests-limit: 15
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 120
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 60
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
# Set to true to ignore issues in a milestone (defaults to false)
exemptMilestones: true
================================================
FILE: .github/workflows/autorelease.yml
================================================
# This is a basic workflow to help you get started with Actions
name: release
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
tags:
- 'v*'
permissions:
contents: read
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
-
name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
-
name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: 'go.mod'
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
- uses: anchore/sbom-action/download-syft@17ae1740179002c89186b61233e0f892c3118b11 # v0.23.0
# ubuntu is missing wixl https://github.com/actions/virtual-environments/issues/3857
-
name: "Install GNOME msitools (wixl)"
run: sudo apt update -qq && sudo apt install -qq -y wixl
-
name: Import GPG signing key
id: import_gpg
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.PASSPHRASE }}
-
name: Debug
run: |
echo "GPG ---------------------"
echo "fingerprint: ${{ steps.import_gpg.outputs.fingerprint }}"
echo "keyid: ${{ steps.import_gpg.outputs.keyid }}"
echo "name: ${{ steps.import_gpg.outputs.name }}"
echo "email: ${{ steps.import_gpg.outputs.email }}"
echo "Go env ------------------"
pwd
echo ${HOME}
echo ${GITHUB_WORKSPACE}
echo ${GOPATH}
echo ${GOROOT}
env
-
name: Generate release-notes
run: |
go run helpers/changelog/main.go >../RELEASE_NOTES
-
name: Run GoReleaser
uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7.0.0
with:
version: latest
args: release --release-notes=../RELEASE_NOTES
env:
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }}
GOPATH: /home/runner/go
-
name: "Add Windows installer (msi) to release"
run: | # until https://github.com/goreleaser/goreleaser/issues/1295, disabled until #2038 is fixed
tag="${GITHUB_REF#refs/tags/}"
version=${tag#v}
make msi
msi=dist/gopass-x64-windows-${version}.msi
gh release upload "${tag}" "${msi}"
env:
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
-
name: "Upload deb files to apt hosting"
run: |
for D in dist/*.deb; do
curl -H"X-Filename: ${D}" -H"X-Apikey: ${APIKEY}" -XPOST --data-binary @$D https://packages.gopass.pw/repos/gopass/upload
curl -H"X-Filename: ${D}" -H"X-Apikey: ${APIKEY}" -XPOST --data-binary @$D https://packages.gopass.pw/repos/gopass-unstable/upload
done
env:
APIKEY: ${{ secrets.APT_APIKEY }}
================================================
FILE: .github/workflows/build.yml
================================================
name: Build gopass
on:
push:
branches:
- master
pull_request:
branches:
- master
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
linux:
runs-on: ubuntu-latest
strategy:
matrix:
go: ['1.25']
name: Go ${{ matrix.go }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: block
allowed-endpoints: >
github.com:443
objects.githubusercontent.com:443
proxy.golang.org:443
raw.githubusercontent.com:443
release-assets.githubusercontent.com:443
storage.googleapis.com:443
sum.golang.org:443
golang.org:443
go.dev:443
azure.archive.ubuntu.com:443
archive.ubuntu.com:443
security.ubuntu.com:443
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: ${{ matrix.go }}
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Ubuntu Dependencies
run: sudo apt-get install --yes git gnupg
- run: git config --global user.name nobody
- run: git config --global user.email foo.bar@example.org
-
name: Debug
run: |
echo "Go env ------------------"
pwd
echo ${HOME}
echo ${GITHUB_WORKSPACE}
echo ${GOPATH}
echo ${GOROOT}
env
- name: Build and Unit Test
run: make gha-linux
- name: Integration Test
run: make test-integration
container:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
env:
IMAGE_NAME: ${{ github.repository }}
with:
images: ${{ env.IMAGE_NAME }}
- name: Build container image
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8
with:
context: .
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
windows:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2 # v2.29.0
with:
release: false
path-type: inherit
install: >-
base-devel
git
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: 'go.mod'
- run: git config --global user.name nobody
- run: git config --global user.email foo.bar@example.org
- name: Build and Unit Test
run: make gha-windows
macos:
runs-on: macos-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: 'go.mod'
- run: git config --global user.name nobody
- run: git config --global user.email foo.bar@example.org
- name: Build and Unit Test
run: make gha-osx
env:
SLOW_TEST_FACTOR: 100
dependabot:
needs: [linux]
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: write
if: ${{ github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'}}
steps:
- id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- run: |
gh pr review --approve "$PR_URL"
gh pr merge --squash --auto "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches:
- master
pull_request:
# The branches below must be a subset of the branches above
branches:
- master
schedule:
- cron: '19 21 * * 0'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
analyze:
permissions:
actions: read # for github/codeql-action/init to get workflow details
contents: read # for actions/checkout to fetch code
security-events: write # for github/codeql-action/autobuild to send a status report
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'go' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
disable-sudo: true
egress-policy: block
allowed-endpoints: >
api.github.com:443
github.com:443
objects.githubusercontent.com:443
release-assets.githubusercontent.com:443
proxy.golang.org:443
raw.githubusercontent.com:443
storage.googleapis.com:443
sum.golang.org:443
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@89a39a4e59826350b863aa6b6252a07ad50cf83e # v3.29.5
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@89a39a4e59826350b863aa6b6252a07ad50cf83e # v3.29.5
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@89a39a4e59826350b863aa6b6252a07ad50cf83e # v3.29.5
================================================
FILE: .github/workflows/container.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.
name: Create and publish a Docker image
# Controls when the action will run.
on:
push:
tags:
- 'v*'
permissions:
contents: read
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Log in to the Container registry
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
================================================
FILE: .github/workflows/golangci-lint.yml
================================================
name: golangci-lint
on:
push:
branches:
- master
pull_request:
branches:
- master
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
pull-requests: read
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
disable-sudo: true
egress-policy: block
allowed-endpoints: >
api.github.com:443
github.com:443
golangci-lint.run:443
objects.githubusercontent.com:443
release-assets.githubusercontent.com:443
proxy.golang.org:443
raw.githubusercontent.com:443
storage.googleapis.com:443
sum.golang.org:443
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: 'go.mod'
- name: golangci-lint
uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
with:
# Note: there are 2 different version of golangci-lint used inside the project.
# https://github.com/gopasspw/gopass/blob/master/.github/workflows/build.yml#L65
# https://github.com/gopasspw/gopass/blob/master/.github/workflows/golangci-lint.yml#L46
# https://github.com/gopasspw/gopass/blob/master/Makefile#L136
version: v2.6.1 # we have a list of linters in our .golangci.yml config file
only-new-issues: true
================================================
FILE: .github/workflows/grype.yml
================================================
name: Scan gopass
on:
push:
branches:
- master
pull_request:
branches:
- master
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
linux:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: 'go.mod'
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Scan current project
uses: anchore/scan-action@7037fa011853d5a11690026fb85feee79f4c946c # v7.3.2
with:
path: "."
fail-build: true
severity-cutoff: critical
================================================
FILE: .github/workflows/scorecard.yml
================================================
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '39 8 * * 2'
push:
branches: [ "master" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@89a39a4e59826350b863aa6b6252a07ad50cf83e # v3.29.5
with:
sarif_file: results.sarif
================================================
FILE: .gitignore
================================================
gopass
gopass-*-amd64
gopass-full
dev.sh
!pkg/gopass/
coverage.out
coverage-all.*
.vscode/
# Profiling
*.out
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
*.test
*.prof
# gopass specific ignores
*.sublime-*
*.swp
/.env
# package files
*.deb
*.pkg.tar.xz
*.rpm
*.tar.bz2
releases/
dist/
manifest-*.json
# go-fuzz
*-fuzz.zip
workdir/
.vscode/
NOTICE.new
debian/
================================================
FILE: .golangci.yml
================================================
version: "2"
output:
sort-order:
- linter
- file
linters:
enable:
- asasalint
- asciicheck
- bidichk
- bodyclose
- containedctx
- copyloopvar
- cyclop
- decorder
- dogsled
- errchkjson
- errname
- errorlint
- exhaustive
- forcetypeassert
- funlen
- ginkgolinter
- gocheckcompilerdirectives
- gochecksumtype
- godot
- goheader
- gomoddirectives
- gomodguard
- goprintffuncname
- gosmopolitan
- grouper
- importas
- intrange
- loggercheck
- makezero
- mirror
- misspell
- nakedret
- nestif
- nilnil
- nlreturn
- nonamedreturns
- nosprintfhostport
- prealloc
- predeclared
- promlinter
- protogetter
- reassign
- sloglint
- spancheck
- tagalign
- testableexamples
- testifylint
- thelper
- unconvert
- usestdlibvars
- usetesting
- whitespace
- zerologlint
settings:
cyclop:
max-complexity: 24
errcheck:
exclude-functions:
- fmt.Fprint
- fmt.Fprintf
- fmt.Fprintln
funlen:
lines: -1
statements: 100
gocyclo:
min-complexity: 22
staticcheck:
checks:
- all
- -SA1019
- -ST1000
exclusions:
generated: lax
rules:
- linters:
- cyclop
path: (.+)_test\.go
- linters:
- govet
path: (.+)_fuzz\.go
paths:
- helpers/
- third_party$
- builtin$
- examples$
issues:
max-issues-per-linter: 0
max-same-issues: 0
formatters:
enable:
- gofmt
- gofumpt
- goimports
exclusions:
generated: lax
paths:
- helpers/
- third_party$
- builtin$
- examples$
================================================
FILE: .goreleaser.yml
================================================
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# goreleaser.yml
# Release automation
#
# Build customization
project_name: gopass
version: 2
before:
hooks:
- make clean
- make completion
- go mod download
builds:
- id: gopass
binary: gopass
flags:
- -trimpath
- -tags=netgo
env:
- CGO_ENABLED=0
asmflags:
- all=-trimpath={{.Env.HOME}}
gcflags:
- all=-trimpath={{.Env.HOME}}
ldflags: |
-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.CommitDate}} -extldflags '-static'
goos:
- darwin
- freebsd
- linux
- openbsd
- windows
goarch:
- amd64
- arm
- arm64
goarm:
- 6
- 7
mod_timestamp: '{{ .CommitTimestamp }}'
archives:
- id: gopass
name_template: "{{.Binary}}-{{.Version}}-{{.Os}}-{{.Arch}}{{ if .Arm }}v{{.Arm }}{{ end }}"
formats: ['tar.gz']
format_overrides:
- goos: windows
formats: ['zip']
files:
- CHANGELOG.md
- LICENSE
- README.md
- bash.completion
- fish.completion
- zsh.completion
release:
github:
owner: gopasspw
name: gopass
draft: false
prerelease: auto
nfpms:
- id: gopass_deb
vendor: Gopass Authors
homepage: "https://www.gopass.pw"
maintainer: "Gopass Authors <gopass@gopass.pw>"
description: |-
gopass password manager - full featured CLI replacement for pass, designed for teams.
.
gopass is a simple but powerful password manager for your terminal. It is a
Pass implementation in Go that can be used as a drop in replacement.
.
Every secret lives inside of a gpg (or: age) encrypted textfile. These secrets
can be organized into meaninful hierachies and are by default versioned using
git.
.
This package contains the main gopass binary from gopass.pw. In Debian and
Ubuntu there is an unfortunate name clash with another gopass package. That is
completely different and not related to this package.
license: MIT
formats:
- deb
dependencies:
- git
- gnupg
recommends:
- rng-tools
- bash-completion
contents:
- src: gopass.1
dst: /usr/share/man/man1/gopass.1
- src: LICENSE
dst: /usr/share/doc/gopass/LICENSE
- src: CHANGELOG.md
dst: /usr/share/doc/gopass/CHANGELOG.md
- src: bash.completion
dst: /usr/share/bash-completion/completions/gopass
- src: fish.completion
dst: /usr/share/fish/vendor_completions.d/gopass.fish
- src: zsh.completion
dst: /usr/share/zsh/functions/Completion/Linux/_gopass
- id: gopass_rpm
vendor: Gopass Authors
homepage: "https://www.gopass.pw"
maintainer: "Gopass Authors <gopass@gopass.pw>"
description: |-
gopass password manager - full featured CLI replacement for pass, designed for teams.
gopass is a simple but powerful password manager for your terminal. It is a
Pass implementation in Go that can be used as a drop in replacement.
Every secret lives inside of a gpg (or: age) encrypted textfile. These secrets
can be organized into meaninful hierachies and are by default versioned using
git.
license: MIT
formats:
- rpm
dependencies:
- git
- gnupg2
recommends:
- rng-tools
- bash-completion
contents:
- src: gopass.1
dst: /usr/share/man/man1/gopass.1
- src: LICENSE
dst: /usr/share/doc/gopass/LICENSE
- src: CHANGELOG.md
dst: /usr/share/doc/gopass/CHANGELOG.md
- src: bash.completion
dst: /usr/share/bash-completion/completions/gopass
- src: fish.completion
dst: /usr/share/fish/vendor_completions.d/gopass.fish
- src: zsh.completion
dst: /usr/share/zsh/functions/Completion/Linux/_gopass
source:
enabled: true
name_template: "{{.ProjectName}}-{{.Version}}"
checksum:
name_template: "{{.ProjectName}}_{{.Version}}_SHA256SUMS"
milestones:
-
repo:
owner: gopasspw
name: gopass
close: true
fail_on_error: false
name_template: "{{ .Major }}.{{ .Minor }}.{{ .Patch }}"
signs:
-
id: gopass
artifacts: checksum
args: ["--batch", "-u", "{{ .Env.GPG_FINGERPRINT }}", "--armor", "--output", "${signature}", "--detach-sign", "${artifact}"]
# creates SBOMs of all archives and the source tarball using syft
# https://goreleaser.com/customization/sbom
sboms:
- artifacts: archive
- id: source # Two different sbom configurations need two different IDs
artifacts: source
================================================
FILE: .license-lint.yml
================================================
unrestricted_licenses:
- Apache-2.0
- MIT
- BSD-3-Clause
- BSD-2-Clause
- 0BSD
- WTFPL
- CC0-1.0
reciprocal_licenses:
- MPL-2.0
- MPL-2.0-no-copyleft-exception
allowlisted_modules:
# Simplified BSD (BSD-2-Clause): https://github.com/russross/blackfriday/blob/master/LICENSE.txt
- github.com/russross/blackfriday
- github.com/russross/blackfriday/v2
# Apache license
- github.com/dgraph-io/ristretto
- github.com/spf13/afero
# Modified BSD-2-Clause with extra no-Google clause: https://github.com/jezek/xgb/blob/master/LICENSE
- github.com/jezek/xgb
# MIT
- github.com/jwalton/go-supportscolor
================================================
FILE: .revive.toml
================================================
# Ignores files with "GENERATED" header, similar to golint
ignoreGeneratedHeader = false
# Sets the default severity to "warning"
severity = "error"
# Sets the default failure confidence. This means that linting errors
# with less than 0.8 confidence will be ignored.
confidence = 0.6
# Sets the error code for failures with severity "error"
errorCode = 1
# Sets the error code for failures with severity "warning"
warningCode = 1
[rule.argument-limit]
arguments = [10]
[rule.blank-imports]
[rule.context-as-argument]
[rule.context-keys-type]
[rule.cyclomatic]
arguments = [21]
[rule.dot-imports]
[rule.error-naming]
[rule.error-return]
[rule.error-strings]
[rule.errorf]
[rule.exported]
[rule.if-return]
[rule.increment-decrement]
[rule.indent-error-flow]
[rule.package-comments]
[rule.range]
[rule.receiver-naming]
[rule.time-naming]
[rule.unexported-return]
[rule.var-declaration]
[rule.var-naming]
================================================
FILE: AGENTS.md
================================================
# Project Overview
gopass is a command line application that allows users to managed their passwords and other secrets inside encrypted files. Those files are usually encrypted using gpg (but other backends like age do exist). The files are usually managed using git (but other VCS backends exist as well). The CLI is primarily intended for human users.
Several integration exist, these are stand alone projects that use the exposed gopass API to interact with an existing password store.
gopass supports multiple password stores. It requires at least one root store but any number of additional stores can be mounted, just like filesystems on Linux, inside the root store. Each store can use a different encryption method and VCS.
The primary use case of using different password stores is to encrypt and share the content with a different set of recipients.
The project is specifically targeting users on all major platform, i.e. Linux, Unix, MacOS and Windows.
## Folder Structure
- `/docs`: Contains human readable documentation for the project.
- `/helpers`: Contains tools used to maintain the project. Users usually don't use those, these are mainly for developers and maintainers of the project. Do not touch this directory unless instructed to do so.
- `/internal`: Contains most of the implementation of the project. It is visibility restricted so other projects can not depend on it and we can be very liberal with breaking changes.
- `/pkg`: Contains the public API (inside `/pkg/gopass`) used by our integrations and other projects as well as necessary support packages to make using the API feasible.
- `/tests`: Contains only integration tests, i.e. those mock a real GPG-based gopass installation. They are quite slow but provide kind of a regression testing. Remember to add or adjust those when adding major new features.
- `/internal/action`: Contains the different CLI subcommands. Usually one file per top-level subcommand (e.g. the implementation for `gopass ls` is in `/internal/action/list.go`) with an accompanying `_test.go` file that contains the unit tests. All commands need to be registered in `/internal/action/commands.go`.
- `/internal/audit`: Contains the audit code that checks password stores for weak passwords or related issues.
- `/internal/backend`: Contains the different backend implementations for both encryption as well as version controlled storage. Storage implementations need to register themselves in `/internal/backend.StorageRegistry` while encryption backends need to register in `/internal/backend.CryptoRegistry`.
- `/internal/backend/crypto/age`: Contains the `age` encryption backend. It is a pure-Go implementation. Refer to the [docs](docs/backends/age.md) as well.
- `/internal/backend/crypto/gpg/cli`: Contains the `gpg` encryption backend. It mostly uses the `gpg` binary to support the different configurations (e.g. smart cards) which wouldn't be possible with existing pure-Go implementation. Refer to [docs](docs/backends/gpg.md) as well.
- `/internal/backend/crypto/plain`: Contains the plaintext backend (no encryption). This should only be used for testing. Users should never use this.
- `/internal/backend/storage/fossilfs`: Contains an experimental storage backend using the Fossil SCM. It might be removed in the future.
- `/internal/backend/storage/fs`: Contains a storage backend without SCM integration, i.e. it simply writes to files on disk without versioning support. Should usually only be used for tests or if users have some kind of transparent versioning system underneath.
- `/internal/backend/storage/gitfs`: Contains the primary storage backend that is using `git` to manage files.
- `/internal/config`: Contains our custom config handling. It is based on the git configuration file format as implemented by our [gitconfig](http://github.com/gopasspw/gitconfig) package. When reading config settings prefer to using `config.Bool(ctx, key)`, `config.String(ctx, key)` or `config.Int(ctx, key)`. Use the low-level methods only when those are not sufficient. Avoid touching the `legacy` package underneath unless asked to.
- `/internal/out`: Contains our output helpers. Prefer those over Go standard lib packages (like fmt) for consistency.
- `/internal/store`: Contains the core of the password store implementation (utilizing the configured backends).
- `/internal/store/root`: Contains the root store. This always exist once in a gopass process. It delegates most operations to one or more leaf stores.
- `/internal/store/leaf`: Contains the leaf store. There must be at least one initialized leaf store per gopass instance. But there can be as many as necessary.
- `/pkg/appdir`: Contains a facility for providing system-dependentt paths for application resources, like config or cache directories. It does honor the `GOPASS_HOMEDIR` variable. This is very useful for testing since a gopass instance running with this variable set to a temporary location will not interfere with the actual production instance a user might be using.
- `/pkg/clipboard`: Contains methods to interact with clipboards on all major operating systems. It is using our [clipboard](http://github.com/gopasspw/clipboard) package. It also supports clearing the clipboard after a given interval.
- `/pkg/ctxutil`: Provides the necessary plumbling to interact with config values stored in the context. Avoid adding new context keys if possible and prefer config values. But if adding context keys is necessary they should only be defined in this file.
- `/pkg/debug`: Contains a debug package with different verbosity levels. Use it to output debug information to a debug log.
- `/pkg/fsutil`: Contains various helpers for interacting with the filesystem, e.g. checking for presence of files or directories. Prefer those over implementing these checks from scratch.
- `/pkg/gopass`: Contains the public gopass API to interact with existing password stores. The `api` sub package contains the actual API and the `secrets` sub package the different secret types we support.
- `/pkg/pwgen`: Contains a pure-Go implementation of the `pwgen` utility.
- `/pkg/set`: Contains a generic set type.
- `/pkg/tempfile`: Contains utility functions for creating and dealing with temp files. It attempts to be more secure than the normal temp file functions from the stdlib. Prefer those over the stdlib.
- `/pkg/termio`: Contains functions for interacting with the user of the terminal.
## Libraries and Frameworks
- Avoid introducing new external dependencies unless absolutely necessary.
- If a new dependency is required, please state the reason.
- The project is licensed under the terms of the MIT license and we can only add compatible licenses. See [.license-lint.yml](.license-lint.yml) for a list of compatible licenses.
- We must avoid introducing CGo dependencies since this make cross-compiling infeasible.
## Testing instructions
- Always run `make test` and `make codequality` before submitting.
- Run `make fmt` to properly format the code. Run this before `make codequality`.
- Before mailing a PR run `make test-integration`
================================================
FILE: ARCHITECTURE.md
================================================
# Architecture
This document describes the high-level architecture of gopass. If you want to
get familiar with the code base you are in the right place.
## Overview
On the highest level gopass manages directories (called `stores` or `mounts`)
that contain (mostly) GPG encrypted text files. gopass transparently handles
encryption and decryption when accessing these files. It applies some heuristics
to parse the file content and support certain operations on that content.
`gopass` is licensed under the terms of the MIT license and we require
compatible licenses from our dependencies as well (when we link against them).
For licensing reasons and security considerations we try to keep the number of
external dependencies (libraries) well-arranged. Try to avoid adding new
dependencies unless absolutely necessary.
## Generalized control flow

This flow chart shows a high level control flow common to most operations.
It leaves out a lot of details but should give a better understanding how
information flows within the program and where changes might be necessary.
## Code Map
This section talks briefly about the various directories and some data
structures.
We're trying to clearly separate between our public API and implementation
details. To that extent we're in the process of moving packages to `internal/`
(and sometimes back to `pkg/`, if necessary).
A note on semantic versioning: `gopass` is both an CLI and an API (Go module).
The expectations around semantic versioning and Go modules make it difficult
to express both concerns in the same versioning scheme, e.g. does a breaking
change in the API require a major version bump even if nothing about the tool
(CLI) has changed? What about the other way round? Thus we have decided to
apply semantic versioning only to the CLI tool, not the Go module. This is not
ideal and might change with sufficient active contributors.
### `docs/backends`
This folder contains documentation about each of our supported backends. See
`internal/backend` below for more information about our backend design.
### `docs/commands`
This folder contains the specification of each sub command the tool offers.
We have many sub commands with sometimes dozens of flags each. In the past we
did encounter some inconsistencies and decided to introduce specifications for
each command. If the specification and the implementation disagree this should
be reported as a bug and fixed or the specification needs to be changed (but the
general assumptions should be that the specification is correct, not the code).
### `docs/usecases`
This directory contains an (incomplete) list of our core use cases, i.e. the
critical user journeys we aim to support. `gopass` can be used in various ways
and try to remain flexible and extensible, but if we encounter a conflict
between a blessed use case and a corner case we prefer the former.
### `helpers/`
This directory contains some release automation tooling that is supposed to be
invoked with `go run`. The changelog generator in `helpers/changelog` is used
by our GitHub Action based release automation and shouldn't be invoked manually.
The tooling in `helpers/release` will prepare a new release and helps to file a
release pull request will all the required updates in place.
### `internal/` and `pkg/`
`gopass` used to not have either of these and all our packages were rooted
directly in the repository. However we began to notice that other projects
were starting to depend directly on our internal packages and we sometimes
broke them. This put us and the other project into an unpleasant
situation so we tried to clarify the expectations by using Go's `internal/`
visibility rule to keep other projects from depending on our implementation
details.
Note: If we have a good reasons to use one of our `internal/` packages either
copy it (our license should rarely be an issue) or nicely ask us and explain
why something should move to `pkg/`.
As we are in the process of formalizing a proper API surface we sometimes need
to move packages from `internal/` to `pkg/`. The other direction might also
occur, but much less often.
### `internal/action`
This directory contains one file, and sometimes sub folders, for each command
`gopass` supports. These are mostly self-contained, but some (e.g. show / edit
/ find) need to depend on each other.
TODO: There is a lot to be said about this package, e.g. custom errors.
### `internal/backend`
`gopass` is built around the concept of multiple independent password stores
that can be mounted into one namespace, much like regular file systems. Each
of these stores can have a different storage and crypto backend. We used to
have independent revision control backends as well, but since the RCS (e.g.
git) interacts so closely with the storage (you can't use regular git w/o a
filesystem-based storage) we have merged storage and RCS backends.
The backend package defines the interfaces for the backend implementation
and provides a registry that returns the concrete backend from the list of
registered ones. Registration happens through blank imports of either the
`internal/backend/crypto` and `internal/backend/storage` packages.
Each backend needs to have a loader implementation in its `loader.go` (please
stick to this name). We try to auto-detect the most applicable backend when
initializing the process, but some backends look alike (e.g. a `fs` and an
uninitialized `gitfs`). So the loader comes with a priority which is respected
during lookup.
### `internal/config`
The `config` package implements support for a simple YAML-based configuration
format for `gopass`. Most of the code in this package is for backwards
compatibility. Whenever we introduce or remove a config option we need to
introduce a new fallback version that is automatically attempted when loading
a config file. To resolve ambiguities when parsing different config versions
we use a "catch-all" field to catch any unused keys and check that this is
empty after parsing - otherwise we need to try a different config version.
NOTE: We did support nested configurations for sub-stores but removed this
because the maintenance cost did not justify the benefits of this feature.
### `internal/cui`
The name `cui` is an abbreviation for `console-user-interface` and contains
several helper functions to interact with humans over a text based interface.
Most of these ask the user to select some item from a selection or provide
some input.
NOTE: We used to support rich terminal UIs with arrow navigation and such.
However all existing libraries that were available without CGO were either
abandoned or buggy on some platforms and we didn't have any capacity to fix
them. So we had to remove support for this feature.
### `internal/queue`
The `queue` package implements a FIFO queue that executes
in the background. This allows for certain operations, like a git push, to be
taken out of the critical path wrt. user interactions. The queue will be fully
processed before the process exits.
### `internal/store/root`
The `root store` package implements an internal password store API that (only)
supports mounting `leaf` stores. It will forward (almost) all operations to
its `leaf` stores (moves across stores being a notable exception) and do the
necessary manipulations of the affected path components (e.g. removing/adding
the mount prefix from the secret name as needed).
This package makes `gopass` multi-store capable.
### `internal/store/leaf`
The `leaf store` package implements a password store that is mostly compatible
with any other password store implementation (while aiming for interoperability,
not at 100% feature parity). The low-level operations like filesystem and / or
version control and crypto operations are passed to the configured `storage`
or `crypto` backend.
### `internal/tree`
The `tree` package implements a simple tree structure that prints an output
similar to the output of the Unix tool `tree`. It does support different
`gopass` specific properties (like mounts or templates) not easily implemented
with other tree packages.
### `internal/updater`
The `updater` package implements a secure and anonymous self updater.
Note: The self updater contacts GitHub. If this is a concern one should use
other sources, e.g. distro packages.
It retrieves the latest stable release from GitHub, fetches its metadata
and verifies the signature against the built-in release signing keyring.
It tries to avoid conflicting with any `gopass` binary managed by the OS
and refuse to update these.
### `pkg/`
The package `pkg/` contains our public API surface, i.e. packages we want or
have to expose externally. Some packages (e.g. `otp`) are only exposed because
they are being used by some of our integrations. Others (e.g. `pinentry` or
`pwgen`) are designed for wider use. We are considering to split some of the
more widely used packages into their own repositories to work better with
Go module and semantic versioning expectations.
#### `pkg/appdir`
The `appdir` package contains a set of [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)
compatible implementations with some `gopass` specifics. For testing purposes
we want to honor the setting of `GOPASS_HOMEDIR` before everything else, so our
implementation has to take this into account before following the XDG spec.
#### `pkg/clipboard`
The `clipboard` package is a wrapper around a clipboard package that adds
support for clearing the clipboard.
#### `pkg/ctxutil`
The `ctxutil` is the pragmatic (read: non-idiomatic) approach to pass very
specific configuration options through multiple layers of abstraction. This is
arguably not the best design, but it works well and avoids bloated interfaces.
#### `pkg/gopass`
This package contains **the** gopass API interface. We provide a concrete
implementation that should work with any properly initialized gopass setup
and a mock for tests.
This package is designed as the main entry point for any integration that wants
to integrate with gopass.
### `tests`
`gopass` comes with a comprehensive set of integration tests, i.e. tests that
are executed by running a newly compiled gopass binary without access to any
kind of internal state. These tests can't be as exhaustive as the unit tests
but they exist to ensure basic functionality aren't broken by a change.
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## 1.16.1 / 2025-12-13
* chore(deps): bump actions/checkout from 5.0.0 to 6.0.0 (#3299)
* chore(deps): bump actions/setup-go from 6.0.0 to 6.1.0 (#3300)
* chore(deps): bump anchore/sbom-action from 0.20.9 to 0.20.10 (#3296)
* chore(deps): bump anchore/scan-action from 7.1.0 to 7.2.1 (#3298)
* chore(deps): bump docker/metadata-action from 5.8.0 to 5.10.0 (#3297)
* chore(deps): bump github/codeql-action from 4.31.2 to 4.31.6 (#3295)
* chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3302)
* chore(deps): bump step-security/harden-runner from 2.13.1 to 2.13.2 (#3301)
* fix(config): use the config propery generate.strict as default value for Strict rules (#3303)
* fix: Fix version check against latest release (#3292)
## 1.16.0 / 2025-11-12
* [BUGFIX] reorg: List all secrets instead of just top-level folders (#3245)
* [chore] Add capability and vulnerability checks (#3266)
* [chore] Initial fixes and added a warning for CryptFS and JJFS (#3270)
* [chore] Logging improvements (#3273)
* [chore] Run linux builds with multiple Go versions (#3272)
* [fix] Correctly handle IsGitCommit false in store.Move (#3246)
* [fix] Drop Go 1.23 (#3274)
* [fix] Fix clipboard issues (#3267)
* [fix] Fix version check (#3268)
* chore(deps): bump actions/cache from 4.2.4 to 4.3.0 (#3263)
* chore(deps): bump actions/setup-go from 5.5.0 to 6.0.0 (#3262)
* chore(deps): bump actions/upload-artifact from 4.6.2 to 5.0.0 (#3281)
* chore(deps): bump anchore/sbom-action from 0.20.5 to 0.20.6 (#3258)
* chore(deps): bump anchore/sbom-action from 0.20.6 to 0.20.9 (#3284)
* chore(deps): bump anchore/scan-action from 6.5.1 to 7.0.0 (#3264)
* chore(deps): bump anchore/scan-action from 7.0.0 to 7.1.0 (#3280)
* chore(deps): bump docker/login-action from 3.5.0 to 3.6.0 (#3260)
* chore(deps): bump github/codeql-action from 3.30.0 to 3.30.5 (#3261)
* chore(deps): bump github/codeql-action from 3.30.5 to 4.31.2 (#3282)
* chore(deps): bump msys2/setup-msys2 from 2.28.0 to 2.29.0 (#3257)
* chore(deps): bump ossf/scorecard-action from 2.4.2 to 2.4.3 (#3259)
* chore(deps): bump sigstore/cosign-installer from 3.10.0 to 4.0.0 (#3283)
* chore(deps): bump sigstore/cosign-installer from 3.9.2 to 3.10.0 (#3255)
* chore(deps): bump step-security/harden-runner from 2.13.0 to 2.13.1 (#3256)
* chore: Update golangci-lint (#3287)
* docs: Add GoDoc to pkg and improve markdown files (#3251)
* feat(age): Add unlock command to age agent (#3244)
* feat: Add cryptfs storage backend for filename encryption (#3249)
* feat: Clone remote on init (#3247)
* fix: Fix release helper and update capabilities for caplos (#3288)
## 1.15.18 / 2025-09-19
* [fix] Enable Windows builders (#3237)
* [fix] Fix recipient check error (#3235)
* [fix] Update gitconfig to v0.0.3 to pull in Windows fixes (#3236)
* [fix] Use Go 1.24 instead of Go 1.25 (#3226)
* docs: Add note about pass compatibility (#3229)
* feat: Add reorg command (#3232)
* feat: Allow to customize commit messages (#3231)
* feat: Improve usability of 'gopass mounts add' command (#3238)
* fix(config): Make core.exportkeys handling consistent (#3228)
* fix(gpg): Opportunistic key comparison on import (#3230)
## 1.15.17 / 2025-09-15
* [BUGFIX] Fix --force flag in recipients add (#3173)
* [chore] Add tests and comments for hasPwRuleForSecret (#3162)
* [chore] Automatically approve and merge dependabot PRs (#3220)
* [chore] Bump github.com/gopasspw/clipboard to v0.0.3 (#3219)
* [chore] Disable updating gopasspw.github.io (#3184)
* [chore] Expose gopass env in help (#3158)
* [chore] Fix hardened runner (#3196)
* [chore] Update Go versions (#3139)
* [chore] Update dependencies (#3197)
* [feat] Add Jujutsu storage backend (#3202)
* [feat] Honor generator options in the create workflow (#3149)
* [fix] Add workaround for pre-release test failures (#3198)
* [fix] Disable Windows tests (#3204)
* [fix] Fixes creation template lookup on Windows (#3157)
* [fix] avoid length prompt when input is within rule boundary (#3159)
* [fix] skip redundant confirmation when --edit is used (#3161)
* [fix] use WritePassword for secure write (#3200)
* [testing] use `/usr/bin/env cat` instead of `/bin/cat` (#3160)
## 1.15.16 / 2025-04-21
* [BUGFIX] Allow use of trailing slash for cp/mv command (#3080)
* [BUGFIX] Check if any usable key matches on clone (#3027)
* [BUGFIX] Fixed max length check for strings in create/wizard (#3056)
* [BUGFIX] Fixed password not saving to clipboard with safecontent and autoclip true (#3053)
* [BUGFIX] replace return of wrong error variable (#3015)
* [ENHANCEMENT] Add support for autocompletion with flags in REPL mode (#3057)
* [ENHANCEMENT] Make it possible to override `show.autoclip` (#3082)
* [FEATURE] Add option -r/--regex to find (#3083)
* [UX] Make single store sync more intuitive / verbose (#3076)
* [bugfix] Don't check for autosync on manual triggered sync (#3026) (#3029)
* [chore] Add keep-sorted linter (#3130)
* [chore] Add tpl func tests and fix two small issues (#3058)
* [chore] Do not run linters twice (#3119)
* [chore] Migrate goreleaser config to v2 (#3122)
* [chore] Migrate to golangci-lint v2 (#3104)
* [chore] Move gitconfig to their own repo (#3131)
* [chore] Move set from internal to pkg (#3129)
* [chore] Update dependencies (#3120)
* [feat] Add conditional includes for gitconfig (#3128)
* [feat] Add unconditional includes for gitconfig (#3127)
* [feat] Remove expensive and unmaintained zxcvbn-go strength checker (#3133)
* [feat] Replace clipboard library to support wl-copy args (#3123)
* [fix] Add LICENSE, Changelog, manpage and shell completions to deb and (#3121)
* [fix] Fix a flaky test (#3137)
* [fix] Fix debug.ModuleVersion (#3079)
* [fix] Fix test failure due to ambient variables (#3135)
* [fix] Fix test regressions (#3116)
* [fix] Fix this annoying test
* [fix] Include git commit hash in tarballs (#3124)
* [fix] Relase fixes (#3136)
* [fix] Update Makefile and fix lint violations (#3134)
## 1.15.15 / 2024-11-24
* [BUGFIX] Replace ~ with user homedir if `$GOPASS_HOMEDIR` is not set (#2961)
* [CLEANUP] Replace experimental `maps` and `slices` with stdlib (#2993)
* [CLEANUP] remove unreachable code (#2977)
* [DEPRECATION] Remove references to deprecated rand.Seed (#2953)
* [ENHANCEMENT] Allow for whitespace-trailing passwords (#2873) (#2954)
* [FEATURE] Adding support for `age.Plugin` identities (#2960)
* [FEATURE] Allow for non-interactive age setup (#2970)
* [FEATURE] Ask for setup if not initialized (#2975)
* [bugfix] Copy with trailing slash at destination. (#2966)
* [chore] use the same version of golangci-lint (#2948)
## 1.15.14 / 2024-08-03
* [bugfix] Fix parsing of key-value pairs according to the gitconfig (#2911)
* [chore] Update dependency to github.com/cenkalti/backoff/v4 (#2864)
* [chore] Update dependency to github.com/godbus/dbus/v5 (#2860)
* [chore] Update dependency to github.com/google/go-github/v61 (#2863)
* [chore] Update dependency to github.com/xhit/go-str2duration/v2 (#2865)
* [chore] Update hashicorp/golang-lru to v2 (#2859)
## 1.15.13 / 2024-04-06
* [bugfix] Default to true for core.exportkeys even in substores (#2848)
* [bugfix] Do not report findings with severity none in audit summary (#2843)
* [bugfix] Fix loading of git configs (#2849)
* [chore] Update dependencies (#2850)
* [chore] Use clean filepath in all of the fs.Set operation (#2846)
* [chore] use the same version of golangci-lint (#2841)
* [feat] Add an multi-line input type to the create wizard (#2847)
* [feat] Add option to disable notification icon (#2845)
* [feat] Add verbosity levels to the debug package (#2851)
* [fix] Disble safecontent parsing if noparsing is requested (#2855)
* [fix] Pass remote, if given, to local init as well (#2852)
## 1.15.12 / 2024-03-17
* [BUGFIX] Use 'en' as default language for the xkcd generator (#2793)
* [DOCUMENTATION] Fix typo: initilize -> initialize (#2796)
* [bugfix] Bring back audit summary (#2820)
* [bugfix] Do not abort saving if the OTP counter is aborted (#2775)
* [bugfix] Fix NPE when using recipients completion (#2823)
* [bugfix] Warn if trying to use fscopy inside the store (#2832)
* [chore] Upgrade to Go 1.22 (#2805)
* [cleanup] Add better logging in case no owner key is found (#2748)
* [feat] Add .gopass-audit-ignore support to ignore secrets from audits (#2822)
* [feat] Allow supression of password generation in create templates (#2821)
* [ux] Add hint that computing recipients takes some time (#2833)
* [ux] Do not show create type chooser if only one exists (#2752)
## 1.15.11 / 2023-12-01
* [bugfix] Disable multi-line description for deb packages (#2729)
* [bugfix] Fix writes to global config from tests (#2727)
* [bugfix] Workaround for goreleaser/nfpm#742 (#2732)
* [feature] Allow setting autosync.interval in different time units (#2731)
## 1.15.10 / 2023-11-25
* [BUGFIX] Allow to move shadowed entries into their own folder (#2718)
* [BUGFIX] Try to always honor local config for mounts (#2724)
* [chore] Add OSSF scorecard link and improve security posture (#2704)
* [chore] Update goxkcdpwgen dependency to include my PR (#2722)
* [chore] Update grype workflow and pin Docker base images (#2706)
* [cleanup] Add package description (#2702)
* [feature] Add new pwgen options to capitalize and include numbers in (#2703)
## 1.15.9 / 2023-11-18
* [BUGFIX] Disabling the OTP snip screenshot feature on OpenBSD (#2685)
* [CLEANUP] Migration of options to more appropriate sections (#2681)
* [bugfix] Improve git version parsing (#2690)
* [bugfix] Remove leading and trailing slashes from mounts (#2698)
* [enhancement] Add blake3 to the template functions (#2693)
* [enhancement] Add input validation to block illegal mount points (#2672)
## 1.15.8 / 2023-09-11
* [BUGFIX] Use goreleaser build for crosscompile (#2635)
* [bugfix] Allow fsck to check a single secret (#2659)
* [bugfix] Do not remove unused keys on import by default (#2657)
* [bugfix] Fix parsing of large secrets (#2654)
* [chore] Update dependencies (#2660)
* [docs] add/update choco, scoop, winget instructions (#2647)
* [feat] Add --store option to gopass fsck (#2658)
* [feat] Add XCKD pwgen config options (#2651)
## 1.15.7 / 2023-08-04
* [BUGFIX] Fix build issues on various non-Linux platforms (#2630, #2633)
## 1.15.6 / 2023-07-30
* [DOCUMENTATION] fix Arch Linux package url (#2598)
* [BUGFIX] Only show desktop notifications if there are changes (#2627)
* [ENHANCEMENT] Add a global nosync flag (#2626)
* [BUGFIX] Correctly handle multiline secrets (#2625)
* [ENHANCEMENT] Add screen parsing for OTP QR codes (#2597)
## 1.15.5 / 2023-04-07
* [CLEANUP] Use Go1.20 (#2567)
* [ENHANCEMENT] Add internal pager (ov). (#2510)
## 1.15.4 / 2023-02-12
* [BUGFIX] Also accept lower case CTE headers. (#2539, #2518)
* [BUGFIX] Commit changes to mount config changes. (#2542, #2530)
* [BUGFIX] Do not restrict pwlen when maxlen is zero. (#2537, #2536)
* [BUGFIX] Fix fossilfs sync (#2549, #2516)
* [BUGFIX] Fix recipients check for age. (#2545, #2544)
* [BUGFIX] Hide harmless git error messages. (#2547, #2543)
* [BUGFIX] Improve error handling for gopass convert (#2548, #2520)
* [ENHANCEMENT] Add edit.auto-create (#2538)
## 1.15.3 / 2023-01-07
* [BUGFIX] Check recipients before launching editor. (#2488, #1565)
* [BUGFIX] Fix possible concurrency issues in fsck. (#2486, #2459)
* [BUGFIX] Honor core.autosync (#2497, #2495)
* [BUGFIX] Honor fuzzy search abort (#2491, #2490)
* [ENHANCEMENT] Add nicer gopass audit HTML output (#2508)
* [ENHANCEMENT] Check recipients before adding a new one. (#2487, #1918)
* [ENHANCEMENT] Do not enforce lower case keys (#2489, #1777)
* [ENHANCEMENT] Do not rewrite ~. (#2496, #2083)
* [ENHANCEMENT] Rewrite gopass audit. Add HTML and CSV (#2506, #2504)
* [ENHANCEMENT] gitconfig: Support MultiVars (#2476, #2457)
## 1.15.2 / 2022-12-18
* [BUGFIX] [gitconfig] Properly parse Key-Value pairs with (#2482, #2479)
* [ENHANCEMENT] Add --force-regen flag to generate (#2475, #2474)
* [ENHANCEMENT] Add recipients hash checking. (#2481, #2478)
## 1.15.1 / 2022-12-11
* [BUGFIX] Fix domain alias lookup (#2455, #2453)
* [BUGFIX] Fix vim invocation. (#2456, #2424)
* [CLEANUP] Unhide fscopy and fsmove (#2444, #1831)
* [ENHANCEMENT] Add DirName template (#2452)
* [ENHANCEMENT] Add generate.symbols and generate.length (#2443, #2151)
* [ENHANCEMENT] Add template docs (#2445, #1562)
* [ENHANCEMENT] Document supported secret formats. (#2439, #1585)
* [ENHANCEMENT] Pre-populate ID with git values (#2442, #968)
* [ENHANCEMENT] Support german language in the password (#2454, #2451)
## 1.15.0 / 2022-12-03
* [BREAKING] New config format based on git config. (#2395, #1567, #1764, #1819, #1878, #2387, #2418)
* [BUGFIX] Fix symlink deduplication. (#2437, #2402)
* [ENHANCEMENT] Maintain secret structure when parsing (#2433, #2431)
* [ENHANCEMENT] Retain recipients file format (#2432, #2430)
### New config format: gitconfg
Gopass is getting a new config format based on the one use by git itself.
The new implementation is much more flexible and extensible and will allow us
to more easily support new config options going forward. It does also support
a hierachy of configs. That means we can now support system wide defaults
as well as per mount config options.
The system wide configuration gives package maintainers and admins of multi
user deployments the option to pre-set certain options to their liking.
### New default secret format
The default secret format has been rewritten to replace two of the existing
ones (KV and Plain). The new format puts a strong emphasis on retaining the
input as close as possible. And small change that might be visible in some
corner cases is that every secret now contains a terminating new line.
### Recipient files can now contain comments
The parsing of the recipients files (`.gpg-id`) has become more flexible and
can now contain comments. These will be retained when updating these files
through gopass as well.
## 1.14.11 / 2022-11-25
* [BUGFIX] Fix edit on MacOS Ventura (#2426, #2400)
* [BUGFIX] Handle nvi (#2414)
* [BUGFIX] Improve support for non-vim editors (#2427, #2424)
* [BUGFIX] Only pass vim options to vim (#2421, #2412)
* [ENHANCEMENT] Support combined short flags (#2420, #2419)
## 1.14.10 / 2022-11-09
* [BUGFIX] Correctly handle key removal on Windows (#2372, #2371)
* [DOCUMENTATION] (#1878)
* [ENHANCEMENT] Ignore comments in recipient files. (#2394, #2393)
* [ENHANCEMENT] Improve key expiration handling (#2383, #2369)
* [ENHANCEMENT] allow re-encrypting entire directory when (#2373)
## 1.14.9 / 2022-09-28
* [ENHANCEMENT] Make DBus notifications transient (#2364, #2358)
## 1.14.8 / 2022-09-27
* [BUGFIX] Ignore not-existing .ssh dir (#2347, #2333)
* [BUGFIX] Use Wait() to avoid Zombies (#2354, #1666)
* [ENHANCEMENT] Allow modifying default create templates (#2349, #2291)
* [ENHANCEMENT] Improve passage support (#2352, #2059)
* [ENHANCEMENT] Use OS keychain for age passphrase caching (new config option, off by default). (#2351, #2350)
## 1.14.7 / 2022-09-20
* [BUGFIX] Do not ignore symlinks when listing (#2344, #2173)
* [BUGFIX] Do not shadow entries behind folders. (#2341, #2338)
* [BUGFIX] Fix updater on Windows. (#2345, #2011)
* [BUGFIX] Handle Ctrl+C in TOTP (#2342, #2320)
* [ENHANCEMENT] Set vim options instead of sniffing (#2343, #2317)
## 1.14.6 / 2022-09-10
* [BUGFIX] Do not show setup message on version (#2327)
* [BUGFIX] Remove exported public keys of removed (#2328, #2315)
* [ENHANCEMENT] Document extension model. (#2329, #2290)
## 1.14.5 / 2022-09-03
* [BUGFIX] Fix fsck progress bar. Mostly. (#2303)
* [DOCUMENTATION] fix in recommended vim setting (#2318)
## 1.14.4 / 2022-08-02
* [BREAKING] gopass otp will automatically update the counter key in HTOP secrets! (#2278)
* [BUGFIX] Allow removing unknown recipients with --force (#2253)
* [BUGFIX] Honor PASSWORD_STORE_DIR (#2272)
* [BUGFIX] Honor OTP key period from URL (#2278)
* [BUGFIX] Wizard: Enforce min and max length. (#2293)
* [CLEANUP] Use Go 1.19 (#2296)
* [ENHANCEMENT] Automatically sync once a week (#2191)
* [ENHANCEMENT] Scan for vulnerabilities and add SBOM on (#2268)
* [ENHANCEMENT] Use packages.gopass.pw for APT packages (#2261)
## 1.14.3 / 2022-05-31
* [BUGFIX] Do not print progress bar on otp --clip (#2243)
* [BUGFIX] Removing shadowing warning when using -o/--password (#2245)
* [CLEANUP] Deprecate OutputIsRedirected in favour of IsTerminal (#2248)
* [DOCUMENTATION] Adding doc about YAML entries and unsafe-keys (#2244)
* [ENHANCEMENT] Allow deleting multiple secrets (#2239)
## 1.14.2 / 2022-05-22
* [BUGFIX] Fix gpg identity detection (#2218, #2179)
* [BUGFIX] Handle different line breaks in recipient (#2221, #2220)
* [BUGFIX] Stop eating secrets on move (#2211, #2210)
* [ENHANCEMENT] Add flag to keep env variable capitalization (#2226, #2225)
* [ENHANCEMENT] Environment variable GOPASS_PW_DEFAULT_LENGTH can be used to overwrite default password length of 24 characters. (#2219)
## 1.14.1 / 2022-05-02
* [BUGFIX] Do not print missing public key for age. (#2166)
* [BUGFIX] Improve convert output (#2171)
* [BUGFIX] fix errors in zsh completions (#2005)
* [CLEANUP] Migrating to a maintained version of openpgp (#2193)
* [ENHANCEMENT] Avoid decryption on move or copy (#2183, #2181)
* [UX] Upgrade xkcdpwgen to a new version that removes German (#2187)
## 1.14.0 / 2022-03-16
* Add --chars option to print subset of secrets (#2155, #2068)
* [BUGFIX] Always re-encrypt when fsck is invoked with --decrypt. (#2119, #2015)
* [BUGFIX] Body only entries are detected now by show -o (#2109)
* [BUGFIX] Do not hide git error messages (#2118, #1959)
* [BUGFIX] Fix completion when password name contains (#2150)
* [BUGFIX] Fix template func arg order (#2117, #2116)
* [BUGFIX] Fixes an issue where recipients remove may fail (#2147, #1964)
* [BUGFIX] Fixes an issue where recipients remove may fail (#2147, #1964)
* [BUGFIX] Handle from prefix correctly on mv (#2110, #2079)
* [BUGFIX] Handle unencoded secret on cat (#2105)
* [BUGFIX] Make man page consistent with other docs (#2133)
* [BUGFIX] Reject invalid salt with MD5Crypt templates (#2128)
* [BUGFIX] depend *.deb on gnupg instead of dummy (#2050)
* [CLEANUP] Deprecate gopasspw/pinentry (#2095)
* [CLEANUP] Use Go 1.18 (#2156)
* [CLEANUP] Use debug.ReadBuildInfo (#2032)
* [DOCUMENTATION] Fixed link to passwordstore.org (#2129)
* [DOCUMENTATION] document 'gopass cat' (#2051)
* [DOCUMENTATION] improve 'gopass cat' (#2070)
* [DOCUMENTATION] improve 'gopass show -revision -<N>' (#2070)
* [ENHANCEMENT] Add age subcommand (#2103, #2098)
* [ENHANCEMENT] Add gopass audit --expiry (#2067)
* [ENHANCEMENT] Add gopass process (#2066, #1913)
* [ENHANCEMENT] Allow overriding GPG path (#2153)
* [ENHANCEMENT] Automatically export creators key to the (#2159, #1919)
* [ENHANCEMENT] Bump to Go 1.18 (#2058)
* [ENHANCEMENT] Enforce TLSv1.3 (#2085)
* [ENHANCEMENT] Generics (#2034, #2030)
* [ENHANCEMENT] Hide password on MacOS clipboards (#2065)
* [ENHANCEMENT] Passage compat improvements (#2060, #2060)
* [ENHANCEMENT] gopass git invokes git directly (#2102)
* [ENHANCEMENT] Template support for the create wizard (#2064)
* [ENHANCENMENT] Check for MacOS Keychain storing the GPG (#2144)
* [EXPERIMENTAL] Support the Fossil SCM (#2092, #2022)
* [FEATURE] Add env variables for custom clipboard commands. (#2091, #2042)
* [FEATURE] only accept keys with "encryption" key capability (#2047, #1917, #1917)
* [TESTING] Improve two line test ambiguity. (#2091, #2042)
* [TESTING] Use a helper to unset env vars in clipboard tests. (#2091, #2042)
* [UX] OTP code now runs in loop until canceled or used with -o (#2041)
## 1.13.1 / 2022-01-15
* [BUGFIX] Handle from prefix correctly on mv (#2110, #2079)
* [BUGFIX] Handle unencoded secret on cat
## 1.13.0 / 2021-11-13
* [BUGFIX] Do not print OTP progress bar if not in terminal (#2019)
* [BUGFIX] Don't prompt to retype password unnecessarily (#1983)
* [BUGFIX] Fix AutoClip handling on generate (#2024, #2023)
* [BUGFIX] Replace Build Status badge in README (#2016)
* [BUGFIX] The field 'parsing' is now honored with legacy config pre v1.12.7 (#1997)
* [BUGFIX] Use default git branch on setup (#2026, #1945)
* [ENHANCEMENT] Adding a MSI installer for Windows (#2001)
* [ENHANCEMENT] Move password prompts to stderr (#2004)
* [FEATURE] Add capitalized words to memorable passwords (#1985, #1984)
* [UX] Use new progress bar for OTP expiry time (#2019)
## 1.12.8 / 2021-08-28
* [BUGFIX] Use same default for partial config files (#1968)
* [CLEANUP] Remove GOPASS_NOCOLOR in favor of NO_COLOR (#1937, #1936)
* [ENHACNEMENT] Add gopass merge (#1979, #1948)
* [ENHANCEMENT] Add --symbols to gopass pwgen (#1966)
* [ENHANCEMENT] Warn on untracked files (#1972)
## 1.12.7 / 2021-07-02
* DOCUMENTATION Fixed Single Line Formating for Clone Documentation (#1943)
* [BUGFIX] Allow --strict to be chained with --symbols (#1952, #1941)
* [BUGFIX] Normalize recipient IDs before comparison (#1953, #1900)
* [BUGFIX] Use /tmp for GIT_SSH_COMMAND on Mac (#1951, #1896)
* [ENHANCEMENT] Add warning when parsing content (#1950)
## 1.12.6 / 2021-05-01
* [BUGFIX] Do not recurse with a key (#1907, #1906)
* [BUGFIX] Fix SSH control path (#1899, #1896)
* [BUGFIX] Fix gopass env with subtrees (#1894, #1893)
* [BUGFIX] Honor create -s flag (#1891)
* [BUGFIX] Ignore commented values in gpg config (#1901, #1898)
* [ENHANCEMENT] Add better usage instructions (#1912)
## 1.12.5 / 2021-03-27
* [BUGFIX] Allow subkeys (#1843, #1841, #1842)
* [BUGFIX] Avoid logging credentials (#1886, #1883)
* [BUGFIX] Fix SSH Command override on termux (#1881)
* [CLEANUP] Moving pkg/pinentry to gopasspw/pinentry (#1876)
* [ENHANCEMENT] Add -f flag to create (#1867, #1811)
* [ENHANCEMENT] Add gopass ln (#1828)
* [ENHANCEMENT] Add proper diff numbers on sync (#1882)
* [ENHANCEMENT] Update password rules (#1861)
## 1.12.4 / 2021-03-20
* [BUGFIX] Bring back --yes (#1862, #1858)
* [BUGFIX] Fix make install on BSD (#1859)
## 1.12.3 / 2021-03-20
* [BUGFIX] Fix generate -c (#1846, #1844)
* [BUGFIX] Fix gopass update (#1838, #1837)
* [BUGFIX] Fix progress bar on 32 bit archs (#1855, #1854)
* [CLEANUP] Remove the custom formula in favour of the official one. (#1847)
* [ENHANCEMENT] Install manpage when using `make install` (#1845)
## 1.12.2 / 2021-03-13
* [BUGFIX] Do not fail if reminder is unavailable (#1835, #1832)
* [BUGFIX] Do not shadow directories (#1817, #1813)
* [BUGFIX] Do not trigger ClamAV FP (#1810, #1807)
* [BUGFIX] Fix -o (#1822)
* [BUGFIX] Honor Ctrl+C while waiting for user input (#1805, #1800)
* [ENHANCEMENT] Add gopass.1 man page (#1827, #1824)
* [UX] Adding the grep command to --help (#1826, #1825)
## 1.12.1 / 2021-02-17
* [BUGFIX] Enable updater on Windows (#1790, #1789)
* [BUGFIX] Fix progress bar nil pointer access (#1790, #1789)
* [BUGFIX] Fix % char in passwords being treated as formatting (#1794, #1793, #1801)
* [ENHANCEMENT] Add ARCHITECTURE.md (#1787)
* [ENHANCEMENT] Added a env var to disable reminders (#1792)
* [ENHANCEMENT] Remind to run gopass update/fsck/audit after 90d (#1792)
## 1.12.0 / 2021-02-11
WARNING: The self updater does not support updating from 1.11.0 to 1.12.0. Our
release infrastructure does not support the key type used in 1.11.0.
NOTE: This release drops the integrations that were moved to their own repos,
i.e. `git-credential-gopass`, `gopass-hibp`, `gopass-jsonapi` and
`gopass-summon-provider`.
We have implemented proper release signing and verification for the self
updater and brought it back.
* [BUGFIX] Add signature verification for updater (#1717, #1676)
* [BUGFIX] Allow using tilde (#1713, #872)
* [BUGFIX] Always allow removing mounts (#1748, #1746)
* [BUGFIX] Ask passphrase upon key generation (#1715, #1698)
* [BUGFIX] Do not overwrite age keyring (#1734, #1678)
* [BUGFIX] Remove empty parents on gopass rm -r (#1725, #1723)
* [BUGFIX] The empty password must now be confirmed too (#1719)
* [BUGFIX] Use the first GPG found in path on Windows (#1751, #1635)
* [BUGFIX] Warn about --throw-keyids (#1759, #1756)
* [BUGFIX] fixed mixed case keys for key-value, all keys are lower case now (#1778)
* [CLEANUP] Remove migrated binaries (#1712, #1673, #1649, #1652, #1631, #1165, #1711, #1670, #1639)
* [CLEANUP] Remove the ondisk backend (#1720)
* [ENHANCEMENT] Add -A and -B to pwgen (#1716)
* [ENHANCEMENT] Add Pinentry CLI fallback (#1697, #1655)
* [ENHANCEMENT] Add REPL cmd lock (#1744)
* [ENHANCEMENT] Add optional pinentry unescaping (#1621)
* [ENHANCEMENT] Add tpl funcs for Bcrypt and Argon2 (#1706, #1689)
* [ENHANCEMENT] Add windows support to the self updater (#1724, #1722)
* [ENHANCEMENT] Confirm new age keyring passphrases (#1747)
* [ENHANCEMENT] KV secrets are now key-values, supporting multiple same key with different values (#1741)
* [ENHANCEMENT] UTF-8 emojis (#1715, #1698)
* [ENHANCEMENT] Use gpgconf to the the gpg binary (#1758, #1757)
* [ENHANCEMENT] Use main as the git default branch (#1749, #1742)
* [ENHANCEMENT] Use persistent SSH connections (#1755)
* [TESTING] Adding DI to Github Actions (#1728)
## 1.11.0 / 2020-01-12
This is an important bugfix release that should resolve several outstanding
issues and concerns. Since 1.10.0 was released was engaged in a lot of
discussions and realized that compatibility is more important than we first
thought. So we're rolling back some breaking changes and revise some parts of
our roadmap. We will strive to remain compatible with other password store
implementations - but remember this is a goal, not a promise. This means we'll
continue using compatible secrets formats as well as GPG and Git.
* [BUGFIX] Allow secret names to have a colon in the name
* [BUGFIX] Apply limit in list correctly
* [BUGFIX] Correcting newlines handling
* [BUGFIX] Correct missing padding to TOTP entry
* [BUGFIX] Create cache folder if doesn't exist. Relevant
* [BUGFIX] Disable gopass update
* [BUGFIX] Disabling all kind of parsing of the input
* [BUGFIX] Do not duplicate key password in K/V secrets
* [BUGFIX] Do not search for new secrets
* [BUGFIX] fixes gopass-jsonapi for MacTools GPGSuite users.
* [BUGFIX] Fix legacy config parsing
* [BUGFIX] fsck won't correct recipients without --decrypt
* [BUGFIX] Insert is not resetting the pw now if a key:value pair is specified inline
* [BUGFIX] Insert is now parsing its stdin input
* [BUGFIX] Invalidate GPG key list after generation
* [BUGFIX] List no longer uses the store size as its default depth
* [BUGFIX] Nil dereference in cui
* [BUGFIX] Pass arguments to a notification program
* [BUGFIX] Password insert prompt now works on Windows but
* [BUGFIX] Re-adding the global --yes flag
* [BUGFIX] Remove GPG location caching
* [BUGFIX] Restore path-removal from old config-format
* [BUGFIX] Show now correctly handles -C and -u together
* [BUGFIX] The deprecation warning is now output on stderr
* [BUGFIX] Trim version prefix in jsonapi
* [CLEANUP] Remove MIME
* [CLEANUP] Remove the unfinished xc backend
* [CLEANUP] Update to minio/v7
* [DOCUMENTATION] Edited features.md
* [DOCUMENTATION] Improve contributing guide.
* [DOCUMENTATION] Slight updates to reflect the recent code
* [ENHANCEMENT] Adding a trailing separator to the listed folders
* [ENHANCEMENT] Adding the flag show -n to disable output parsing
* [ENHANCEMENT] Adding the option parsing to disable all parsing
* [ENHANCEMENT] fsck now detects leftover Mime secrets
* [ENHANCEMENT] Full windows support
* [ENHANCEMENT] Prompt for edit search result
* [ENHANCEMENT] Re-introduce gopass -c
* [ENHANCEMENT] Show GPG --gen-key error to the user
* [ENHANCEMENT] This is required when using e.g. Gnome Keyring.
* [ENHANCEMENT] Use 32 byte salt by default
* [UX] Preserve content across retries
## 1.10.1
* [BUGFIX] Fix the Makefile
* [BUGFIX] Remove misleading config error message
* [BUGFIX] Re-use existing root store
* [BUGFIX] Use standard Unix directories on MacOS
## 1.10.0
WARNING: This release contains a few breaking changes as well as necessary
packaging changes.
This release is building the foundation for an eventual 2.0 release
which will drop many legacy features and significantly shrink the
codebase to ensure long term maintainability. The goal is to remove
the support for multiple backends and any external dependencies,
including `git` and `gpg` binaries. By default the tool should be easy to use,
secure and modern. We will still support our flagship use cases,
like working in teams. Also gopass might eventually move to an
fully encrypted backend where we don't leak information through
filenames.
Any gopass 1.x release should still be compatible with any
password store implementation (possibly with some caveats).
Beyond that we plan to drop any compatibility goals.
If you are using different Password Store implementations to access your
secrets, e.g. on mobile devices, you might want to run `gopass config mime false`
before performing any kind of write operation on the password store. Otherwise
mutated secrets will be written using the new native gopass MIME format and
might not be readable from other implementations.
This release adds documentation for all supported subcommands in the `docs/commands`
folder and starts define our core use cases in the `docs/usecases` folder.
Please note that the command documentation also serves as a specification on
how these commands are supposed to operate.
Note: We have accumulated too many changes so we've decided to skip the 1.9.3
release and issue the first release of the 1.10. series.
Note to package maintainers: This release adds additional binaries which should
be included in any binary re-distribution of gopass.
* [BREAKING] New secrets format
* [BUGFIX] Allow deleting shadowed secret
* [BUGFIX] Correctly handle exportkeys and auto import for noop
* [BUGFIX] Do not allow malformed secrets
* [BUGFIX] Do not return error on no grep matches
* [BUGFIX] Fix config panic with mounts
* [BUGFIX] Fix fsck progress bar.
* [BUGFIX] Fix git init
* [BUGFIX] Fix optional key passed through find
* [BUGFIX] Fix tree shadowing.
* [BUGFIX] Handle relative path during init
* [BUGFIX] Honor generate --print
* [BUGFIX] Honor trust level during onboarding.
* [BUGFIX] Print RCS error message
* [BUGFIX] Print config parse error to STDERR
* [BUGFIX] Properly initialize crypto during onboarding and
* [BUGFIX] env command: do not crash if called without a command to execute
* [CLEANUP] Merge Storage and RCS backends
* [CLEANUP] Move internal packages to internal
* [CLEANUP] Remove autoclip for gopass show
* [CLEANUP] Remove config option confirm
* [CLEANUP] Remove curses UI
* [CLEANUP] Remove the --sync flag to gopass show
* [CLEANUP] Rename --force to --unsafe for show
* [CLEANUP] Rename xkcd generator options
* [DEPRECATION] Mark gopass git as deprecated
* [DEPRECATION] Remove AutoPrint
* [DEPRECATION] Remove askformore, autosync
* [DEPRECATION] Retire editrecipients option
* [DOCUMENTATION] Document audit, generate, insert and show
* [DOCUMENTATION] Document list flags
* [DOCUMENTATION] Improve documentation of Zsh completion setup
* [ENHANCEMENT] Add GOPASS_DISABLE_MIME to disable new
* [ENHANCEMENT] Add arm and arm64 binaries
* [ENHANCEMENT] Add gopass API (unstable)
* [ENHANCEMENT] Add regexp support to gopass grep
* [ENHANCEMENT] Add zxcvbn password strength checker
* [ENHANCEMENT] Avoid direct show on gopass search
* [ENHANCEMENT] Cache gpg binary location
* [ENHANCEMENT] Ignore binary secrets for audit
* [ENHANCEMENT] Introduce --generator flag
* [ENHANCEMENT] Introduce unsafe-keys
* [ENHANCEMENT] Make audit report passwords not changed
* [ENHANCEMENT] Make show --qr flag complementary
* [ENHANCEMENT] New Debug package
* [ENHANCEMENT] New progress bar
* [ENHANCEMENT] Print password before sync
* [ENHANCEMENT] Provide more helpful config parse errors
* [ENHANCEMENT] Rewrite tree implementation
* [ENHANCEMENT] Show recipients from subfolder id files
* [ENHANCEMENT] Speed up gpg store init
* [ENHANCEMENT] Support changing path with gopass config
* [ENHANCEMENT] Support relative revisions for show
* [ENHANCEMENT] Warn if vim might be leaking secrets
* [ENHANCEMENT] env command: more tests
* [FEATURE] Add Password Rules and Domain Alias support
* [FEATURE] Add experimental backend converter
* [FEATURE] Add remote config for ondisk storage
* [FEATURE] Add remote sync support for the ondisk backend
* [FEATURE] Add summon provider
* [FEATURE] Pinentry API: support OPTION API call
* [FEATURE] REPL
* [TESTING] Add a test to detect shadowing issue with mount
## 1.9.2 / 2020-05-13
* [BUGFIX] Bring back the custom fish completion.
* [BUGFIX] Disable AutoClip when redirecting stdout
* [ENHANCEMENT] Create new sub stores in XDG compliant locations.
## 1.9.1 / 2020-05-09
* [BUGFIX] Do not copy to clipboard with -f
* [BUGFIX] Encrypt parent directory if leaf node exists.
* [BUGFIX] Fix -c and -C for default show action.
* [BUGFIX] Hide git-credential store warning.
* [BUGFIX] Honor notifications setting.
* [BUGFIX] Simplify autoclip behavior
* [DEPRECATION] Remove PASSWORD_STORE_DIR support
* [ENHANCEMENT] Add exportkeys option.
* [ENHANCEMENT] Add memorable password generator
* [ENHANCEMENT] Add preliminary age encryption support.
## 1.9.0 / 2020-05-01
* [ENHANCEMENT] Proper windows support [#1295]
* [ENHANCEMENT] Add pwgen subcommand [#1308]
* [ENHANCEMENT] Only decrypt when needed [#1289]
* [ENHANCEMENT] Full unattended password generation [#1259]
* [ENHANCEMENT] Add -C flag [#1272]
* [ENHANCEMENT] Migrate to urface/cli/v2 [#1276]
* [ENHANCEMENT] Support Termux [#913]
* [BUGFIX] Do not fail if nothing to commit [#1168, #1103]
* [BUGFIX] Restore PASSWORD_STORE_DIR support [#1213]
* [BUGFIX] Do not remove empty second line [#1235]
* [BUGFIX] Do not disable color if no PAGER is available [#1244]
* [BUGFIX] Do not overwrite entry when reading from STDIN [#1245]
* [BUGFIX] Commit when using concurrency gt 1 [#1246]
* [BUGFIX] Do not error out when listing a leaf node [#1300]
* [BUGFIX] Do not overwrite config if PASSWORD_STORE_DIR is set [#1286]
* [BUGFIX] Fix go get support [#1288]
* [DEPRECATION] Remove Dockerfile [#1309]
* [DEPRECATION] Remove Bintray [#1304]
* [DEPRECATION] Deprecate OTP, Binary, YAML git-credentials and xc support [#1301]
* [DEPRECATION] Remove support for OpenPGP (library), GoGit, Vault, Consul and encrypted configs [#1290, #1283, #1282, #1279]
## 1.8.6 / 2019-07-26
* [ENHANCEMENT] Add --password to otp command [#1150]
* [ENHANCEMENT] Support adding key values with colons [#1128]
* [BUGFIX] Allow overwriting directories with --force [#1149]
* [BUGFIX] Sort list of stores when adding recipients [#1144]
* [BUGFIX] Sort recipients by Name not by ID [#1143]
* [BUGFIX] Handle slashes in recipient names [#1139]
## 1.8.5 / 2019-03-03
* [ENHANCEMENT] Improve template handling [#1029]
* [ENHANCEMENT] Remove empty directories [#1009]
* [ENHANCEMENT] Improve performance of unclip [#923]
* [ENHANCEMENT] Add AutoPrint option [#1065]
* [ENHANCEMENT] Follow the rsync convention for cp/mv commands [#1055]
* [BUGFIX] Fix bash completion for MSYS on Windows [#1053]
* [BUGFIX] Git clone failing [#1036]
## 1.8.4 / 2018-12-26
* [ENHANCEMENT] Evaluate templates when inserting single secrets [#1023]
* [ENHANCEMENT] Add fuzzy search dialog for gopass otp [#1021]
* [ENHANCEMENT] Add edit option to search dialog [#1019]
* [ENHANCEMENT] Introduce build tags for experimental features [#1000]
* [BUGFIX] Fix recursive delete [#1024]
* [BUGFIX] Abort tests on critical failures [#997]
* [BUGFIX] Zsh autocompletion [#996]
## 1.8.3 / 2018-11-19
* [ENHANCEMENT] Add zsh autocompletion for insert and generate [#988]
* [ENHANCEMENT] Set exit code for filtered ls without result [#983]
* [ENHANCEMENT] Improve generate command [#948]
* [ENHANCEMENT] Print summary for grep [#943]
* [ENHANCEMENT] Documentation updates [#924, #890, #918, #919, #920, #944, #952, #958, #969, #985]
* [ENHANCEMENT] jsonapi: Add windows support for configure [#904]
* [ENHANCEMENT] jsonapi: Add getVersion [#893]
* [ENHANCEMENT] Support symlinks for fs storage backend [#886]
* [BUGFIX] Offer store selection with exactly one mount point as well [#987]
* [BUGFIX] Edit entry selected by fuzzy search [#979]
* [BUGFIX] Fix path handling on windows [#970]
* [BUGFIX] Remove quotes [#967]
* [BUGFIX] Properly handle git add for removed files [#946]
* [BUGFIX] HAndle already mounted and not initialized errors [#945]
* [BUGFIX] Fix HIBP command options [#936]
* [BUGFIX] Offer secret selection on edit command [#929]
* [BUGFIX] jsonapi: add initialize [#903]
* [BUGFIX] Update external dependencies [#884, #932, #981]
* [BUGFIX] Use valid crypto backend for key selection [#889]
## 1.8.2 / 2018-06-28
* [ENHANCEMENT] Improve fsck output [#859]
* [ENHANCEMENT] Enable notifications on FreeBSD [#863]
* [ENHANCEMENT] Redirect errors to stderr [#880]
* [ENHANCEMENT] Do not writer version to config [#883]
* [BUGFIX] Fix commit on move [#860]
* [BUGFIX] Properly check store initialization [#865]
## 1.8.1 / 2018-06-08
* [BUGFIX] Trim fsck path [#856]
* [BUGFIX] Handle URL parse errors in create [#855]
## 1.8.0 / 2018-06-06
This release includes several possibly breaking changes.
The `gopass move` implementation was refactored to properly support moving
entries and subtrees across mount points. This may change the behaviour slightly.
Also the build flags were changed to build PIE binaries. This should not affect
the runtime behaviour, but we could not test this on all platforms, yet.
* [BREAKING] Make move work recursively and across stores [#821]
* [FEATURE] Add git credential caching [#743]
* [FEATURE] Add local recipient integrity checks [#800 #826]
* [ENHANCEMENT] Handle key-value pairs on generate and insert [#790]
* [ENHANCEMENT] Add gpg.listKeys caching [#804]
* [ENHANCEMENT] Add append mode for gopass insert [#807]
* [ENHANCEMENT] Support external password generators [#811]
* [ENHANCEMENT] Add gopass generate completion heuristic [#817]
* [ENHANCEMENT] Add revive linter checks [#822]
* [ENHANCEMENT] Remove -static build flag, enable CGO and -buildmode=PIE [#823]
* [ENHANCEMENT] Warn if RCS backend is noop during gopass sync [#825]
* [ENHANCEMENT] Support for special password rules on generate [#832]
* [ENHANCEMENT] Improve create wizard [#842]
* [ENHANCEMENT] Honor templates on generate [#847]
* [ENHANCEMENT] Support NO_COLOR [#851]
* [BUGFIX] Reset clipboard timer on repeated copy [#813]
* [BUGFIX] Add --force to git add invocation [#839]
* [BUGFIX] Rename updater GitHub Organisation [#818]
* [BUGFIX] Default to origin master for git pull [#819]
* [BUGFIX] Properly propagate RCS backend on gopass clone [#820]
* [BUGFIX] Fix sub store config propagation [#837 #841]
* [BUGFIX] Use default for password store dir [#846]
* [BUGFIX] Properly handle autosync on recipients save [#848]
* [BUGFIX] Resolve key IDs to fingerprints before adding or removing [#850]
## 1.7.2 / 2018-05-28
* [BUGFIX] Fix tilde expansion [#802]
## 1.7.1 / 2018-05-25
* [BUGFIX] Add nogit compat handler [#792]
* [BUGFIX] Fix reencrypt [#796]
## 1.7.0 / 2018-05-22
* [FEATURE] Pluggable crypto, storage and RCS backends. Including a pure-Go NaCl based crypto backend [#645] [#680] [#736] [#777]
* [FEATURE] Password history [#660]
* [FEATURE] Vault backend [#723] [#730]
* [FEATURE] Consul backend [#697]
* [FEATURE] HIBPv2 Dump and API support [#666] [#706]
* [FEATURE] Select recipients per secret [#703]
* [FEATURE] Add experimental OpenPGP crypto backend [#670]
* [ENHANCEMENT] Support HIBPv2 API and Dumps [#666]
* [ENHANCEMENT] Robust K/V parser with YAML fallback [#659]
* [ENHANCEMENT] Restrict fsck to given path [#721]
* [ENHANCEMENT] Refactor [#702] [#708] [#715] [#722] [#731]
* [ENHANCEMENT] Proper Makefile dependencies [#707]
* [ENHANCEMENT] Auto-copy with safecontent [#685]
* [ENHANCEMENT] Add disable notifications option [#690]
* [ENHANCEMENT] Migrate from govendor to dep [#688]
* [ENHANCEMENT] Improve test coverage [#732] [#781] [#782]
* [ENHANCEMENT] Improvate YAML handling [#739]
* [ENHANCEMENT] Audit freshly generated passwords [#761]
* [BUGFIX] Use sh instead of bash [#699]
* [BUGFIX] Lookup correct remote for current branch [#692]
* [BUGFIX] Fix GPG binary detection on Windows [#681] [#693]
* [BUGFIX] Version [#727]
* [BUGFIX] Git init [#729]
* [BUGFIX] Secret.String() [#738]
* [BUGFIX] Fix generate --symbols [#742] [#783]
## 1.6.11 / 2018-02-20
* [ENHANCEMENT] Documentation updates [#648] [#656]
* [ENHANCEMENT] Add secret completions to edit command in zsh [#654]
* [BUGFIX] Avoid escaping values added to secrets [#658]
* [BUGFIX] Fix parsing of GPG UIDs [#650]
## 1.6.10 / 2018-01-18
* [ENHANCEMENT] Add Travis MacOS builds [#618]
* [ENHANCEMENT] Make gopass build on DragonFlyBSD [#619]
* [ENHANCEMENT] Increase test coverage [#621] [#622] [#624]
* [BUGFIX] Properly handle sub-store configuration [#625]
* [BUGFIX] Fix Makefile [#615] [#617]
* [BUGFIX] Fix failing tests on MacOS [#614]
## 1.6.9 / 2018-01-05
* [BUGFIX] Fix update URL check [#610]
## 1.6.8 / 2018-01-05
* [ENHANCEMENT] Add OpenBSD Ksh completion [#586]
* [ENHANCEMENT] Increase test coverage [#589] [#590] [#592] [#595] [#596] [#597] [#601] [#602] [#603] [#604]
* [ENHANCEMENT] Update Documentation and Dockerfile [#591] [#605]
* [BUGFIX] Use Termwiz CUI on OpenBSD [#588]
* [BUGFIX] Fix create wizard [#594]
* [BUGFIX] Use persistent bufio.Reader [#607]
## 1.6.7 / 2017-12-31
* [ENHANCEMENT] Add --sync flag to gopass show [#544]
* [ENHANCEMENT] Update dependencies [#547]
* [ENHANCEMENT] Use gocui for terminal UI [#562]
* [ENHANCEMENT] Increase test coverage [#548] [#549] [#567] [#568] [#570] [#572] [#574] [#575] [#577] [#578] [#583] [#584]
* [ENHANCEMENT] Add Dockerfile [#561]
* [ENHANCEMENT] Add zsh and fish completion generator [#565]
* [ENHANCEMENT] Add go-fuzz instrumentation [#576]
* [BUGFIX] Catch URL parse errors [#546]
## 1.6.6 / 2017-12-20
* [FEATURE] Selective Sync [#538]
* [ENHANCEMENT] Make termwiz honor copy flag [#534]
* [ENHANCEMENT] Make shell completion respect binary name [#536]
* [ENHANCEMENT] Refactor [#533] [#540] [#541] [#542]
* [BUGFIX] Show git output [#529]
## 1.6.5 / 2017-12-15
* [ENHANCEMENT] Handle errors gracefully [#524]
* [BUGFIX] Follow symlinks [#519]
* [BUGFIX] Improve GPG binary detection [#520] [#522]
## 1.6.4 / 2017-12-13
* [ENHANCEMENT] Support desktop notifications on Mac and Windows [#513]
* [BUGFIX] Fix slice out of bounds error [#517]
* [BUGFIX] Allow .password-store to be a symlink [#516]
* [BUGFIX] Respect --store flag to git sub command [#512]
## 1.6.3 / 2017-12-12
* [ENHANCEMENT] Avoid altering YAML secrets unless necessary [#508]
* [ENHANCEMENT] Documentation updates [#493] [#509]
* [ENHANCEMENT] Abort if no GPG binary was found [#506]
* [ENHANCEMENT] Support GOPASS_GPG_OPTS and GOPASS_UMASK [#504]
* [BUGFIX] Create .gpg-keys if it does not exist [#507]
## 1.6.2 / 2017-12-02
* [FEATURE] Add gopass fix command [#471]
* [ENHANCEMENT] Add pledge support on OpenBSD [#469]
* [ENHANCEMENT] Improve no clipboard warning [#484]
* [BUGFIX] Allow OTP entry in password field [#467]
* [BUGFIX] Default to vi if no other editor is available [#479]
* [BUGFIX] Avoid auto-search running non-interactively [#483]
## 1.6.1 / 2017-11-15
* [FEATURE] Add generic OTP action [#440]
* [ENHANCEMENT] Ignore any secret that does not end with .gpg [#461]
* [ENHANCEMENT] Add option to display only the password [#455]
* [ENHANCEMENT] Disable fuzzy search for gopass find [#454]
* [BUGFIX] Fix .gpg-id selection for sub folders [#465]
* [BUGFIX] Set gpg.program if possible [#464]
* [BUGFIX] Allow access to secrets shadowed by a folder [#463]
* [BUGFIX] Set GPG_TTY [#452]
* [BUGFIX] Fix termbox UI on OpenBSD [#446]
* [BUGFIX] Fix tests and paths on Windows [#421] [#431] [#442] [#450]
## 1.6.0 / 2017-11-03
* [FEATURE] Add Desktop notifications (Linux/DBus only) [#434] [#435]
* [ENHANCEMENT] Show public key identities before importing [#427]
* [ENHANCEMENT] Initialize local git config on gopass clone [#429]
* [ENHANCEMENT] Do not print generated passwords by default [#430]
* [ENHANCEMENT] Clear KDE Klipper History on clipboard clearing [#434]
* [ENHANCEMENT] Refactor git backend [#437]
* [BUGFIX] Fix recipients remove when using email as identifier [#436]
## 1.5.1 / 2017-10-25
* [ENHANCEMENT] Re-introduce usecolor config option [#414]
* [ENHANCEMENT] Improve documentation [#407] [#409] [#416] [#417]
* [ENHANCEMENT] Add language switch for xckd-style generation [#406]
* [BUGFIX] Fix GPG binary detection [#419]
* [BUGFIX] Fix tests on windows [#421]
## 1.5.0 / 2017-10-17
* [FEATURE] Add secret creation wizard [#386]
* [FEATURE] Add onboarding wizard [#387]
* [FEATURE] Wizard for recipients add/remove [#359]
* [FEATURE] XKCD#936 inspired password generation [#368]
* [FEATURE] Add update wizard [#395]
* [ENHANCEMENT] Overhaul documentation [#383] [#384]
* [ENHANCEMENT] Attempt to get TOTP key from YAML [#376]
* [ENHANCEMENT] Allow find to take -c [#378]
* [ENHANCEMENT] Improve terminal wizard [#385]
* [ENHANCEMENT] Improve responsiveness by context usage [#388]
* [ENHANCEMENT] Improve output readability [#392] [#393]
* [ENHANCEMENT] Automatic GPG key generation [#391]
* [BUGFIX] Relax YAML document marker handling [#398]
## 1.4.1 / 2017-10-05
* [BUGFIX] Support pre-1.3.0 configs [#382]
* [BUGFIX] Turn YAML errors into warnings [#380]
## 1.4.0 / 2017-10-04
* [FEATURE] Add fuzzy search [#317]
* [FEATURE] Allow restricting charset of generated passwords [#270]
* [FEATURE] Check quality of newly inserted passwords with crunchy [#276]
* [FEATURE] JSON API [#326]
* [FEATURE] Per-Mount configuration options [#330]
* [FEATURE] Terminal selection of results [#259]
* [FEATURE] gopass sync [#303]
* [ENHANCEMENT] Build with Go 1.9 [#294]
* [ENHANCEMENT] Display single find result directly [#265]
* [ENHANCEMENT] Global --yes flag [#327]
* [ENHANCEMENT] Improve error handling and propagation [#280]
* [ENHANCEMENT] Omit newline when not writing to a terminal [#325]
* [ENHANCEMENT] Only commit once per recipient batch operation [#329]
* [ENHANCEMENT] Provide partial support for .gpg-id files in sub folders [#291]
* [ENHANCEMENT] Trim any trailing newlines or carriage returns in show output [#296]
* [ENHANCEMENT] Use contexts [#310]
* [ENHANCEMENT] Use contexts to cancel long running operations [#358]
* [ENHANCEMENT] Use default editors [#286]
* [ENHANCEMENT] Improve documentation [#365]
* [ENHANCEMENT] Print selected entry [#372]
* [BUGFIX] Confirm removal of directories [#309]
* [BUGFIX] Only confirm recipients once during batch operations [#328]
* [BUGFIX] Only overwrite password on insert [#323]
* [BUGFIX] Avoid Show/Find recursion [#360]
* [BUGFIX] Remove deprecated special case for .yaml files [#362]
* [BUGFIX] Do not offer invalid keys [#364]
* [BUGFIX] Assign path only if resolving symlink succeeds [#370]
## 1.3.2 / 2017-08-22
* [BUGFIX] Fix git version output [#274]
## 1.3.1 / 2017-08-15
* [BUGFIX] Enable AutoSync by default [#267]
* [BUGFIX] git - do not abort if a store has no remote [#261]
* [BUGFIX] Fix IFS in bash completion [#268]
## 1.3.0 / 2017-08-11
* [BREAKING] Enforce YAML document markers [#193]
* [BREAKING] Simplify configuration [#213]
* [BREAKING] Align gopass init flags with other commands [#252]
* [FEATURE] Implement pager feature [#163]
* [FEATURE] Add basic fish completion [#168]
* [FEATURE] Add version check [#205]
* [FEATURE] Add gopass audit command [#228]
* [FEATURE] Add gopass audit hibp command [#239]
* [ENHANCEMENT] Disable auto-push while re-encrypting [#171]
* [ENHANCEMENT] Configure git user and email before initial git commit [#185]
* [ENHANCEMENT] Add recursive git operations [#186]
* [ENHANCEMENT] Document missing config options [#188]
* [ENHANCEMENT] Only check and load missing GPG keys after git pull [#190]
* [ENHANCEMENT] Only encrypt for valid recipients [#191]
* [ENHANCEMENT] Check and import missing GPG keys on recipients show [#204]
* [ENHANCEMENT] Save recipients on show [#207]
* [ENHANCEMENT] Include GPG and Git version in gopass version output [#210]
* [ENHANCEMENT] Support more flexible YAML documents [#217]
* [ENHANCEMENT] Simplify mounts add by inferring local path [#219]
* [ENHANCEMENT] Add contributor documentation [#222]
* [ENHANCEMENT] Re-use selected encryption key for git signing [#247]
* [ENHANCEMENT] Setup git push.default [#248]
* [BUGFIX] Fix nil-pointer check on non existing sub tree [#183]
* [BUGFIX] Fix load-keys [#203]
* [BUGFIX] Only match mounts on folders [#240]
* [BUGFIX] Disable checkRecipients as it conflicts with alwaysTrust [#242]
## 1.2.0 / 2017-06-21
* [FEATURE] YAML support [#125]
* [FEATURE] Binary support [#136]
* [ENHANCEMENT] Increase test coverage [#160]
* [ENHANCEMENT] Use secure temporary storage on MacOS [#144]
* [ENHANCEMENT] Use goreleaser [#151]
* [BUGFIX] Fix git invocation [#140]
* [BUGFIX] Fix missing recipients on init [#141]
* [BUGFIX] Fix sorting of mount points [#148]
## 1.1.2 / 2017-06-14
* [BUGFIX] Fix gopass init --store [#129]
* [BUGFIX] Fix gopass init [#127]
## 1.1.1 / 2017-06-13
* [ENHANCEMENT] Allow files and folders with the same name [#124]
* [ENHANCEMENT] Improve error messages [#121]
* [ENHANCEMENT] Add rm aliases to remove commands [#119]
* [BUGFIX] Several bug fixes for multi-repository handling [#123]
## 1.1.0 / 2017-05-31
* [FEATURE] Support templates [#1]
* [FEATURE] QR Code output [#64]
* [ENHANCEMENT] If entry was not found start search [#109]
* [ENHANCEMENT] Do not write color codes unless terminal [#111]
* [ENHANCEMENT] Make find compare case insensitive [#108]
* [ENHANCEMENT] Enforce UNIX style line endings [#105]
* [ENHANCEMENT] Use XDG_CONFIG_HOME [#67]
* [ENHANCEMENT] Support symlinks [#41]
* [ENHANCEMENT] Add nocolor config flag [#33]
* [ENHANCEMENT] Accept args for editor [#30]
* [BUGFIX] Build fixes for Windows [#14]
## 1.0.2 / 2017-03-24
* [ENHANCEMENT] Improve mounts and init commands [#87]
* [ENHANCEMENT] Document behavior of `-c` [#82]
* [ENHANCEMENT] Pass custom arguments to dmenu completion [#72]
* [ENHANCEMENT] Build with Go 1.8 [#65]
* [BUGFIX] Improve recursive deletes [#55]
* [BUGFIX] Bypass prompts on gopass insert --force [#66]
* [BUGFIX] Able to store secrets, but with errors [#13]
* [BUGFIX] Don't prompt if input from stdin [#58]
* [BUGFIX] Git add fails to "add" removed files [#57]
## 1.0.1 / 2017-02-13
* [FEATURE] Add dmenu support [#47]
* [ENHANCEMENT] Extend GOPASS_DEBUG coverage [#31]
* [ENHANCEMENT] Accept args for editor [#30]
* [ENHANCEMENT] Use gpg2 if available [#9]
* [BUGFIX] Fix git error handling in saveRecipients [#32]
* [BUGFIX] Check if ExpirationDate is set [#28]
* [BUGFIX] Change user.signkey to user.signingkey [#26]
* [BUGFIX] Only copy the first line to the clipboard [#21]
* [BUGFIX] Add search alias to find [#8]
## 1.0.0 / 2017-02-02
* [ENHANCEMENT] Support mounted sub-stores
* [ENHANCEMENT] git auto-push and auto-pull
* [ENHANCEMENT] git-style config editing
* [ENHANCEMENT] Simplified recipient management
* [ENHANCEMENT] Interactive questions for missing parameters
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
`gopass` uses GitHub to manage reviews of pull requests.
* If you are a new contributor see: [Steps to Contribute](#steps-to-contribute)
* If you have a trivial fix or improvement, go ahead and create a pull request.
* If you plan to do something more involved, first raise an issue to discuss
your idea. This will avoid unnecessary work.
* Relevant coding style guidelines are the [Go Code Review Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments)
and the _Formatting and style_ section of Peter Bourgon's [Go: Best Practices for Production Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style).
## Steps to Contribute
Should you wish to work on an issue, please claim it first by commenting on the GitHub issue you want to work on it.
This will prevent duplicated efforts from contributors.
Please check the [`help-wanted`](https://github.com/gopasspw/gopass/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) label to find issues that need help.
If you have questions about one of the issues please comment on them and one of the maintainers
will try to clarify it.
## Pull Request Checklist
* Use that [latest stable Go release](https://golang.org/dl/)
* Branch from master and, if needed, rebase to the current master branch before submitting your pull request.
If it doesn't merge cleanly with master you will be asked to rebase your changes.
* Commits should be as small as possible, while ensuring that each commit is correct independently.
* Add tests relevant to the fixed bug or new feature.
* Commit messages must contain [Developer Certificate of Origin](https://developercertificate.org/) / `Signed-off-by` line, for example:
One line description of commit
More detailed description of commit, if needed.
Signed-off-by: Your Name <your@email.com>
* The first line of the commit message, the subject line, should be prefix with a tag indicating the type of the change. These tags will be extracted and used to populate the changelog.
Valid `[TAG]`s are `[BREAKING]`, `[BUGFIX]`, `[CLEANUP]`, `[DEPRECATION]`,
`[DOCUMENTATION]`, `[ENHANCEMENT]`, `[FEATURE]`, `[TESTING]`, and `[UX]`.
## Building & Testing
* Build via `go build` to create the binary file `./gopass`.
* Run unit tests with: `make test`
* Run meta tests with: `make codequality`
* Run integration tests `make test-integration`
If any of the above don't work check out the [troubleshooting section](#troubleshooting-build).
## Releasing
See [docs/releases.md](docs/releases.md).
================================================
FILE: Dockerfile
================================================
FROM docker.io/library/golang:1.25-alpine@sha256:b6ed3fd0452c0e9bcdef5597f29cc1418f61672e9d3a2f55bf02e7222c014abd AS build-env
ENV CGO_ENABLED=0
RUN apk add --no-cache make git ncurses
# Build gopass
WORKDIR /home/runner/work/gopass/gopass
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
ARG goflags_arg=""
ENV GOFLAGS=$goflags_arg
RUN make clean
RUN make gopass
# Build gopass-jsonapi
WORKDIR /home/runner/work/gopass
RUN git clone https://github.com/gopasspw/gopass-jsonapi.git
WORKDIR /home/runner/work/gopass/gopass-jsonapi
RUN go mod download
RUN make clean
RUN make gopass-jsonapi
# Build gopass-hibp
WORKDIR /home/runner/work/gopass
RUN git clone https://github.com/gopasspw/gopass-hibp.git
WORKDIR /home/runner/work/gopass/gopass-hibp
RUN go mod download
RUN make clean
RUN make gopass-hibp
# Build gopass-summon-provider
WORKDIR /home/runner/work/gopass
RUN git clone https://github.com/gopasspw/gopass-summon-provider.git
WORKDIR /home/runner/work/gopass/gopass-summon-provider
RUN go mod download
RUN make clean
RUN make gopass-summon-provider
# Build git-credential-gopass
WORKDIR /home/runner/work/gopass
RUN git clone https://github.com/gopasspw/git-credential-gopass.git
WORKDIR /home/runner/work/gopass/git-credential-gopass
RUN go mod download
RUN make clean
RUN make git-credential-gopass
FROM docker.io/library/alpine@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1
RUN apk add --no-cache ca-certificates git gnupg
COPY --from=build-env /home/runner/work/gopass/gopass/gopass /usr/local/bin/
COPY --from=build-env /home/runner/work/gopass/gopass-jsonapi/gopass-jsonapi /usr/local/bin/
COPY --from=build-env /home/runner/work/gopass/gopass-hibp/gopass-hibp /usr/local/bin/
COPY --from=build-env /home/runner/work/gopass/gopass-summon-provider/gopass-summon-provider /usr/local/bin/
COPY --from=build-env /home/runner/work/gopass/git-credential-gopass/git-credential-gopass /usr/local/bin/
================================================
FILE: GOVERNANCE.md
================================================
# gopass project governance
## Overview
The gopass project uses a governance model commonly described as Benevolent
Dictator For Life (BDFL). This document outlines our understanding of what this
means. It is derived from the [i3 window manager project
governance](https://raw.githubusercontent.com/i3/i3/next/.github/GOVERNANCE.md).
## Roles
* user: anyone who interacts with the gopass project
* core contributor: a handful of people who have contributed significantly to
the project by any means (issue triage, support, documentation, code, etc.).
Core contributors are recognizable via GitHub’s “Member” badge.
* Benevolent Dictator For Life (BDFL): a single individual who makes decisions
when consensus cannot be reached. gopass’s current BDFL is [@dominikschulz](https://github.com/dominikschulz).
## Decision making process
In general, we try to reach consensus in discussions. In case consensus cannot
be reached, the BDFL makes a decision.
## Contribution process
Please see [CONTRIBUTING](CONTRIBUTING.md).
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright 2017 JustWatch GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: Makefile
================================================
FIRST_GOPATH := $(firstword $(subst :, ,$(GOPATH)))
PKGS := $(shell go list ./... | grep -v /tests | grep -v /xcpb | grep -v /gpb)
GOFILES_NOVENDOR := $(shell find . -name vendor -prune -o -type f -name '*.go' -not -name '*.pb.go' -print)
GOFILES_BUILD := $(shell find . -type f -name '*.go' -not -name '*_test.go')
GOPASS_VERSION ?= $(shell cat VERSION)
GOPASS_OUTPUT ?= gopass
GOPASS_REVISION := $(shell cat COMMIT 2>/dev/null || git rev-parse --short=8 HEAD)
BASH_COMPLETION_OUTPUT := bash.completion
FISH_COMPLETION_OUTPUT := fish.completion
ZSH_COMPLETION_OUTPUT := zsh.completion
CLIPHELPERS ?= ""
# Support reproducible builds by embedding date according to SOURCE_DATE_EPOCH if present
DATE := $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" '+%FT%T%z' 2>/dev/null || date -u '+%FT%T%z')
BUILDFLAGS_NOPIE := -buildvcs=true -tags=netgo -trimpath -ldflags="-s -w -X main.version=$(GOPASS_VERSION) -X main.commit=$(GOPASS_REVISION) -X main.date=$(DATE) $(CLIPHELPERS)" -gcflags="-trimpath=$(GOPATH)" -asmflags="-trimpath=$(GOPATH)"
BUILDFLAGS ?= $(BUILDFLAGS_NOPIE) -buildmode=pie
TESTFLAGS ?=
PWD := $(shell pwd)
PREFIX ?= $(GOPATH)
BINDIR ?= $(PREFIX)/bin
GO ?= GO111MODULE=on CGO_ENABLED=0 go
GOOS ?= $(shell $(GO) version | cut -d' ' -f4 | cut -d'/' -f1)
GOARCH ?= $(shell $(GO) version | cut -d' ' -f4 | cut -d'/' -f2)
TAGS ?= netgo
export GO111MODULE=on
OK := $(shell tput setaf 6; echo ' [OK]'; tput sgr0;)
all: sysinfo build
build: $(GOPASS_OUTPUT)
completion: $(BASH_COMPLETION_OUTPUT) $(FISH_COMPLETION_OUTPUT) $(ZSH_COMPLETION_OUTPUT)
gha-linux: sysinfo licensecheck crosscompile build fulltest completion
gha-osx: sysinfo build test completion
gha-windows: sysinfo build test-win completion
sysinfo:
@echo ">> SYSTEM INFORMATION"
@echo -n " PLATFORM : $(shell uname -a)"
@printf '%s\n' '$(OK)'
@echo -n " PWD: : $(shell pwd)"
@printf '%s\n' '$(OK)'
@echo -n " GO : $(shell $(GO) version)"
@printf '%s\n' '$(OK)'
@echo -n " BUILDFLAGS : $(BUILDFLAGS)"
@printf '%s\n' '$(OK)'
@echo -n " GIT : $(shell git version)"
@printf '%s\n' '$(OK)'
@echo -n " GPG : $(shell which gpg) $(shell gpg --version | head -1)"
@printf '%s\n' '$(OK)'
@echo -n " GPGAgent : $(shell which gpg-agent) $(shell gpg-agent --version | head -1)"
@printf '%s\n' '$(OK)'
clean:
@echo -n ">> CLEAN"
@rm -rf vendor/
@$(GO) clean -i ./...
@rm -f ./coverage-all.html
@rm -f ./coverage-all.out
@rm -f ./coverage.out
@find . -type f -name "coverage.out" -delete
@rm -f gopass_*.deb
@rm -f gopass-*.pkg.tar.xz
@rm -f gopass-*.rpm
@rm -f gopass-*.tar.bz2
@rm -f gopass-*.tar.gz
@rm -f gopass-*-*
@rm -f tests/tests
@rm -f *.test
@rm -rf dist/*
@printf '%s\n' '$(OK)'
$(GOPASS_OUTPUT): $(GOFILES_BUILD)
@echo -n ">> BUILD, version = $(GOPASS_VERSION)/$(GOPASS_REVISION), output = $@"
@$(GO) build -o $@ $(BUILDFLAGS)
@printf '%s\n' '$(OK)'
install: all install-completion install-man
@echo -n ">> INSTALL, version = $(GOPASS_VERSION)"
@install -m 0755 -d $(DESTDIR)$(BINDIR)
@install -m 0755 $(GOPASS_OUTPUT) $(DESTDIR)$(BINDIR)/gopass
@printf '%s\n' '$(OK)'
install-completion:
@install -d $(DESTDIR)$(PREFIX)/share/zsh/site-functions $(DESTDIR)$(PREFIX)/share/bash-completion/completions $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d
@install -m 0644 $(ZSH_COMPLETION_OUTPUT) $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_gopass
@install -m 0644 $(BASH_COMPLETION_OUTPUT) $(DESTDIR)$(PREFIX)/share/bash-completion/completions/gopass
@install -m 0644 $(FISH_COMPLETION_OUTPUT) $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d/gopass.fish
@printf '%s\n' '$(OK)'
install-man: gopass.1
@install -d -m 0755 $(DESTDIR)$(PREFIX)/share/man/man1
@install -m 0644 gopass.1 $(DESTDIR)$(PREFIX)/share/man/man1/gopass.1
fulltest: $(GOPASS_OUTPUT)
@echo ">> TEST, \"full-mode\": race detector off"
@echo "mode: atomic" > coverage-all.out
@$(foreach pkg, $(PKGS),\
echo -n " ";\
$(GO) test -run '(Test|Example)' $(BUILDFLAGS) $(TESTFLAGS) -coverprofile=coverage.out -covermode=atomic $(pkg) || exit 1;\
tail -n +2 coverage.out >> coverage-all.out;)
@$(GO) tool cover -html=coverage-all.out -o coverage-all.html
@which go-cover-treemap > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install github.com/nikolaydubina/go-cover-treemap@latest; \
fi
@go-cover-treemap -coverprofile coverage-all.out > coverage-all.svg
test: $(GOPASS_OUTPUT)
@echo ">> TEST, \"fast-mode\": race detector off"
@$(foreach pkg, $(PKGS),\
echo -n " ";\
$(GO) test -test.short -run '(Test|Example)' $(BUILDFLAGS) $(TESTFLAGS) $(pkg) || exit 1;)
test-win: $(GOPASS_OUTPUT)
@echo ">> TEST, \"fast-mode-win\": race detector off"
@$(foreach pkg, $(PKGS),\
$(GO) test -test.short -run '(Test|Example)' $(pkg) || exit 1;)
test-integration: $(GOPASS_OUTPUT)
cd tests && GOPASS_BINARY=$(PWD)/$(GOPASS_OUTPUT) GOPASS_TEST_DIR=$(PWD)/tests $(GO) test -v $(TESTFLAGS)
crosscompile:
@echo ">> CROSSCOMPILE"
@which goreleaser > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install github.com/goreleaser/goreleaser/v2@v2.11.2; \
fi
@goreleaser build --snapshot
%.completion: $(GOPASS_OUTPUT)
@printf ">> $* completion, output = $@"
@./gopass completion $* > $@
@printf "%s\n" "$(OK)"
codequality: licensecheck
@echo ">> CODE QUALITY"
@echo -n " GOLANGCI-LINT "
@which golangci-lint > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.6.1; \
fi
@golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 || exit 1
@printf '%s\n' '$(OK)'
@echo -n " KEEP-SORTED "
@which keep-sorted > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install github.com/google/keep-sorted@latest; \
fi
@keep-sorted --mode lint $(GOFILES_NOVENDOR) || exit 1
@printf '%s\n' '$(OK)'
@echo -n " CAPSLOCK "
@which capslock > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install github.com/google/capslock/cmd/capslock@latest; \
fi
@capslock -packages ./... -output=compare .capabilities.json || exit 1
@printf '%s\n' '$(OK)'
@echo -n " GOVULNCHECK "
@which govulncheck > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install golang.org/x/vuln/cmd/govulncheck@latest; \
fi
@govulncheck >/dev/null || exit 1
@printf '%s\n' '$(OK)'
licensecheck:
@echo ">> LICENSE CHECK"
@echo -n " LICENSE-LINT "
@which license-lint > /dev/null; if [ $$? -ne 0 ]; then \
$(GO) install istio.io/tools/cmd/license-lint@latest; \
fi
@license-lint --config .license-lint.yml >/dev/null || exit 1
@printf '%s\n' '$(OK)'
gen:
@$(GO) generate ./...
fmt:
@keep-sorted --mode fix $(GOFILES_NOVENDOR)
@gofumpt -w $(GOFILES_NOVENDOR)
@$(GO) mod tidy
deps:
@$(GO) build -v ./...
upgrade: gen fmt
@$(GO) get -u ./...
@$(GO) mod tidy
man:
@$(GO) run helpers/man/main.go > gopass.1
msi:
@$(GO) run helpers/msipkg/main.go
docker:
docker build -t gopass:latest .
.PHONY: clean build completion install sysinfo crosscompile test codequality release goreleaser debsign man msi docker
================================================
FILE: README.md
================================================
<p align="center">
<img src="docs/logo.png" height="250" alt="gopass Gopher by Vincent Leinweber, remixed from the Renée French original Gopher" title="gopass Gopher by Vincent Leinweber, remixed from the Renée French original Gopher" />
</p>
# Overview
[](https://securityscorecards.dev/viewer/?uri=github.com/gopasspw/gopass)
[](https://github.com/gopasspw/gopass/actions/workflows/build.yml?query=branch%3Amaster)
[](https://goreportcard.com/report/github.com/gopasspw/gopass)
[](https://repology.org/project/gopass-gopasspw/versions)
[](https://github.com/gopasspw/gopass/blob/master/LICENSE)
[](https://github.com/gopasspw/gopass/releases)
[](https://join.slack.com/t/gopassworkspace/shared_invite/zt-17jl74b5x-U1OUW4ts4AQ7eAf2V4QaaQ)
> The slightly more awesome standard UNIX password manager for teams.
Manage your credentials with ease. In a globally distributed team, on multiple devices or fully offline on an air-gapped machine.
- **Works everywhere** - The same user experience on Linux, MacOS, *BSD or Windows
- **Built for teams** - Built from our experience working in distributed development teams
- **Full autonomy** - No network connectivity required, unless you want it
# How Does It Work?
Gopass is a drop-in replacement for pass, the standard UNIX password manager.
By default your credentials are encrypted with GPG and versioned in git. This can be customized easily.
Other backends for encryption (e.g. age) and storage (e.g. fossil) are also available.
The primary interface is the command line, making it an excellent choice for CLI fans, CI/CD systems or
anything you can hook it up with. Gopass can also integrate with your browser so you can largely avoid
the command line - if you want.
# Installation
## Necessary prerequisites for running `gopass`
`gopass` can operate without any dependencies but most users will use it with `gpg` and `git`.
An external editor is required to use `gopass edit`.
## Installation through package managers
### [Homebrew](https://brew.sh) (Linux/MacOS)
[](https://github.com/Homebrew/homebrew-core/blob/master/Formula/gopass.rb)
```shell
brew install gopass
```
### [MacPorts](https://www.macports.org) (macOS)
[](https://ports.macports.org/port/gopass/)
```shell
sudo port install gopass
```
### Debian (Ubuntu, Debian, Raspbian, ...)
**Warning**: Do not install the `gopass` package from the official repositories. That is a completely different project that has no relation to us.
```shell
curl https://packages.gopass.pw/repos/gopass/gopass-archive-keyring.gpg | sudo tee /usr/share/keyrings/gopass-archive-keyring.gpg >/dev/null
cat << EOF | sudo tee /etc/apt/sources.list.d/gopass.sources
Types: deb
URIs: https://packages.gopass.pw/repos/gopass
Suites: stable
Architectures: all amd64 arm64 armhf
Components: main
Signed-By: /usr/share/keyrings/gopass-archive-keyring.gpg
EOF
sudo apt update
sudo apt install gopass gopass-archive-keyring
```
### Fedora / RedHat / CentOS
[](https://packages.fedoraproject.org/pkgs/gopass/gopass/)
```shell
dnf install gopass
```
Note: You might need to run `dnf copr enable daftaupe/gopass` first.
### Arch Linux
[](https://archlinux.org/packages/extra/x86_64/gopass/)
```shell
pacman -S gopass
```
### Windows
[](https://github.com/ScoopInstaller/Main/blob/master/bucket/gopass.json)
```shell
# WinGet
winget install Git.Git
winget install GnuPG.Gpg4win
winget install gopass.gopass
# Chocolatey
choco install gpg4win
choco install gopass
# Alternatively
scoop install gopass
```
### FreeBSD / OpenBSD
```shell
cd /usr/ports/security/gopass
make install
```
### Alpine Linux
```shell
apk add gopass
```
## Other installation options
Please see [docs/setup.md](https://github.com/gopasspw/gopass/blob/master/docs/setup.md) for other options.
### From Source
```shell
go install github.com/gopasspw/gopass@latest
```
Note: `latest` is not a stable release. We recommend to only use released versions.
### Manual download
Download the [latest release](https://github.com/gopasspw/gopass/releases/latest) and add the binary to your PATH.
# Quick start guide
Initialize a new `gopass` configuration:
```shell
gopass setup
__ _ _ _ _ _ ___ ___
/'_ '\ /'_'\ ( '_'\ /'_' )/',__)/',__)
( (_) |( (_) )| (_) )( (_| |\__, \\__, \
'\__ |'\___/'| ,__/''\__,_)(____/(____/
( )_) | | |
\___/' (_)
🌟 Welcome to gopass!
🌟 Initializing a new password store ...
🌟 Configuring your password store ...
🎮 Please select a private key for encrypting secrets:
[0] gpg - 0xFEEDBEEF - John Doe <john.doe@example.org>
Please enter the number of a key (0-12, [q]uit) (q to abort) [0]: 0
❓ Do you want to add a git remote? [y/N/q]: y
Configuring the git remote ...
Please enter the git remote for your shared store []: git@gitlab.example.org:john/passwords.git
✅ Configured
```
By default `gopass setup` will use `gpg` encryption and `git` storage. This will create a new password store in `$HOME/.local/share/gopass/stores/root` and a configuration in `$HOME/.config/gopass/config` using `gpg` encryption and `git` for versioned storage. Users can override these with e.g. `--crypto=age` to use `age` encryption instead or opt out of using a versioned store with `--storage=fs`.
An existing store can be cloned with e.g. `gopass clone git@gitlab.example.org:john/passwords.git`.
Create a new secret:
```shell
gopass create
```
List all existing secrets:
```shell
gopass ls
```
Copy an existing password to the clipboard:
```shell
gopass show -c foo
```
Remove an existing secret:
```shell
gopass rm foo
```
Other examples:
```shell
# Command structure
gopass [<command>] [options] [args]
# Shortcut for gopass show [<key>]
gopass [<key>]
# Enter the gopass REPL
gopass
# Find all entries matching the search string
gopass find github
# List your store
gopass ls
# List all mounts
gopass mounts
# List all recipients
gopass recipients
# Sync with all remotes
gopass sync
# Setup a new store
gopass setup
```
## Screenshot

## Support
Please ask on [Slack](https://join.slack.com/t/gopassworkspace/shared_invite/zt-17jl74b5x-U1OUW4ts4AQ7eAf2V4QaaQ).
## Contributing
We welcome any contributions. Please see [CONTRIBUTING.md](https://github.com/gopasspw/gopass/blob/master/CONTRIBUTING.md) for more information.
## Credit & License
gopass is licensed under the terms of the MIT license. You can find the complete text in [`LICENSE`](https://github.com/gopasspw/gopass/blob/master/LICENSE).
Please refer to our [Contributors](https://github.com/gopasspw/gopass/graphs/contributors) page for a complete list of our contributors.
================================================
FILE: VERSION
================================================
1.16.1
================================================
FILE: bash.completion
================================================
_gopass_bash_autocomplete() {
local cur opts base
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
# Use error handling to prevent crashes from invalid flags
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion 2>/dev/null ) || opts=""
local IFS=$'\n'
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -F _gopass_bash_autocomplete gopass
================================================
FILE: docs/backends/age.md
================================================
# age crypto backend
The `age` backend is an experimental crypto backend based on [age](https://age-encryption.org). It adds an
encrypted keyring on top (using age in scrypt password mode). It also has
(largely untested) support for specifying recipients as github users. This will
use their ssh public keys for age encryption.
It is well positioned to eventually replace `gpg` as the default crypto backend.
## Getting started
WARNING: This backend is experimental and the on-disk format likely to change.
To start using the `age` backend initialize a new (sub) store with the `--crypto=age` flag:
```
$ gopass age identity add [AGE-... age1...]
<if you do not specify an age secret key, you'll be prompted for one>
$ gopass init --crypto age
```
or use the wizard that will help you create a new age key:
```
$ gopass setup --crypto age
```
This will automatically create a new age keypair and initialize the new store.
Existing stores can be migrated using `gopass convert --crypto age`.
N.B. for a fully scripted or **non-interactive setup**, you can use the `GOPASS_AGE_PASSWORD` env variable
to set your identity file secret passphrase, and specify the age identity and recipients
that should be used for encrypting/decrypting passwords as follows:
```
$ gopass age identity add <AGE-...> <age1...>
$ GOPASS_AGE_PASSWORD=mypassword gopass init --crypto age <age1...>
```
Notice the extra space in front of the command to skip most shell's history.
You'll need to set your name and username using `git` directly if you're using it as storage backend (the default one).
You can also specify the ssh directory by setting environment variable
```
$ GOPASS_SSH_DIR=/Downloads/new_ssh_dir gopass init --crypto age <age1...>
```
## Features
* Encryption using `age` library, can be decrypted using the `age` CLI
* Support for native age, ssh-ed25519 and ssh-rsa recipients
* Support for encrypted ssh private keys
* Support for using GitHub users' private keys, e.g. `github:user` as recipient
* Automatic downloading and caching of SSH keys from GitHub
* Encrypted keyring for age keypairs
* Support for age plugins
* Caching of passphrases via an agent
## Agent
The age backend comes with an agent that can cache the passphrases for your age identities.
The agent is started automatically by gopass if it's not already running.
You can disable the agent by setting `age.agent-enabled` to `false` in your gopass config.
The agent performs the decryption and the passphrase never leaves the agent process.
The agent listens on a unix socket at `$XDG_RUNTIME_DIR/gopass/gopass-age-agent.sock`.
You can interact with the agent using the following commands:
- `gopass age agent`: starts the agent in the foreground.
- `gopass age lock`: locks the agent, clearing all cached passphrases.
## Usage with a yubikey
To use with a Yubikey, `age` requires the usage of the [age-plugin-yubikey plugin](https://github.com/str4d/age-plugin-yubikey/).
Assuming you have Rust installed:
```bash
$ cargo install age-plugin-yubikey
$ age-plugin-yubikey -i
<should be empty>
$ age-plugin-yubikey
✨ Let's get your YubiKey set up for age! ✨
<follow instructions to setup a PIV slot>
$ age-plugin-yubikey -i
<should display your PIV slot information now>
$ gopass age identities add
Enter the age identity starting in AGE-:
<paste the `AGE-PLUGIN-YUBIKEY-...` identity from the previous command>
Provide the corresponding age recipient starting in age1:
<paste the `age1yubikey1...` recipient from the previous command>
```
If gopass tells you `waiting on yubikey plugin...` when decrypting secrets, it probably is waiting for you to touch
your Yubikey because you've set a Touch policy when setting up your PIV slot.
## Roadmap
The future of this backend largely depends on what is happening in the `age` project itself.
Assuming `age` is supporting this, we'd like to:
* Finalize GitHub recipient support
* Add Hardware token support
* Make age the default gopass backend
================================================
FILE: docs/backends/cryptfs.md
================================================
# cryptfs storage backend
The `cryptfs` backend is an experimental storage backend **PREVIEW**. It hashes secret names and stores the mapping from names to actual file inside an `age` encrypted lookup table. The filesystem backing this storage backend is flexible, but by default uses `gitfs`.
**WARNING**: Do not use unless you want to contribute to the development of this backend!
================================================
FILE: docs/backends/fossilfs.md
================================================
# `fossilfs` storage backend
This is an **EXPERIMENTAL** storage backend that uses the Fossil SCM. It isn't well tested and only exists to provide an example how a non-git backend could look like.
================================================
FILE: docs/backends/fs.md
================================================
# fs storage backend
The simplest storage backend, often used for testing.
It stores data directly in the filesystem without any RCS support.
================================================
FILE: docs/backends/gitfs.md
================================================
# `gitfs` storage backend
This is the default storage backend. It stores the encrypted data directly in the filesystem. It uses an external git binary to provide history and remote sync operations.
gopass configures git to use persistent ssh connections. If you do not want
this set `GIT_SSH_COMMAND` to an empty string to override the built-in default.
================================================
FILE: docs/backends/gpg.md
================================================
# gpg crypto backend
The `gpgcli` backend is the default crypto backend based on the `gpg` CLI. It depends on the GPG installation to be working and having a properly initialized keyring.
## Getting started
WARNING: This backend suffers from myriads of different configuration options, a poor scripting interface and not pure-Go libarary bindings being available.
To start using the `gpgcli` backend initialize a new (sub) store with the `--crypto=gpgcli` flag:
```
gopass init --crypto gpgcli
gopass recipients add 0xDEADBEEF
```
## Features
* Compatible with other password store implementations
* Support for all GPG features, like smart-cards or hardware tokens
## Caveats
* Using long key sizes (e.g. 4096 bit or longer) can make many operations a lot slower
* Some GPG installations don't work well with concurrent operations
## Roadmap
This backend is the single most annoying source of maintenance workload in this project.
We try to keep this backend working as good as possible but there are a lot of reasons
why we'd prefer eventually move beyond GPG.
### GPG Critism
This section is a growing list of references why GPG is bad and why you should avoid it.
That might sound like an unusual thing to say for the authors of a tool whose main use case
relies on GPG but whenever we tried to move beyond GPG we got a lot of backlash. So I guess
first we need to try to make use understand why you shouldn't hold on to GPG and by then we'll
try to have a replacement ready for you.
* [What's the matter with PGP](https://blog.cryptographyengineering.com/2014/08/13/whats-matter-with-pgp/)
* [The PGP Problem](https://latacora.micro.blog/2019/07/16/the-pgp-problem.html)
* [I'm giving up on PGP](https://blog.filippo.io/giving-up-on-long-term-pgp/)
* [GPG and Me](https://moxie.org/2015/02/24/gpg-and-me.html)
================================================
FILE: docs/backends/jjfs.md
================================================
# `jjfs` storage backend
This is an **EXPERIMENTAL** storage backend that uses the JJ / Git. It isn't well tested and only exists to provide an example how a non-git backend could look like.
================================================
FILE: docs/backends.md
================================================
# Backends
gopass supports pluggable backends for Storage and Revision Control System (`storage`) and Encryption (`crypto`).
As of today, the names and responsibilities of these backends are still unstable and will probably change.
By providing suitable backends, gopass can use different kinds of encryption or storage.
For example, it is pretty straightforward to add mercurial or bazaar as an SCM backend.
All backends are in their own packages below `backend/`. They need to implement the
interfaces defined in the backend package and have their identification added to
the context handlers in the same package.
## Storage and RCS Backends (storage)
* [fs](backends/fs.md) - Filesystem storage without RCS support
* [gitfs](backends/gitfs.md) - Filesystem storage with Git RCS
* [fossilfs](backends/fossilfs.md) - Filesystem storage with Fossil RCS. **Highly experimental, likely broken**. Use only if you want to contributed to the backend.
* [jjfs](backends/jjfs.md) - Filesystem storage with JJ RCS. **Highly experimental, likely broken**. Use only if you want to contributed to the backend.
* [cryptfs](backends/cryptfs.md) - Fully encrypted filesystem storage. **Highly experimental, likely broken**. Use only if you want to contributed to the backend.
## Crypto Backends (crypto)
* [gpgcli](backends/gpg.md) - depends on a working gpg installation
* plain - A no-op backend used for testing. WARNING: DOES NOT ENCRYPT!
* [age](backends/age.md) - This backend is based on [age](https://github.com/FiloSottile/age). It adds an encrypted keyring on top (using age in scrypt password mode). It also has (largely untested) support for specifying recipients as github users. This will use their ssh public keys for age encryption. This backend might very well become the new default backend.
================================================
FILE: docs/commands/audit.md
================================================
# `audit` command
The `audit` command will decrypt all secrets and scan for weak passwords or other common flaws.
## Synopsis
```
$ gopass audit
```
## Excludes
You can exclude certain secrets from the audit by adding a `.gopass-audit-exclude` file to the secret. The file should contain a list of RE2 patters to exclude, one per line. For example:
```
# Lines starting with # are ignored. Trailing comments are not supported.
# Exclude all secrets in the pin folder.
# Note: These are RE2, not Glob patterns!
pin/.*
# Literal matches are also valid RE2 patterns
test_folder/ignore_this
# Gopass internally uses forward slashes as path separators, even on Windows. So no need to escape backslashes.
```
## Password strength backends
| Backend | Description |
|-------------------------------------------------|------------------------------------------------------------------------|
| [`crunchy`](https://github.com/muesli/crunchy) | Crunchy password strength checker |
| `name` | Checks if password equals the name of the secret |
================================================
FILE: docs/commands/cat.md
================================================
# `cat` command
The `cat` command is used to pipe password in and out of STDIN and STDOUT
respectively. As it is intended to be used with binary data, it encodes the
data-stream to store it.
## Synopsis
```bash
$ echo "test" | gopass cat test/new
$ gopass cat test/new
```
## Modes of operation
* Create a new entry with data-stream from STDIN
* Change an existing entry to data-stream from STDIN
* Retrive encoded data from password-store and echo it to STDOUT
Cat is intended to work with binary data, so it accepts any kind of stream from
STDIN. It reads the binary-stream from STDIN and encodes it Base64 and saves it
in the password store encoded, with some metadata about the input-stream and the
used encoding (currently only Base64 supported).
### Example
```
$ echo "234" | gopass cat test/new
$ gopass show -f test/new
Secret: test/new
content-disposition: attachment; filename="STDIN"
content-transfer-encoding: Base64
MjM0Cg==
$ gopass cat test/new
234
```
### Differences to `insert`
In contrast to `insert` it handles any kind of data-stream from STDIN and
encodes it.
Drawback: you can not just simply read the password with `gopass show`.
## Flags
This command has currently no supported flags except the gopass globals.
================================================
FILE: docs/commands/clone.md
================================================
# `clone` command
The `clone` command allows cloning and setting up a new password store
from a remote location, e.g. a remote git repo.
## Synopsis
```
$ gopass clone git@example.com/store.git
$ gopass clone git@example.com/store.git sub/store
```
## Flags
| Flag | Aliases | Description |
|------------|---------|-----------------------------------------------------------------|
| `--path` | | The path to clone the repo to. |
| `--crypto` | | Override the crypto backend to use if the auto-detection fails. |
================================================
FILE: docs/commands/config.md
================================================
# `config` command
The config command allows displaying and altering configuration options.
Note: To manage mounts use `gopass mounts`.
## Synopsis
```bash
gopass config
gopass config generate.autoclip
gopass config generate.autoclip false
```
## Flags
| Flag | Description |
|-----------|--------------------------------|
| `--store` | Only sync a specific sub store |
================================================
FILE: docs/commands/convert.md
================================================
# `convert` command
The `convert` command exists to migrate stores between different backend
implementations.
Note: This command exists to enable a possible migration path. If we agree
on a single set of backend implementations the multiple backend support
might go away and this command as well.
Warning: Converting between different RCS backends will loose part of the history. While we try to retain as much information as possible especially the commit timestamps will be set to the convert time.
## Synopsis
```
$ gopass convert --store=foo --move=true --storage=gitfs --crypto=age
$ gopass convert --store=bar --move=false --storage=fs --crypto=plain
```
## Flags
Flag | Description
---- | -----------
`--store` | Substore to convert.
`--move` | Remove backup after converting? (default: `false`)
`--storage` | Target storage backend.
`--crypto` | Target crypto backend.
================================================
FILE: docs/commands/create.md
================================================
# `create` command
The `create` command creates a new secret using a set of built-in or custom templates.
It implements a wizard that guides inexperienced users through the secret creating.
The main design goal of this command was to guide users through the creation of a secret
and asking for the necessary information to create a reasonable secret location.
## Synopsis
```bash
gopass create
gopass create --store=foo
```
## Modes of operation
* Create a new secret using a wizard
## Templates
`gopass create` will look for files ending in `.yml` in the folder `.gopass/create` inside
the selected store (by default the root store).
To add new templates to the wizard add templates to this folder.
Example:
```bash
$ cat $(gopass config mounts.path)/.gopass/create/aws.yml
---
priority: 5
name: "AWS"
prefix: "aws"
name_from:
- "org"
- "user"
welcome: "🧪 Creating AWS credentials"
attributes:
- name: "org"
type: "string"
prompt: "Organization"
min: 1
- name: "user"
type: "string"
prompt: "User"
min: 1
- name: "password"
type: "password" # hide input
prompt: "Password"
charset: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%&*"
min: 10
strict: true # ensure at least one char from each detected class (upper, lower, digit, symbol)
- name: "comment"
type: "string"
prompt: "Comments"
```
## Template Attributes
Template attributes support the following fields:
| Field | Type | Description |
|-----------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | string | The name of the attribute. This will be used as the key in the secret's YAML data. |
| `type` | string | The type of attribute. Supported values: `string`, `hostname`, `password`. |
| `prompt` | string | The prompt text to display to the user. |
| `charset` | string | For password type: Custom character set to use when generating the password. If not specified, standard character classes will be used. |
| `min` | int | Minimum length validation for the attribute value. |
| `max` | int | Maximum length validation for the attribute value. |
| `always_prompt` | bool | For password type: Always prompt for the password instead of offering password generation. Default: `false`. |
| `strict` | bool | For password type with `charset`: Enforce that all detected character classes (uppercase, lowercase, digits, symbols) present in the charset are represented in the generated password. Similar to `--strict` in `gopass generate`. Default: `false`. |
## Flags
| Flag | Aliases | Description |
|-----------|---------|------------------------------------------------------------------|
| `--store` | `-s` | Select the store to use. Will be used to look up user templates. |
| `--force` | `-f` | For overwriting existing entries. |
| `--print` | `-p` | Print the password to STDOUT. |
================================================
FILE: docs/commands/delete.md
================================================
# `delete` command
The `delete` command is used to remove a single secret or a whole subtree.
Note: Recursive operations crossing mount points are intentionally not supported.
## Synopsis
```
$ gopass delete entry
$ gopass rm -r path/to/folder
$ gopass rm -f entry
$ gopass delete entry key
```
## Modes of operation
* Delete a single secret
* Delete a single key from an existing secret
* Delete a directoy of secrets
## Flags
| Flag | Aliases | Description |
|---------------|---------|---------------------------------------|
| `--recursive` | `-r` | Recursively delete files and folders. |
| `--force` | `-f` | Do not ask for confirmation. |
## Details
* Removing a single key will need to decrypt the secret
================================================
FILE: docs/commands/edit.md
================================================
# `edit` command
The `edit` command loads a new or existing secret into your `$EDITOR` (default: `vim`)
and saves the resulting content in the password store. It will attempt to create secure
temporary directory (depending on the OS) and will warn if insecure editor configuration
(currently only `vim`) is detected.
Native `gopass` MIME secrets are syntax checked and invalid encodings are rejected.
Any other type of secret is accepted as is.
`gopass` will honor templates when creating a new entry.
## Synopsis
```
$ gopass edit entry
$ gopass edit -e /bin/nano entry
$ EDITOR=/bin/nano gopass edit entry
```
## Modes of operation
* Create a new secret
* Edit an existing secret
## Flags
| Flag | Aliases | Description |
|------------|---------|---------------------------------------------------------------------------------------------------------------------------------------|
| `--editor` | `-e` | Specify the path to an editor. Must accept the filename as it's first argument. |
| `--create` | `-c` | Create a new secret. You can create a new secret with `edit` with or without `-c`, but `-c` will skip searching for existing matches. |
================================================
FILE: docs/commands/env.md
================================================
# `env` command
The `env` command runs a binary as a subprocess with a pre-populated environment.
The environment of the subprocess is populated with a set of environment variables corresponding
to the secret subtree specified on the command line.
## Synopsis
```
$ gopass env entry env
```
================================================
FILE: docs/commands/find.md
================================================
# `find` command
The `find` command will attempt to do a simple substring match on the names of all secrets.
If there is a single match it will directly invoke `show` and display the result.
If there are multiple matches a selection will be shown.
Note: The find command will not fall back to a fuzzy search.
## Synopsis
```
$ gopass find entry
$ gopass find -f entry
$ gopass find -c entry
```
## Flags
| Flag | Aliases | Description |
|------------|---------|---------------------------------------------------------------|
| `--clip` | `-c` | Copy the password into the clipboard. |
| `--unsafe` | `-u` | Display any unsafe content, even if `safecontent` is enabled. |
================================================
FILE: docs/commands/fsck.md
================================================
# `fsck` command
`gopass` can check integrity of it's password stores with the `fsck` command.
It will ensure proper file and directory permissions as well as proper
recipient coverage (on supported crypto backends, only).
## Synopsis
```
$ gopass fsck
```
## Modes of operation
* Check the entire password store, incl. all mounts
* Check only the specified mount
## Flags
Flag | Aliases | Description
---- | ------- | -----------
`--decrypt` | | Decrypt and reencrypt all secrets.
================================================
FILE: docs/commands/fscopy.md
================================================
# `fscopy` command
The `fscopy` command is used to copy a file from your filesystem into your
password store, while keeping it in clear in your local filesystem after
having stored it in your encrypted store.
## Synopsis
```bash
$ gopass fscopy ~/test/file data/test/file-entry
$ gopass fscopy data/test/file-entry ~/file
```
## Modes of operation
This command either reads a file from the filesystem and writes the
encoded and encrypted version in the store or it decrypts and decodes
a secret and writes the result to a file. Either source or destination
must be a file and the other one a secret.
If you want the source to be removed use 'gopass fsmove'.
`fscopy` is intended to work with raw files.
### Example
```
$ gopass fscopy ~/test/file data/test/file-entry
$ gopass cat data/test/file-entry
```
See also the docs for the [`cat` action](cat.md).
## Flags
This command has currently no supported flags except the gopass globals.
================================================
FILE: docs/commands/fsmove.md
================================================
# `fsmove` command
The `fsmove` command is used to move a file from your filesystem into your
password store, erasing it from your local filesystem after having stored it in your encrypted store.
## Synopsis
```bash
$ gopass fsmove ~/test/file data/test/file-entry
$ gopass fsmove data/test/file-entry ~/file
```
## Modes of operation
This command either reads a file from the filesystem and writes the
encoded and encrypted version in the store or it decrypts and decodes
a secret and writes the result to a file. Either source or destination
must be a file and the other one a secret. The source will be wiped
from disk or from the store after it has been copied successfully
and validated. If you don't want the source to be removed use
'gopass fscopy'.
`fsmove` is intended to work with raw files.
### Example
```
$ gopass fsmove ~/test/file data/test/file-entry
$ gopass cat data/test/file-entry
```
See also the docs for the [`cat` action](cat.md).
## Flags
This command has currently no supported flags except the gopass globals.
================================================
FILE: docs/commands/generate.md
================================================
# `generate` command
The `generate` command is used to generate a new password and store it into the password store.
Note: If you only want generate a password without storing it in the store, use the `pwgen` command.
## Synopsis
```
$ gopass generate entry [length]
$ gopass generate entry key [length]
```
## Modes of operation
* Generate a new entry with a new password, e.g. a new login. Setting the `Password` field, `gopass generate entry [chars]`
* Re-generating a new password and setting it in the `Password` field of an existing entry
* Generate a new password and setting it to a new key of an existing secret, e.g. `gopass generate entry key [chars]`
* Re-generate a new password for an existing key in an existing entry
## Flags
| Flag | Aliases | Description |
|---------------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `--clip` | `-c` | Copy the generated password into the clipboard. Default: Value of `autoclip` |
| `--print` | `-p` | Print the generated password to the terminal. Default: false. |
| `--force` | `-f` | Force overwriting an existing entry. |
| `--edit` | `-e` | Generate a password and open the entry for editing in `$EDITOR`. |
| `--generator` | `-g` | Choose of of the available password generators, desribed below. Default: `cryptic` |
| `--symbols` | `-s` | Include symbols in the generated password (default: `false`) |
| `--strict` | | Ensure each requested character class is actually included. Without this option all requested classes can be included, but not necessarily are. (default: `false`) |
| `--sep` | | Word separator for multi-word generators. |
| `--lang` | | Language for word-based generators. |
## Password Generators
Use `--generator` to select one of the available password generators:
| Generator | Description |
|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `cryptic` | The default generator yields cryptic passwords that should work with most sites. Use `--symbols` and `--strict` if the site has specific requirements. Please note that we auto-detect the correct rules for some sites. The length argument specifies the number of characters. |
| `xkcd` | Use an [XKCD#936](https://xkcd.com/936/) style password. Use `--lang` and `--sep` to refine it's behaviour. The length argument specifies the number of words. |
| `memorable` | Generate a memorable password. The length argument specifies the minimum lenght of characters. Please note that the password might be longer if not all necessary rules were satisfied by the minimum length solution. |
| `external` | Use the external generator from `$GOPASS_EXTERNAL_PWGEN` |
## Relevant configuration options
* `autoclip` only applies to `generate`. If set the generated password is automatically copied to the clipboard - unless `--clip` is explicitly set to `--clip=false`
* `safecontent` will suppress printing of the password, unless `-p` is set. The password will not be copied, unless `-c` or the `autoclip` option are set.
## Templates
When creating a new entry gopass will look for the most specific template
by going up in the secret path looking for a file called `.pass-template`.
If any such file is found it will be used to pre-populate the generated
secret.
================================================
FILE: docs/commands/gopass.md
================================================
# `gopass` command
Calling `gopass` without any command argument is a common entry point and
has two different modes.
## Synopsis
```
$ gopass
$ gopass entry
$ gopass -c entry
```
## Modes of operation
* Invoked without any arguments `gopass` will start an interactive REPL shell. This includes zero-setup command completion and passphrase caching (for non-GPG backends).
* Invoked with one argument it will perform a (fuzzy) search and display a list of matches or the secret directly (if exactly one match).
* Invoked with two arguments it will do search and if there is a match display the named key.
## Flags
Note: DO NOT use in scripts! Use `gopass show` instead.
| Flag | Aliases | Description |
|------------|---------|----------------------------------------------------------------------------------------------------------------------------|
| `--clip` | `-c` | Copy the password value into the clipboard and don't show the content. |
| `--unsafe` | `-u` | Display unsafe content (e.g. the password) even when the `safecontent` option is set. No-op when `safecontent` is `false`. |
| `--yes` | | Assume yes on all yes/no questions or use the default on all others. |
================================================
FILE: docs/commands/grep.md
================================================
# `grep` command
The `grep` command works like the Unix `grep` tool. It decrypts all secrets
and performs a substring or regexp match on the given pattern.
## Synopsis
```
$ gopass grep foobar
```
## Modes of operations
* Search for the given pattern in all secrets
## Flags
None.
Flag | Aliases | Description
---- | ------- | -----------
`--regexp` | | Parse the pattern as a RE2 regular expression.
================================================
FILE: docs/commands/history.md
================================================
# `history` command
The `gopass history` command will show all revisions of a given secret.
## Synopsis
```
$ gopass history entry
```
## Modes of operation
* Display all revisions of the given secret.
## Flags
None.
================================================
FILE: docs/commands/init.md
================================================
# `init` command
The `init` command is used to initialize a new password store.
If no recipients are specified a useable existing private key is used.
The `init` command must be used to initilize new mounts. `gopass mounts add` only supports adding existing mounts.
Note: We do not support adding recipients using `init`. Please use `gopass recipients add` for that!
## Synopsis
```
$ gopass init
$ gopass init --crypto [age|gpg] --storage=[fs|gitfs]
```
## Flags
| Flag | Aliases | Description |
|-------------|---------|-------------------------------------------------------------------------------------------------------------|
| `--path` | `-p` | Initialize the (sub) store in this location. |
| `--store` | `-s` | Mount the newly initialized sub-store at this mount point |
| `--crypto` | | Select the crypto backend. Choose one of: `gpgcli`, `age`, `xc` (deprecated) or `plain`. Default: `gpgcli` |
| `--storage` | | Select the storage and RCS backend. Choose one of: `gitfs`, `fs`. Default: `gitfs` |
See [backends.md](../backends.md) for more information on the available backends.
================================================
FILE: docs/commands/insert.md
================================================
# `insert` command
The `insert` command is used to manually set (insert, or change) a password in the store. It applies to either new or existing secrets.
## Synopsis
```
$ gopass insert entry
$ gopass insert entry key
```
## Modes of operation
* Create a new entry with a user-supplied password, e.g. a new site with a user-generated password or one picked from `gopass pwgen`: `gopass insert entry`
* Change an existing entry to a user-supplied password
* Create and change any field of a new or existing secret: `gopass insert entry key`
* Read data from STDIN and insert (or append) to a secret
Insert is similar in effect to `gopass edit` with the advantage of not displaying any content of the secret when changing a key.
Note: `insert` will not change anything but the `Password` field (using the `insert entry` invocation) or the specified key (using the `insert entry key` invocation).
## Flags
| Flag | Aliases | Description |
|---------------|---------|------------------------------------------------------------------------------------------------------------------------|
| `--echo` | `-e` | Display the secret while typing (default: `false`) |
| `--multiline` | `-m` | Insert using `$EDITOR` (default: `false`). This identical to running `gopass edit entry`. All other flags are ignored. |
| `--force` | `-f` | Overwrite any existing value and do not prompt. (default: `false`) |
| `--append` | `-a` | Append to any existing data. Only applies if reading from STDIN. (default: `false`) |
================================================
FILE: docs/commands/link.md
================================================
# `link` command
The `link` (or `ln`) command is used to create a symlink from one secret in a
store to a target in the same store.
Note: Symlinks across different stores / mounts are currently not supported!
Note: `audit` and `list` do not recognize symlinks, yet. They will treat
symlinks as regular (different) entries.
## Synopsis
```
$ gopass ln foo/bar bar/baz
$ gopass show foo/bar
$ gopass show bar/baz
```
## Modes of operations
* Create a symlink from an existing secret to a new name, the target must not exist, yet
Note: Use `gopass rm` to remove a symlink.
## Flags
None.
================================================
FILE: docs/commands/list.md
================================================
# `list` command
The `list` command is used to list all the entries in the password store or at a given prefix.
## Synopsis
```bash
gopass ls
gopass ls path/to/entries
```
- List all the entries in the password store including the one in mounted stores: `gopass list`
- List all the entries in a given folder showing their relative path from the root: `gopass list path/to/entries`
Note: `list` will not change anything, nor encrypt or decrypt anything.
## Flags
| Flag | Aliases | Description |
|------------------|------------|-----------------------------------------------------|
| `--limit value` | `-l value` | Max tree depth (default: -1) |
| `--flat` | `-f` | Print a flat list of secrets (default: false) |
| `--folders` | `-d` | Print a flat list of folders (default: false) |
| `--strip-prefix` | `-s` | Strip prefix from filtered entries (default: false) |
The `--flat` and `--folders` flags provide a plaintext list of the entries located at
the given prefix (default prefix being the root `/`). They are notably used to produce the
completion results.
The `--flat` one will list all entries, one per line, using its full path.
The `--folders` one will display all the folders, one per line, recursively per level.
For instance an entry `folder/sub/entry` would cause it to list both:
```bash
$ gopass list --folders
folder
folder/sub
```
whereas `gopass list --flat` would have just displayed one line: `folder/sub/entry`.
The `--strip-prefix` flag is meant to be used along with `--flat` or `--folders`.
It will list the relative path from the current prefix, removing the said prefix,
instead of listing the relative paths from the root.
For instance on entry `folder/sub/entry`, running `gopass ls -f -s folder` would display
only `sub/entry` instead of `folder/sub/entry`.
The `--limit` flag starts counting its depth from the root store, which means that
a depth of 0 only lists the items in the root gopass store:
```bash
$ gopass list -l 0
gopass
├── bar/
├── foo/
└── test (/home/user/.local/share/gopass/stores/substore1)
```
A value of 1 would list all the items in the root, plus their sub-items but no more:
```bash
$ gopass list -l 1
gopass
├── bar/
│ └── bar
├── foo/
│ ├── bar
│ └── foo
└── test (/home/user/.local/share/gopass/stores/substore1)
└── foo
```
A negative value lists all the items without any depth limit.
```bash
$ gopass list -l -1
gopass
├── bar/
│ └── bar
├── foo/
│ ├── bar/
│ │ ├── bar/
│ │ │ └── bar
│ │ └── baz
│ └── foo
└── test (/home/user/.local/share/gopass/stores/substore1)
└── foo
```
The flags can be used together: `gopass -l 1 -d` will list only the folders up to a depth of 1:
```bash
$ gopass list -l 1 -d
bar/
foo/
foo/bar/
test/
test/foo/
```
## Shadowing
It is possible to have a path that is both an entry and a folder. In that case the list command
will display the folder with a marker of `(shadowed)`, it can still be accessed using
`gopass show path/to/it`, while the content of the folder can be listed using `gopass list path/to/it`.
It should also be noted that the `mount` command can completely "shadow" an entry in a password store,
simply by having the same name and this entry and its subentries will not be visible
using `ls` anymore until the substore is unmounted.
The entries shadowed by a mount will not show up in a search and cannot be accessed at all without unmounting.
For instance in our example above, maybe there is an entry test/zaz in the root store,
but since the substore is mounted as `test/`, it only displays the content of the substore.
Unmounting it reveals its shadowed entries:
```bash
$ gopass list test
test/
└── foo
$ gopass mounts rm test
$ gopass list test
test/
└── zaz
```
================================================
FILE: docs/commands/mounts.md
================================================
# `mounts` commands
The `mounts` commands allow managing mounted substores. This is one of the
distinctive core features of `gopass` and we aim making working with substores
as seamless as possible.
Instead of support for encrypting different parts of a store for different
recipients we instead encourage users to mount different stores - each
encrypted to a uniform set of recipients - into a semless virtual tree structure.
This feature is modeled after standard POSIX mount semantics.
## Synopsis
```
$ gopass mounts
$ gopass mounts add mount/point /path/to/store
$ gopass mounts remove mount/point
```
## Modes of operation
* Add a new mount
* List existing mounts
* Remove an existing mount
## Creating new mounts
You can also create new mounts using `init` even if your store is already initialized:
```
gopass init --store mynewsubstore pgpkeyidentitfier
```
(You can also specify a specific local path using `--path`, just make sure to keep your PGP key identifier, e.g. its email or fingerprint, as the last argument.)
================================================
FILE: docs/commands/move.md
================================================
# `move` command
Note: The implementations for `copy` and `move` are exactly the same. The only difference is that `move` will remove the source after a successful copy.
The `move` command works like the Unix `mv` or `rsync` binaries. It allows moving either single entries or whole folders around. Moving across mounts is supported.
If the source is a directory, the source directory is re-created at the destination if no trailing slash is found. Otherwise the contained secrets are placed into the destination directory (similar to what `rsync` does).
Please note that `move` will always decrypt the source and re-encrypt at the destination.
Moving a secret onto itself is a no-op.
## Synopsis
```
# Overwrite new/leaf
$ gopass move path/to/leaf new/leaf
# Move the content of path/to/somedir to new/dir/somedir
$ gopass move path/to/somedirdir new/dir
# Does nothing
$ gopass move entry entry
```
## Modes of operation
* Move a single secret from source to destination
* Move a folder of secrets, possibly with sub folders, from source to destination
## Flags
| Flag | Aliases | Description |
|-----------|---------|------------------------------------------------|
| `--force` | `-f` | Overwrite existing destination without asking. |
## Details
* To simplify the implementation and support multiple backends a `copy` or `move` operation will always decrypt and re-encrypt all affected secrets. Even if moving encrypted files around might be possible.
* You can move a secret to another secret, i.e. overwrite the destination. But `gopass` won't let you move a directory over a file. In that case you have to delete the destination first.
================================================
FILE: docs/commands/otp.md
================================================
# `otp` command
The `otp` command generates TOTP tokens from an OTP URL (`otpauth://`).
The command tries to parse the password and the totp fields as an OTP URI.
Note: HTOP is supported, but requires a `counter` field to keep track of it.
Note: If `show.safecontent` is enabled, OTP URIs are hidden from the `show` command,
see the [docs for show](show.md#parsing-and-secrets) to learn more about it.
## Modes of operation
* Generate the current TOTP token from a valid OTP URL
* Snip the screen to add a TOTP QR code as an OTP field to an entry.
## Flags
| Flag | Aliases | Description |
|--------------|---------|--------------------------------------------------------------------------|
| `--clip` | `-c` | Copy the time-based token into the clipboard. |
| `--alsoclip` | `-C` | Copy the time-based token into the clipboard and show it. |
| `--qr` | `-q` | Write QR code to file. |
| `--chained` | `-p` | chain the token to the password |
| `--password` | `-o` | Only display the token. For use in scripts. |
| `--snip` | `-s` | Try and find a QR code in the screen content to add as OTP to the entry. |
## Supported formats
Your secret needs to either contain a `otpauth`, `hotp` or a `totp` field.
When using the OTP code directly you can simply add it to a secret using
`gopass insert your/entry totp`.
The `otp` command also tries to parse the body of your secret to try and find a line starting
by `otpauth://` in case you're not using the key-value format for your secret.
Finally, if your secret contains nothing but a password on the first line, the `otp` command
will try and use that password to generate an OTP code. This allows use-cases where you
store your password in a given entry and your OTP code in another dedicated entry.
The otpauth URIs are typically communicated through a QR code which can be read on Linux using
the `gopass otp -s your/entry` flag. It should also work if they are added using
`gopass insert your/entry otpauth`, but won't work if you add them under the `totp`
or `hotp` keys.
Steam OTP is supported, but requires using the `otpauth` URI input to specify the
encoder, e.g. `otpauth://totp/username%20steam:username?secret=qlt6vmy6svfx4bt4rpmisaiyol6hihca&period=30&digits=5&issuer=username%20steam&encoder=steam`.
================================================
FILE: docs/commands/process.md
================================================
# `process` command
The `process` command extends the `gopass` templating to support user-supplied
template files that will be processed. These templates can access the users
credentials with the template functions documented below. That way users can
store their full configuration files publicly accessible and have any of the
recipients automatically populate it to generate a complete configuration file
on the fly.
`gopass process` writes the result to `STDOUT`. You'll likely want to redirect
it to a file.
## Synopsis
```
$ gopass process <TEMPLATE> > <OUTPUT>
```
## Flags
None.
## Examples
The templates are processed using Go's [`text/template`](https://pkg.go.dev/text/template) package.
A set of helpful template functions is added to the template. See below for a list.
### Populate a MySQL configuration
```
$ cat /etc/mysql/my.cnf.tpl
[client]
host=127.0.0.1
port=3306
user={{ getval "server/local/mysql" "username" }}
password={{ getpw "server/local/mysql" }}
$ gopass process /etc/mysql/my.cnf.tpl
[client]
host=127.0.0.1
port=3306
user=admin
password=hunter2
```
## Template functions
Function | Example | Description
-------- | ------- | -----------
`md5sum` | `{{ getpw "foo/bar" \| md5sum }}` | Calculate the hex md5sum of the input.
`sha1sum` | `{{ getpw "foo/bar" \| sha1sum }}` | Calculate the hex sha1sum of the input.
`md5crypt` | `{{ getpw "foo/bar" \| md5crypt }}` | Calculate the md5crypt of the input.
`ssha` | `{{ getpw "foo/bar" \| ssha }}` | Calculate the salted SHA-1 of the input.
`ssha256` | `{{ getpw "foo/bar" \| ssha256 }}` | Calculate the salted SHA-256 of the input.
`ssha512` | `{{ getpw "foo/bar" \| ssha512 }}` | Calculate the salted SHA-512 of the input.
`get` | `{{ get "foo/bar" }}` | Insert the full secret.
`getpw` | `{{ getpw "foo/bar" }}` | Insert the value of the password field from the given secret.
`getval` | `{{ getval "foo/bar" "baz" }}` | Insert the value of the named field from the given secret.
`argon2i` | `{{ getpw "foo/bar" \| argon2i }}` | Calculate the Argon2i hash of the input.
`argon2id` | `{{ getpw "foo/bar" \| argon2id }}` | Calculate the Argon2id hash of the input.
`bcrypt` | `{{ getpw "foo/bar" \| bcrypt }}` | Calculate the Bcrypt hash of the input.
`blake3` | `{{ getpw "foo/bar" \| blake3 }}` | Calculate the BLAKE-3 hash of the input.
================================================
FILE: docs/commands/pwgen.md
================================================
# `pwgen` command
The `pwgen` command implements a subset of the features of the Unix/Linux
`pwgen` command line tool. It aims to eventually support most of the `pwgen`
flags and mirror it's behaviour. It is mainly implemented as a curtosy for
Windows users.
## Modes of operation
* Generate a few dozen random passwords with the chosen length
## Usage
```bash
gopass pwgen [optional length]
```
## Synopsis
```bash
gopass pwgen
gopass pwgen 24
```
## Flags
Flag | Aliases | Description
---- | ------- | -----------
`--no-numerals` | `-0` | Do not include numerals in the generated passwords.
`--one-per-line` | `-1` | Print one password per line.
`--xkcd` | `-x` | Use multiple random english words combined to a password.
`--sep` | `--xs` | Word separator for multi-word passwords.
`--lang` | `--xl` | Language to generate password from. Currently only supports english (en, default).
================================================
FILE: docs/commands/recipients.md
================================================
# `recipients` commands
The set of `recipients` commands allow managing public keys that are able to
decrypt a given password store.
These commands are one of the more unique `gopass` features and we aim to
make working with this as seamless as possible.
## Synopsis
```
$ gopass recipients
$ gopass recipients add
$ gopass recipients remove
$ gopass recipients ack
```
## Modes of operation
* List all existing recipients, per mount: `gopass recipients`
* Add/Authorize a new public key to decrypt a store (mount): `gopass recipients add`
* Remove/Deuathorize an existing public key from a store (mount): `gopass recipients remove`
* Acknowledge changes in the `recipients.hash`
## Flags
Flag | Aliases | Description
`--store` | | Store to operate on.
`--force` | | Do not ask for confirmation.
## Important Remarks
WARNING: Removing a recipient can only ever work for new or changed secrets.
When a recipient is removed they will still be able to access anything that
they used to have access to. As a logical consequence one **should** change
all secrets when removing a recipient.
## Recipients hashing
This is an experimental feature that will hash the content of each mounts
recipients file (only the top most file) to display a warning when this is
changed by anyone else (local changes update it without warning). This
can happen either when a teammate modifies that file or when an attacker
tries to modify the recipients file in the central storage to get themselves
added to any newly modified secrets.
================================================
FILE: docs/commands/show.md
================================================
# `show` command
The `show` command is the most important and most frequently used command.
It allows displaying and copying the content of the secrets managed by gopass.
## Synopsis
```
$ gopass show entry
$ gopass show entry key
$ gopass show entry --qr
$ gopass show entry --password
```
## Modes of operation
* Show the whole entry: `gopass show entry`
* Show a specific key of the given entry: `gopass show entry key` (only works for key-value or YAML secrets)
## Flags
Flag | Aliases | Description
---- | ------- | -----------
`--clip` | `-c` | Copy the password value into the clipboard and don't show the content.
`--alsoclip` | `-C` | Copy the password value into the clipboard and show the content.
`--qr` | | Encode the password field as a QR code and print it. Note: When combining with `-c`/`-C` the unencoded password is copied. Not the QR code.
`--unsafe` | `-u` | Display unsafe content (e.g. the password) even when the `safecontent` option is set. No-op when `safecontent` is `false`.
`--password` | `-o` | Display only the password. For use in scripts. Takes precedence over other flags.
`--revision` | `-r` | Display a specific revision of the entry. Use an exact version identifier from `gopass history` or the special `-<N>` syntax. Does not work with native (e.g. git) refs.
`--noparsing` | `-n` | Do not parse the content, disable YAML and Key-Value functions.
`--chars` | | Display selected characters from the password.
## Details
This section describes the expected behaviour of the `show` command with respect to different combinations of flags and
config options.
Note: This section describes the expected behaviour, not necessarily the observed behaviour.
If you notice any discrepancies please file a bug and we will try to fix it.
TODO: We need to specify the expectations around new lines.
* When no flag is set the `show` command will display the full content of the secret and will parse it to support key-value lookup and YAML entries.
If the `safecontent` option is set to `true` any secret fields (current default is only `password`) are replaced with a random number of '*' characters (length: 5-10).
Using the `--unsafe` flag will reveal these fields even if `safecontent` is enabled. `--password` takes precedence of `safecontent=true` as well and displays only the password.
* The `--noparsing` flag will disable all parsing of the output, this can help debugging YAML secrets for example, where `key: 0123` actually parses into octal for 83.
* The `--clip` flag will copy the value of the `Password` field to the clipboard and doesn't display any part of the secret.
* The `--alsoclip` option will copy the value of the `Password` field but also display the secret content depending on the `safecontent` setting, i.e. obstructing the `Password` field if `safecontent` is `true` or just displaying it if not.
* The `--qr` flags operates complementary to other flags. It will *additionally* format the value of the `Password` entry as a QR code and display it. Other than that it will honor the other options, e.g. `gopass show --qr` will display the QR code *and* the whole secret content below. One special case is the `-o` flag, this flag doesn't make a lot of sense in combination, so if both `--qr` and `-o` are given only the QR code will be displayed.
* Since gopass plans to supports different RCS backends we do not support arbitrary git refs as arguments to the `--revision` flag. Using those might work, but this is explicitly not supported and bug reports will be closed as `wont-fix`. There are two issues with using arbitrary git refs is that (a) this doesn't work with non-git RCS backends and (b) git versions a whole repository, not single files. So the revision `HEAD^`
might not have any changes for a given entry. Thus we only support specifc revisions obtained from `gopass history` or our custom syntax `-N` where N is an integer identifying a specific commit before `HEAD` (cf. `HEAD~N`).
## Parsing and secrets
Secrets are stored on disk as provided, but are parsed upon display to provide extra features such as the ability
to show the value of a key using: `gopass show entry key`.
The secrets are split into 3 categories:
- the plain type, which is just a plain secret without key-value capabilities
```
this is a plain secret
using multiple lines
and that's it
```
gets parsed to the same value
- the key-value type, which allows to query the value of a specific key. This does not preserve ordering.
```
this is a KV secret
where: the first line is the password
and: the keys are separated from their value by :
and maybe we have a body text
below it
```
will be parsed into (with `safecontent` enabled):
```
and: the keys are separated from their value by :
where: the first line is the password
and maybe we have a body text
below it
```
- the YAML type which implements YAML support, which means that secrets are parsed as per YAML standard.
```
s3cret
---
invoice: 0123
date : 2001-01-23
bill-to: &id001
given : Bob
family : Doe
ship-to: *id001
```
will be parsed into (with `safecontent` enabled):
```
bill-to: map[family:Doe given:Bob]
date: 2001-01-23 00:00:00 +0000 UTC
invoice: 83
ship-to: map[family:Doe given:Bob]
```
Note how the `0123` is interpreted as octal for 83. If you want to store a string made of digits such as a numerical
username, it should be enclosed in string delimiters: `username: "0123"` will always be parsed as the string `0123`
and not as octal.
By default, `safecontent` will remove the first line (the password), every line starting with `otpauth://` in the body, and every YAML values where the key is one of the following: `hotp`, `otpauth`, `password`, `totp`.
Both the key-value and the YAML format support so-called "unsafe-keys", which is a key-value that allows you to specify keys that should be hidden when using `gopass show` with `gopass config safecontent` set to true.
E.g:
```
supersecret
---
age: 27
secret: The rabbit outran the tortoise
name: John Smith
unsafe-keys: age,secret
```
will display (with safecontent enabled):
```
age: *****
name: John Smith
secret: *****
unsafe-keys: age,secret
```
unless it is called with `gopass show -n` that would disable parsing of the body, but still hide the password, or `gopass show -f` that would show everything that was hidden, including the password.
You can read more about secrets formats in its [documentation](docs/secrets.md).
Notice that if the option `parsing` is disabled in the config, then all secrets are handled as plain secrets.
================================================
FILE: docs/commands/sync.md
================================================
# `sync` command
The `sync` command is the preferred way to manually synchronize changes between
your local stores and any configured remotes.
You can also `cd` into a git-based store and manually perform git operations,
or use the `gopass git` command to automatically run a command in the correct
directory.
Note: `gopass sync` only supports one remote per store.
## Flags
| Flag | Description |
|-----------|--------------------------------|
| `--store` | Only sync a specific sub store |
================================================
FILE: docs/commands/templates.md
================================================
# `templates` commands
The template support is one of the more unique `gopass` features. It allows
password stores to define templates that will automatically apply to any new
secret create at or below the template path. For example this can be useful
to generate a new email password and its salted hash at the same time. Or a
PostgreSQL password with the custom salted hash. This is certainly a feature
that's not used very often, but if used correctly it can greatly reduce the
toil of some common operations.
This uses Go's [text/template](https://pkg.go.dev/text/template) package.
## Synopsis
```shell
gopass templates
gopass templates show template
gopass templates edit template
gopass templates remove template
```
## Flags
None.
## Examples
### Compute the salted hash for the password
```text
Password: {{ .Content }}
SSHA256: {{ .Content | ssha256 }}
```
### Compute the SQL statements to create a new PostgreSQL user
```text
{{ .Content }}
---
sql: |
CREATE ROLE {{ .Name }} LOGIN PASSWORD '{{ .Content }}';
GRANT {{ .Name }} TO {{ .Name }};
ALTER USER {{ .Name }} SET search_path = '{{ .Name }}';
```
## Template functions
Function | Example | Description
-------- | ------- | -----------
`md5sum` | `{{ .Content \| md5sum }}` | Calculate the hex md5sum of the input.
`sha1sum` | `{{ .Content \| sha1sum }}` | Calculate the hex sha1sum of the input.
`md5crypt` | `{{ .Content \| md5crypt }}` | Calculate the md5crypt of the input.
`ssha` | `{{ .Content \| ssha }}` | Calculate the salted SHA-1 of the input.
`ssha256` | `{{ .Content \| ssha256 }}` | Calculate the salted SHA-256 of the input.
`ssha512` | `{{ .Content \| ssha512 }}` | Calculate the salted SHA-512 of the input.
`get` | `{{ get "foo/bar" }}` | Insert the full secret.
`getpw` | `{{ getpw "foo/bar" }}` | Insert the value of the password field from the given secret.
`getval` | `{{ getval "foo/bar" "baz" }}` | Insert the value of the named field from the given secret.
`argon2i` | `{{ .Content \| argon2i }}` | Calculate the Argon2i hash of the input.
`argon2id` | `{{ .Content \| argon2id }}` | Calculate the Argon2id hash of the input.
`bcrypt` | `{{ .Content \| bcrypt }}` | Calculate the Bcrypt hash of the input.
`blake3` | `{{ .Content \| blake3 }}` | Calculate the BLAKE-3 hash of the input.
## Template variables
Note: These examples assume being evaluated for the secret `foo/bar/baz` and
the generated password `VerySecure`.
Name | Example | Description
---- | ------- | -----------
`Dir` | `foo/bar` | The directory containing the secret.
`DirName` | `bar` | The directory name containing the secret.
`Path` | `foo/bar/baz` | The path or full name of the secret.
`Name` | `baz` | The last element of the path or short name of the secret.
`Content` | `VerySecure` | The generated password.
================================================
FILE: docs/commands/update.md
================================================
# `update` command
The `update` command will attempt to auto-update `gopass` by downloading the
latest release from GitHub. It performs several pre-flight checks in order to
determine if the binary can be updated or not (e.g. if managed by a package
manager).
## Synopsis
```
$ gopass update
$ gopass update --pre
```
## Flags
Flag | Description
---- | -----------
`--pre` | Update to pre-releases / release candidates (default: `false`).
================================================
FILE: docs/components.dot
================================================
digraph G {
gopass [shape=box,style=filled,color=".2 .2 .6",peripheries=2];
gopass -> action;
action [label="internal/action"];
action -> root;
root [label="internal/store/root"];
root -> leaf;
root -> tree;
tree [label="internal/tree"];
leaf [label="internal/store/leaf"];
leaf -> gitfs;
gitfs [label="internal/backend/storage/gitfs"];
gitfs -> gitcli;
gitcli [label="git binary",shape=Mdiamond];
leaf -> gpg;
gpg [label="internal/backend/crypto/gpg/cli"];
leaf -> age [style="dotted"];
age [label="internal/backend/crypto/age"];
gpg -> gpgcli;
gpgcli [label="gpg/gpg2 binary",shape=Mdiamond];
leaf -> secret;
secret [label="pkg/gopass/secrets"];
secret -> root;
jsonapi [label="gopass-jsonapi",shape=box];
jsonapi -> api;
api [label="pkg/gopass/api"];
api -> root;
api -> config;
gopass -> config;
config [label="internal/config"];
summon -> api;
summon [label="gopass-summon-provider",shape=box];
hibp -> api;
hibp [label="gopass-hibp",shape=box];
hibp -> pkghibp;
pkghibp [label="pkg/hibp"];
gitcreds -> api;
gitcreds [label="git-credential-gopass",shape=box];
}
================================================
FILE: docs/config.md
================================================
# Configuration
## Environment Variables
Some configuration options are only available through setting environment variables.
| **Option** | **Type** | **Description** |
| ---------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CHECKPOINT_DISABLE` | `bool` | Set to any non-empty value to disable calling the GitHub API when running `gopass version`. |
| `GOPASS_AGE_PASSWORD` | `string` | Set to any value (including the empty string) to use as a password for the age identity file containing your secret age identities. |
| `GOPASS_AUTOSYNC_INTERVAL` | `int` | Set this to the number of days between autosync runs. |
| `GOPASS_CHARACTER_SET` | `bool` | Set to any non-empty value to restrict the character set used in generated passwords. |
| `GOPASS_CLIPBOARD_CLEAR_CMD` | `string` | Use an external command to remove a password from the clipboard. See [GPaste](usecases/gpaste.md) for an example |
| `GOPASS_CLIPBOARD_COPY_CMD` | `string` | Use an external command to copy a password to the clipboard. See [GPaste](usecases/gpaste.md) for an example |
| `GOPASS_CONFIG_NO_MIGRATE` | `bool` | Do not attempt to migrate old gopass configs and option names |
| `GOPASS_CONFIG_NOSYSTEM` | `bool` | Do not read `/etc/gopass/config` (if it exists) |
| `GOPASS_CONFIG` | `string` | Set this to the absolute path to the configuration file |
| `GOPASS_CPU_PROFILE` | `string` | Path to write a CPU Profile to. Use `go tool pprof` to visualize. |
| `GOPASS_DEBUG_FILES` | `string` | Comma separated filter for console debug output (files) |
| `GOPASS_DEBUG_FUNCS` | `string` | Comma separated filter for console debug output (functions) |
| `GOPASS_DEBUG_LOG_SECRETS` | `bool` | Set to any non-empty value to enable logging of credentials |
| `GOPASS_DEBUG_LOG` | `string` | Set to a filename to enable debug logging (only set GOPASS_DEBUG to log to stderr) |
| `GOPASS_DEBUG` | `bool` | Set to any non-empty value to enable verbose debug output, by default on stderr, unless GOPASS_DEBUG_LOG is set |
| `GOPASS_DEBUG_VERBOSE` | `int` | Set to any integer value larger than zero to increase the verbosity of debug output |
| `GOPASS_EXTERNAL_PWGEN` | `string` | Use an external password generator. See [Features](features.md#using-custom-password-generators) for details |
| `GOPASS_FORCE_CHECK` | `string` | (internal) Force the updater to check for updates. Used for testing. |
| `GOPASS_FORCE_UPDATE` | `bool` | Set to any non-empty value to force an update (if available) |
| `GOPASS_GPG_BINARY` | `string` | Set this to the absolute path to the GPG binary if you need to override the value returned by `gpgconf`, e.g. [QubesOS](https://www.qubes-os.org/doc/split-gpg/). |
| `GOPASS_GPG_OPTS` | `string` | Add any extra arguments, e.g. `--armor` you want to pass to GPG on every invocation |
| `GOPASS_HOMEDIR` | `string` | Set this to the absolute path of the directory containing the `.config/` tree |
| `GOPASS_HOOK` | `int` | (internal) Set when invoking hook scripts. |
| `GOPASS_MEM_PROFILE` | `string` | Path to write a Memory Profile to. Use `go tool pprof` to visualize. |
| `GOPASS_NO_AUTOSYNC` | `bool` | Set this to `true` to disable autosync. Deprecated. Please use `core.autosync` |
| `GOPASS_NO_NOTIFY` | `bool` | Set to any non-empty value to prevent notifications |
| `GOPASS_NO_REMINDER` | `bool` | Set to any non-empty value to prevent reminders |
| `GOPASS_PW_DEFAULT_LENGTH` | `int` | Set to any integer value larger than zero to define a different default length in the `generate` command. By default the length is 24 characters. |
| `GOPASS_SSH_DIR` | `string` | Set to a filepath that contains ssh keys. Overrides default location. |
| `GOPASS_UMASK` | `octal` | Set to any valid umask to mask bits of files created by gopass |
| `GOPASS_UNCLIP_CHECKSUM` | `string` | (internal) Used between gopass and it's unclip helper. |
| `GOPASS_UNCLIP_NAME` | `string` | (internal) Used between gopass and it's unclip helper. |
| `PWGEN_RULES_FILE` | `string` | (internal) Used for testing the pwgen rules generator. |
Variables not exclusively used by gopass:
| **Option** | **Type** | **Description** |
| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------ |
| `PASSWORD_STORE_DIR` | `string` | absolute path containing the password store (a directory). Only supported during initialization! |
| `PASSWORD_STORE_UMASK` | `string` | Set to any valid umask to mask bits of files created by gopass (GOPASS_UMASK has precedence over this) |
| `EDITOR`
gitextract_yjed1ue5/ ├── .capabilities.json ├── .codeclimate.yml ├── .codecov.yml ├── .errcheck.excl ├── .gemini/ │ └── settings.json ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE.md │ ├── copilot-instructions.md │ ├── dependabot.yml │ ├── stale.yml │ └── workflows/ │ ├── autorelease.yml │ ├── build.yml │ ├── codeql-analysis.yml │ ├── container.yml │ ├── golangci-lint.yml │ ├── grype.yml │ └── scorecard.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── .license-lint.yml ├── .revive.toml ├── AGENTS.md ├── ARCHITECTURE.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── GOVERNANCE.md ├── LICENSE ├── Makefile ├── README.md ├── VERSION ├── bash.completion ├── docs/ │ ├── backends/ │ │ ├── age.md │ │ ├── cryptfs.md │ │ ├── fossilfs.md │ │ ├── fs.md │ │ ├── gitfs.md │ │ ├── gpg.md │ │ └── jjfs.md │ ├── backends.md │ ├── commands/ │ │ ├── audit.md │ │ ├── cat.md │ │ ├── clone.md │ │ ├── config.md │ │ ├── convert.md │ │ ├── create.md │ │ ├── delete.md │ │ ├── edit.md │ │ ├── env.md │ │ ├── find.md │ │ ├── fsck.md │ │ ├── fscopy.md │ │ ├── fsmove.md │ │ ├── generate.md │ │ ├── gopass.md │ │ ├── grep.md │ │ ├── history.md │ │ ├── init.md │ │ ├── insert.md │ │ ├── link.md │ │ ├── list.md │ │ ├── mounts.md │ │ ├── move.md │ │ ├── otp.md │ │ ├── process.md │ │ ├── pwgen.md │ │ ├── recipients.md │ │ ├── show.md │ │ ├── sync.md │ │ ├── templates.md │ │ └── update.md │ ├── components.dot │ ├── config.md │ ├── entropy.md │ ├── faq.md │ ├── features.md │ ├── hacking.md │ ├── hooks.md │ ├── releases.md │ ├── secrets.md │ ├── security.md │ ├── setup.md │ └── usecases/ │ ├── gpaste.md │ ├── multi-store.md │ ├── readonly-store.md │ ├── secure-otp/ │ │ ├── sign-in.puml │ │ └── sign-up.puml │ └── secure-otp.md ├── fish.completion ├── go.mod ├── go.sum ├── gopass.1 ├── helpers/ │ ├── changelog/ │ │ ├── main.go │ │ └── main_test.go │ ├── gitutils/ │ │ └── gitutils.go │ ├── man/ │ │ ├── main.go │ │ └── main_test.go │ ├── modinfo/ │ │ └── main.go │ ├── msipkg/ │ │ └── main.go │ ├── postrel/ │ │ ├── main.go │ │ └── main_test.go │ ├── proxy/ │ │ ├── Dockerfile.debian │ │ ├── README-3111.md │ │ ├── apt.debughttp │ │ ├── gopass.sources │ │ └── main.go │ └── release/ │ ├── main.go │ └── main_test.go ├── internal/ │ ├── action/ │ │ ├── action.go │ │ ├── action_test.go │ │ ├── aliases.go │ │ ├── aliases_test.go │ │ ├── audit.go │ │ ├── audit_test.go │ │ ├── binary.go │ │ ├── binary_test.go │ │ ├── clihelper.go │ │ ├── clihelper_test.go │ │ ├── clone.go │ │ ├── clone_test.go │ │ ├── commands.go │ │ ├── commands_test.go │ │ ├── completion.go │ │ ├── completion_test.go │ │ ├── config.go │ │ ├── config_test.go │ │ ├── context.go │ │ ├── context_test.go │ │ ├── convert.go │ │ ├── convert_test.go │ │ ├── copy.go │ │ ├── copy_test.go │ │ ├── create.go │ │ ├── create_test.go │ │ ├── delete.go │ │ ├── delete_test.go │ │ ├── doc.go │ │ ├── edit.go │ │ ├── edit_test.go │ │ ├── env.go │ │ ├── env_test.go │ │ ├── exit/ │ │ │ ├── errors.go │ │ │ └── errors_test.go │ │ ├── find.go │ │ ├── find_test.go │ │ ├── fsck.go │ │ ├── fsck_test.go │ │ ├── generate.go │ │ ├── generate_test.go │ │ ├── git.go │ │ ├── grep.go │ │ ├── grep_test.go │ │ ├── history.go │ │ ├── history_test.go │ │ ├── init.go │ │ ├── init_test.go │ │ ├── insert.go │ │ ├── insert_test.go │ │ ├── link.go │ │ ├── link_test.go │ │ ├── list.go │ │ ├── list_test.go │ │ ├── merge.go │ │ ├── merge_test.go │ │ ├── mount.go │ │ ├── mount_test.go │ │ ├── move.go │ │ ├── move_test.go │ │ ├── otp.go │ │ ├── otp_test.go │ │ ├── process.go │ │ ├── process_test.go │ │ ├── pwgen/ │ │ │ ├── commands.go │ │ │ ├── commands_test.go │ │ │ ├── pwgen.go │ │ │ └── pwgen_test.go │ │ ├── rcs.go │ │ ├── rcs_test.go │ │ ├── recipients.go │ │ ├── recipients_test.go │ │ ├── reminder.go │ │ ├── reorg.go │ │ ├── reorg_test.go │ │ ├── repl.go │ │ ├── repl_test.go │ │ ├── setup.go │ │ ├── setup_test.go │ │ ├── show.go │ │ ├── show_test.go │ │ ├── sync.go │ │ ├── sync_test.go │ │ ├── templates.go │ │ ├── templates_test.go │ │ ├── unclip.go │ │ ├── unclip_test.go │ │ ├── update.go │ │ ├── update_test.go │ │ ├── version.go │ │ └── version_test.go │ ├── audit/ │ │ ├── audit.go │ │ ├── audit_test.go │ │ ├── excludes.go │ │ ├── excludes_test.go │ │ ├── output.go │ │ ├── output_test.go │ │ ├── report.go │ │ ├── report_test.go │ │ └── single.go │ ├── backend/ │ │ ├── context.go │ │ ├── context_test.go │ │ ├── crypto/ │ │ │ ├── age/ │ │ │ │ ├── age.go │ │ │ │ ├── age_test.go │ │ │ │ ├── agent/ │ │ │ │ │ ├── agent.go │ │ │ │ │ ├── agent_test.go │ │ │ │ │ ├── client.go │ │ │ │ │ ├── client_unix.go │ │ │ │ │ └── client_windows.go │ │ │ │ ├── agent_starter_unix.go │ │ │ │ ├── agent_starter_windows.go │ │ │ │ ├── askpass.go │ │ │ │ ├── clientUI.go │ │ │ │ ├── commands.go │ │ │ │ ├── context.go │ │ │ │ ├── context_test.go │ │ │ │ ├── decrypt.go │ │ │ │ ├── encrypt.go │ │ │ │ ├── encrypt_test.go │ │ │ │ ├── identities.go │ │ │ │ ├── identities_test.go │ │ │ │ ├── keyring.go │ │ │ │ ├── loader.go │ │ │ │ ├── loader_test.go │ │ │ │ ├── recipients.go │ │ │ │ ├── recipients_test.go │ │ │ │ ├── ssh.go │ │ │ │ └── unsupported.go │ │ │ ├── age.go │ │ │ ├── doc.go │ │ │ ├── gpg/ │ │ │ │ ├── cli/ │ │ │ │ │ ├── decrypt.go │ │ │ │ │ ├── encrypt.go │ │ │ │ │ ├── encrypt_test.go │ │ │ │ │ ├── generate.go │ │ │ │ │ ├── gpg.go │ │ │ │ │ ├── gpg_others_test.go │ │ │ │ │ ├── gpg_test.go │ │ │ │ │ ├── gpg_windows_test.go │ │ │ │ │ ├── identities.go │ │ │ │ │ ├── keyring.go │ │ │ │ │ ├── keyring_test.go │ │ │ │ │ ├── loader.go │ │ │ │ │ ├── recipients.go │ │ │ │ │ ├── recipients_test.go │ │ │ │ │ └── version.go │ │ │ │ ├── colons/ │ │ │ │ │ ├── parse_colons.go │ │ │ │ │ ├── parse_colons_test.go │ │ │ │ │ ├── parse_fuzz.go │ │ │ │ │ └── utils.go │ │ │ │ ├── context.go │ │ │ │ ├── context_test.go │ │ │ │ ├── doc.go │ │ │ │ ├── gpgconf/ │ │ │ │ │ ├── binary.go │ │ │ │ │ ├── binary_others.go │ │ │ │ │ ├── binary_windows.go │ │ │ │ │ ├── binary_windows_test.go │ │ │ │ │ ├── gpgconf.go │ │ │ │ │ ├── utils.go │ │ │ │ │ ├── utils_linux.go │ │ │ │ │ ├── utils_linux_test.go │ │ │ │ │ ├── utils_others.go │ │ │ │ │ ├── utils_test.go │ │ │ │ │ ├── utils_windows.go │ │ │ │ │ ├── version.go │ │ │ │ │ └── version_test.go │ │ │ │ ├── identity.go │ │ │ │ ├── identity_test.go │ │ │ │ ├── key.go │ │ │ │ ├── key_list.go │ │ │ │ ├── key_list_test.go │ │ │ │ └── key_test.go │ │ │ ├── gpgcli.go │ │ │ ├── plain/ │ │ │ │ ├── backend.go │ │ │ │ ├── backend_test.go │ │ │ │ └── loader.go │ │ │ └── plain.go │ │ ├── crypto.go │ │ ├── crypto_test.go │ │ ├── doc.go │ │ ├── rcs.go │ │ ├── rcs_test.go │ │ ├── registry.go │ │ ├── registry_test.go │ │ ├── storage/ │ │ │ ├── cryptfs/ │ │ │ │ ├── crypt.go │ │ │ │ ├── crypt_test.go │ │ │ │ └── loader.go │ │ │ ├── cryptfs.go │ │ │ ├── doc.go │ │ │ ├── fossilfs/ │ │ │ │ ├── context.go │ │ │ │ ├── context_test.go │ │ │ │ ├── fossil.go │ │ │ │ ├── fossil_test.go │ │ │ │ ├── loader.go │ │ │ │ ├── loader_test.go │ │ │ │ ├── settings.go │ │ │ │ ├── status.go │ │ │ │ ├── storage.go │ │ │ │ └── storage_test.go │ │ │ ├── fossilfs.go │ │ │ ├── fs/ │ │ │ │ ├── fsck.go │ │ │ │ ├── fsck_test.go │ │ │ │ ├── link.go │ │ │ │ ├── link_test.go │ │ │ │ ├── loader.go │ │ │ │ ├── rcs.go │ │ │ │ ├── rcs_test.go │ │ │ │ ├── store.go │ │ │ │ ├── store_others.go │ │ │ │ ├── store_test.go │ │ │ │ ├── store_windows.go │ │ │ │ ├── walk.go │ │ │ │ └── walk_test.go │ │ │ ├── fs.go │ │ │ ├── gitfs/ │ │ │ │ ├── commands.go │ │ │ │ ├── config.go │ │ │ │ ├── config_test.go │ │ │ │ ├── git.go │ │ │ │ ├── git_test.go │ │ │ │ ├── loader.go │ │ │ │ ├── ssh_darwin.go │ │ │ │ ├── ssh_others.go │ │ │ │ ├── ssh_windows.go │ │ │ │ └── storage.go │ │ │ ├── gitfs.go │ │ │ ├── jjfs/ │ │ │ │ ├── jj.go │ │ │ │ └── loader.go │ │ │ └── jjfs.go │ │ ├── storage.go │ │ └── storage_test.go │ ├── cache/ │ │ ├── disk.go │ │ ├── disk_test.go │ │ ├── ghssh/ │ │ │ ├── cache.go │ │ │ ├── cache_test.go │ │ │ ├── github.go │ │ │ └── github_test.go │ │ ├── inmem.go │ │ └── inmem_test.go │ ├── completion/ │ │ ├── fish/ │ │ │ ├── completion.go │ │ │ ├── completion_escaping_test.go │ │ │ ├── completion_test.go │ │ │ └── template.go │ │ └── zsh/ │ │ ├── completion.go │ │ ├── completion_escaping_test.go │ │ ├── completion_test.go │ │ └── template.go │ ├── config/ │ │ ├── config.go │ │ ├── config_test.go │ │ ├── config_windows.go │ │ ├── context.go │ │ ├── docs_test.go │ │ ├── legacy/ │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ ├── io.go │ │ │ ├── io_test.go │ │ │ ├── legacy.go │ │ │ ├── location.go │ │ │ └── location_xdg_test.go │ │ ├── legacy.go │ │ ├── location.go │ │ ├── location_test.go │ │ ├── location_xdg_test.go │ │ ├── utils.go │ │ └── utils_test.go │ ├── create/ │ │ ├── helpers.go │ │ ├── helpers_test.go │ │ ├── templates.go │ │ ├── wizard.go │ │ └── wizard_test.go │ ├── cui/ │ │ ├── actions.go │ │ ├── actions_test.go │ │ ├── cui.go │ │ ├── cui_test.go │ │ ├── recipients.go │ │ └── recipients_test.go │ ├── diff/ │ │ ├── diff.go │ │ └── diff_test.go │ ├── editor/ │ │ ├── edit_linux.go │ │ ├── edit_others.go │ │ ├── edit_others_test.go │ │ ├── edit_test.go │ │ ├── edit_windows.go │ │ ├── edit_windows_test.go │ │ └── editor.go │ ├── env/ │ │ ├── doc.go │ │ ├── env_darwin.go │ │ └── env_others.go │ ├── hashsum/ │ │ ├── hashsums.go │ │ └── hashsums_test.go │ ├── hook/ │ │ └── hook.go │ ├── notify/ │ │ ├── doc.go │ │ ├── icon.go │ │ ├── notify_darwin.go │ │ ├── notify_darwin_test.go │ │ ├── notify_dbus.go │ │ ├── notify_others.go │ │ ├── notify_test.go │ │ └── notify_windows.go │ ├── out/ │ │ ├── context.go │ │ ├── context_test.go │ │ ├── print.go │ │ └── print_test.go │ ├── pwschemes/ │ │ ├── argon2i/ │ │ │ ├── argon2i.go │ │ │ └── argon2i_test.go │ │ ├── argon2id/ │ │ │ ├── argon2id.go │ │ │ └── argon2id_test.go │ │ └── bcrypt/ │ │ ├── bcrypt.go │ │ └── bcrypt_test.go │ ├── queue/ │ │ ├── background.go │ │ └── background_test.go │ ├── recipients/ │ │ ├── recipients.go │ │ └── recipients_test.go │ ├── reminder/ │ │ ├── reminder.go │ │ └── reminder_test.go │ ├── store/ │ │ ├── err.go │ │ ├── leaf/ │ │ │ ├── context.go │ │ │ ├── context_test.go │ │ │ ├── convert.go │ │ │ ├── crypto.go │ │ │ ├── crypto_test.go │ │ │ ├── fsck.go │ │ │ ├── fsck_test.go │ │ │ ├── init.go │ │ │ ├── init_test.go │ │ │ ├── link.go │ │ │ ├── link_test.go │ │ │ ├── list.go │ │ │ ├── list_test.go │ │ │ ├── move.go │ │ │ ├── move_test.go │ │ │ ├── rcs.go │ │ │ ├── rcs_test.go │ │ │ ├── read.go │ │ │ ├── recipients.go │ │ │ ├── recipients_test.go │ │ │ ├── reencrypt.go │ │ │ ├── storage.go │ │ │ ├── store.go │ │ │ ├── store_test.go │ │ │ ├── templates.go │ │ │ ├── templates_test.go │ │ │ ├── write.go │ │ │ └── write_test.go │ │ ├── mockstore/ │ │ │ ├── inmem/ │ │ │ │ └── store.go │ │ │ ├── store.go │ │ │ └── store_test.go │ │ ├── root/ │ │ │ ├── convert.go │ │ │ ├── crypto.go │ │ │ ├── crypto_test.go │ │ │ ├── errors.go │ │ │ ├── fsck.go │ │ │ ├── fsck_test.go │ │ │ ├── init.go │ │ │ ├── init_test.go │ │ │ ├── link.go │ │ │ ├── list.go │ │ │ ├── list_test.go │ │ │ ├── mount.go │ │ │ ├── mount_test.go │ │ │ ├── move.go │ │ │ ├── move_test.go │ │ │ ├── rcs.go │ │ │ ├── rcs_test.go │ │ │ ├── read.go │ │ │ ├── read_test.go │ │ │ ├── recipients.go │ │ │ ├── recipients_test.go │ │ │ ├── store.go │ │ │ ├── store_test.go │ │ │ ├── templates.go │ │ │ ├── templates_test.go │ │ │ ├── write.go │ │ │ └── write_test.go │ │ ├── sort.go │ │ ├── sort_test.go │ │ └── store.go │ ├── tpl/ │ │ ├── funcs.go │ │ ├── funcs_test.go │ │ ├── template.go │ │ └── template_test.go │ ├── tree/ │ │ ├── node.go │ │ ├── node_test.go │ │ ├── root.go │ │ ├── root_test.go │ │ ├── tree.go │ │ └── tree_test.go │ └── updater/ │ ├── README.md │ ├── access_others.go │ ├── access_windows.go │ ├── download.go │ ├── extract.go │ ├── extract_test.go │ ├── github.go │ ├── github_test.go │ ├── update.go │ ├── update_test.go │ ├── updateable.go │ ├── verify.go │ └── verify_test.go ├── main.go ├── main_test.go ├── main_unix.go ├── pkg/ │ ├── appdir/ │ │ ├── appdir.go │ │ ├── appdir_test.go │ │ ├── appdir_windows.go │ │ ├── appdir_xdg.go │ │ ├── appdir_xdg_test.go │ │ ├── runtime_windows.go │ │ └── runtime_xdg.go │ ├── clipboard/ │ │ ├── clipboard.go │ │ ├── clipboard_others.go │ │ ├── clipboard_test.go │ │ ├── clipboard_windows.go │ │ ├── copy_darwin.go │ │ ├── copy_others.go │ │ ├── kill_others.go │ │ ├── kill_ps.go │ │ ├── unclip.go │ │ ├── unclip_linux.go │ │ ├── unclip_others.go │ │ └── unclip_test.go │ ├── ctxutil/ │ │ ├── ctxutil.go │ │ ├── ctxutil_test.go │ │ └── helper.go │ ├── debug/ │ │ ├── debug.go │ │ ├── debug_test.go │ │ ├── doc.go │ │ ├── version.go │ │ └── version_test.go │ ├── fsutil/ │ │ ├── fsutil.go │ │ ├── fsutil_test.go │ │ ├── umask.go │ │ └── umask_test.go │ ├── otp/ │ │ ├── otp.go │ │ ├── otp_test.go │ │ ├── screenshot_others.go │ │ └── screenshot_supported.go │ ├── passkey/ │ │ ├── passkey.go │ │ └── passkey_test.go │ ├── pinentry/ │ │ └── cli/ │ │ ├── fallback.go │ │ └── fallback_test.go │ ├── protect/ │ │ ├── protect.go │ │ ├── protect_openbsd.go │ │ └── protect_test.go │ ├── pwgen/ │ │ ├── cryptic.go │ │ ├── cryptic_test.go │ │ ├── external.go │ │ ├── memorable.go │ │ ├── pwgen.go │ │ ├── pwgen_others_test.go │ │ ├── pwgen_test.go │ │ ├── pwgen_windows_test.go │ │ ├── pwrules/ │ │ │ ├── aliases.go │ │ │ ├── aliases_test.go │ │ │ ├── change.go │ │ │ ├── change_test.go │ │ │ ├── gen.go │ │ │ ├── pwrules.go │ │ │ ├── pwrules_gen.go │ │ │ └── pwrules_test.go │ │ ├── rand.go │ │ ├── validate.go │ │ ├── validate_test.go │ │ ├── wordlist.go │ │ └── xkcdgen/ │ │ ├── pwgen.go │ │ └── pwgen_test.go │ ├── qrcon/ │ │ ├── qrcon.go │ │ └── qrcon_test.go │ ├── set/ │ │ ├── filter.go │ │ ├── filter_test.go │ │ ├── map.go │ │ ├── map_test.go │ │ ├── set.go │ │ ├── set_test.go │ │ ├── sorted.go │ │ └── sorted_test.go │ ├── tempfile/ │ │ ├── file.go │ │ ├── file_test.go │ │ ├── mount_darwin.go │ │ ├── mount_linux.go │ │ └── mount_others.go │ └── termio/ │ ├── ask.go │ ├── ask_test.go │ ├── context.go │ ├── context_test.go │ ├── identity.go │ ├── identity_test.go │ ├── progress.go │ ├── progress_test.go │ ├── promptpass_others.go │ ├── promptpass_test.go │ ├── promptpass_windows.go │ ├── reader.go │ └── reader_test.go ├── tests/ │ ├── age_agent_test.go │ ├── audit_test.go │ ├── binary_test.go │ ├── can/ │ │ ├── can.go │ │ ├── can_test.go │ │ └── gnupg/ │ │ ├── pubring.gpg │ │ ├── random_seed │ │ ├── secring.gpg │ │ └── trustdb.gpg │ ├── completion_test.go │ ├── config_test.go │ ├── copy_test.go │ ├── delete_test.go │ ├── find_test.go │ ├── generate_test.go │ ├── gptest/ │ │ ├── gunit.go │ │ ├── unit.go │ │ └── utils.go │ ├── grep_test.go │ ├── init_test.go │ ├── insert_test.go │ ├── list_test.go │ ├── mount_test.go │ ├── move_test.go │ ├── show_test.go │ ├── sync_test.go │ ├── tester.go │ ├── uninitialized_test.go │ └── yaml_test.go ├── version.go └── zsh.completion
Showing preview only (229K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2608 symbols across 508 files)
FILE: helpers/changelog/main.go
function main (line 23) | func main() {
FILE: helpers/changelog/main_test.go
function TestMain (line 12) | func TestMain(t *testing.T) {
FILE: helpers/gitutils/gitutils.go
function InitGitDirWithRemote (line 17) | func InitGitDirWithRemote(t *testing.T, baseDir string) string {
function initGitWithArgs (line 39) | func initGitWithArgs(t *testing.T, dir string, extraArgs ...string) stri...
function InitGitDir (line 65) | func InitGitDir(t *testing.T, dir string) string {
function InitGitBare (line 74) | func InitGitBare(t *testing.T, dir string) string {
function PopulateGitDir (line 80) | func PopulateGitDir(t *testing.T, dir string) {
function IsGitClean (line 108) | func IsGitClean(dir string) bool {
function GitCoMaster (line 129) | func GitCoMaster(dir string) error {
function GitCoBranch (line 141) | func GitCoBranch(dir, branch string) error {
function GitDelBranch (line 153) | func GitDelBranch(dir, branch string) error {
function GitPom (line 165) | func GitPom(dir string) error {
function GitAdd (line 186) | func GitAdd(dir string, files ...string) error {
function GitCommitAndPush (line 201) | func GitCommitAndPush(dir, tag string) error {
function GitCommit (line 229) | func GitCommit(dir, commitMsg string, files ...string) error {
function GitPush (line 258) | func GitPush(remote, branch string) error {
function GitTagAndPush (line 276) | func GitTagAndPush(dir string, tag string) error {
function GitHasTag (line 302) | func GitHasTag(dir string, tag string) bool {
FILE: helpers/man/main.go
function main (line 35) | func main() {
function getFlags (line 88) | func getFlags(flags []cli.Flag) []flag {
type flag (line 117) | type flag struct
type payload (line 123) | type payload struct
function lookPath (line 133) | func lookPath(file string) (string, error) {
function findExecutable (line 156) | func findExecutable(file string) error {
FILE: helpers/man/main_test.go
function TestMain (line 15) | func TestMain(t *testing.T) {
function TestGetFlags (line 34) | func TestGetFlags(t *testing.T) {
function TestLookPath (line 51) | func TestLookPath(t *testing.T) {
FILE: helpers/modinfo/main.go
function main (line 14) | func main() {
FILE: helpers/msipkg/main.go
constant logo (line 52) | logo = `
function main (line 61) | func main() {
function versionFile (line 125) | func versionFile() (semver.Version, error) {
FILE: helpers/postrel/main.go
constant logo (line 61) | logo = `
function main (line 70) | func main() {
function mustCheckEnv (line 122) | func mustCheckEnv() {
type ghClient (line 131) | type ghClient struct
method createMilestones (line 156) | func (g *ghClient) createMilestones(ctx context.Context, v semver.Vers...
method createMilestone (line 180) | func (g *ghClient) createMilestone(ctx context.Context, title string, ...
function newGHClient (line 137) | func newGHClient(ctx context.Context) (*ghClient, error) {
function runCmd (line 200) | func runCmd(dir string, args ...string) error {
function versionFile (line 209) | func versionFile() (semver.Version, error) {
function goVersion (line 218) | func goVersion(v string) string {
type inUpdater (line 235) | type inUpdater struct
method update (line 257) | func (u *inUpdater) update(ctx context.Context) {
method doUpdate (line 278) | func (u *inUpdater) doUpdate(ctx context.Context, dir string) error {
method updateWorkflows (line 374) | func (u *inUpdater) updateWorkflows(ctx context.Context, dir string) e...
method updateWorkflow (line 400) | func (u *inUpdater) updateWorkflow(_ context.Context, path string) err...
method writeVersionGo (line 424) | func (u *inUpdater) writeVersionGo(path string) error {
method updateChangelog (line 444) | func (u *inUpdater) updateChangelog(_ context.Context, dir string) err...
function newIntegrationsUpdater (line 241) | func newIntegrationsUpdater(client *github.Client, v semver.Version) (*i...
type tplPayload (line 418) | type tplPayload struct
function checksum (line 470) | func checksum(url string) (string, string, error) {
function updateBuild (line 489) | func updateBuild(path string, m map[string]*string) error {
type repo (line 522) | type repo struct
method branch (line 530) | func (r *repo) branch() string {
method commitMsg (line 534) | func (r *repo) commitMsg() string {
method updatePrepare (line 542) | func (r *repo) updatePrepare() error {
method updateFinalize (line 569) | func (r *repo) updateFinalize(path string) error {
method gitCoMaster (line 580) | func (r *repo) gitCoMaster() error {
method gitBranch (line 584) | func (r *repo) gitBranch() error {
method gitBranchDel (line 588) | func (r *repo) gitBranchDel() error {
method gitPom (line 592) | func (r *repo) gitPom() error {
method gitPush (line 596) | func (r *repo) gitPush(remote string) error {
method gitCommit (line 600) | func (r *repo) gitCommit(files ...string) error {
method isGitClean (line 604) | func (r *repo) isGitClean() bool {
function strp (line 608) | func strp(s string) *string {
FILE: helpers/postrel/main_test.go
function TestMustCheckEnv (line 15) | func TestMustCheckEnv(t *testing.T) {
function TestVersionFile (line 35) | func TestVersionFile(t *testing.T) {
function TestGoVersion (line 47) | func TestGoVersion(t *testing.T) {
function TestUpdateWorkflows (line 55) | func TestUpdateWorkflows(t *testing.T) {
FILE: helpers/proxy/main.go
function isClientOrServerError (line 37) | func isClientOrServerError(statusCode int) bool {
function isTextContentType (line 42) | func isTextContentType(contentTypeHeader string) bool {
function modifyResponse (line 59) | func modifyResponse(resp *http.Response) error {
function main (line 97) | func main() {
FILE: helpers/release/main.go
constant logo (line 63) | logo = `
function main (line 73) | func main() {
function getVersions (line 178) | func getVersions() (semver.Version, semver.Version) {
function updateDeps (line 248) | func updateDeps() error {
function gitCoMaster (line 302) | func gitCoMaster() error {
function gitPom (line 306) | func gitPom() error {
function gitCoRel (line 310) | func gitCoRel(v semver.Version) error {
function gitCommit (line 314) | func gitCommit(v semver.Version) error {
function writeChangelog (line 328) | func writeChangelog(prev, next semver.Version) error {
function updateCompletion (line 374) | func updateCompletion() error {
function updateManpage (line 381) | func updateManpage() error {
function writeVersion (line 388) | func writeVersion(v semver.Version) error {
type tplPayload (line 392) | type tplPayload struct
function writeVersionGo (line 399) | func writeVersionGo(v semver.Version) error {
function isGitClean (line 423) | func isGitClean() bool {
function versionFile (line 427) | func versionFile() (semver.Version, error) {
function gitCommitHash (line 436) | func gitCommitHash() (string, error) {
function gitVersion (line 445) | func gitVersion() (semver.Version, error) {
function changelogEntries (line 472) | func changelogEntries(since semver.Version) ([]string, error) {
function usage (line 554) | func usage() {
FILE: helpers/release/main_test.go
function TestGetVersions (line 16) | func TestGetVersions(t *testing.T) {
function TestWriteVersion (line 40) | func TestWriteVersion(t *testing.T) {
function TestWriteVersionGo (line 57) | func TestWriteVersionGo(t *testing.T) {
FILE: internal/action/action.go
type Action (line 22) | type Action struct
method String (line 63) | func (s *Action) String() string {
function New (line 31) | func New(cfg *config.Config, sv semver.Version) (*Action, error) {
function newAction (line 35) | func newAction(cfg *config.Config, sv semver.Version, remind bool) (*Act...
FILE: internal/action/action_test.go
function newMock (line 22) | func newMock(ctx context.Context, path string) (*Action, error) {
function TestAction (line 49) | func TestAction(t *testing.T) {
function TestNew (line 71) | func TestNew(t *testing.T) {
FILE: internal/action/aliases.go
method AliasesPrint (line 13) | func (s *Action) AliasesPrint(c *cli.Context) error {
FILE: internal/action/aliases_test.go
function TestAliases (line 15) | func TestAliases(t *testing.T) {
FILE: internal/action/audit.go
method Audit (line 20) | func (s *Action) Audit(c *cli.Context) error {
function saveReport (line 96) | func saveReport(ctx context.Context, f func(io.Writer) error, path, suff...
function writeReport (line 119) | func writeReport(f func(io.Writer) error, path string) (string, error) {
function openReport (line 133) | func openReport(path string) (*os.File, error) {
FILE: internal/action/audit_test.go
function TestAudit (line 17) | func TestAudit(t *testing.T) {
FILE: internal/action/binary.go
method Cat (line 30) | func (s *Action) Cat(c *cli.Context) error {
function secFromBytes (line 78) | func secFromBytes(dst, src string, in []byte) (gopass.Secret, error) {
method BinaryCopy (line 119) | func (s *Action) BinaryCopy(c *cli.Context) error {
method BinaryMove (line 135) | func (s *Action) BinaryMove(c *cli.Context) error {
function isFilePath (line 149) | func isFilePath(s string) bool {
method isInStore (line 160) | func (s *Action) isInStore(fn string) bool {
method binaryCopy (line 187) | func (s *Action) binaryCopy(ctx context.Context, c *cli.Context, from, t...
method binaryCopyFromFileToStore (line 227) | func (s *Action) binaryCopyFromFileToStore(ctx context.Context, from, to...
method binaryCopyFromStoreToFile (line 263) | func (s *Action) binaryCopyFromStoreToFile(ctx context.Context, from, to...
method binaryValidate (line 292) | func (s *Action) binaryValidate(ctx context.Context, buf []byte, name st...
function isBase64Encoded (line 317) | func isBase64Encoded(sec gopass.Secret) bool {
method binaryGet (line 331) | func (s *Action) binaryGet(ctx context.Context, name string) ([]byte, er...
method Sum (line 361) | func (s *Action) Sum(c *cli.Context) error {
FILE: internal/action/binary_test.go
function TestBinary (line 19) | func TestBinary(t *testing.T) {
function TestBinaryCat (line 43) | func TestBinaryCat(t *testing.T) {
function TestBinaryCatSizes (line 100) | func TestBinaryCatSizes(t *testing.T) {
function TestBinaryCopy (line 152) | func TestBinaryCopy(t *testing.T) {
function TestBinarySum (line 214) | func TestBinarySum(t *testing.T) {
function TestBinaryGet (line 245) | func TestBinaryGet(t *testing.T) {
function writeBinfile (line 265) | func writeBinfile(t *testing.T, fn string, size int) {
FILE: internal/action/clihelper.go
type argList (line 9) | type argList
method Get (line 11) | func (a argList) Get(n int) string {
function parseArgs (line 19) | func parseArgs(c *cli.Context) (argList, map[string]string) {
FILE: internal/action/clihelper_test.go
function TestParseArgs (line 12) | func TestParseArgs(t *testing.T) {
FILE: internal/action/clone.go
method Clone (line 28) | func (s *Action) Clone(c *cli.Context) error {
function storageBackendOrDefault (line 108) | func storageBackendOrDefault(ctx context.Context, repo string) backend.S...
method clone (line 127) | func (s *Action) clone(ctx context.Context, repo, mount, path string) er...
method cloneCheckDecryptionKeys (line 186) | func (s *Action) cloneCheckDecryptionKeys(ctx context.Context, mount str...
method cloneAddMount (line 243) | func (s *Action) cloneAddMount(ctx context.Context, mount, path string) ...
method cloneGetGitConfig (line 265) | func (s *Action) cloneGetGitConfig(ctx context.Context, name string) (st...
FILE: internal/action/clone_test.go
function aGitRepo (line 24) | func aGitRepo(ctx context.Context, t *testing.T, u *gptest.Unit, name st...
function TestClone (line 43) | func TestClone(t *testing.T) {
function TestCloneBackendIsStoredForMount (line 84) | func TestCloneBackendIsStoredForMount(t *testing.T) {
function TestCloneGetGitConfig (line 120) | func TestCloneGetGitConfig(t *testing.T) {
function TestCloneCheckDecryptionKeys (line 143) | func TestCloneCheckDecryptionKeys(t *testing.T) {
FILE: internal/action/commands.go
function ShowFlags (line 14) | func ShowFlags() []cli.Flag {
method GetCommands (line 77) | func (s *Action) GetCommands() []*cli.Command {
type commander (line 1165) | type commander interface
type storeCommander (line 1169) | type storeCommander interface
FILE: internal/action/commands_test.go
function testCommand (line 14) | func testCommand(t *testing.T, cmd *cli.Command) {
function TestCommands (line 40) | func TestCommands(t *testing.T) {
FILE: internal/action/completion.go
function bashEscape (line 20) | func bashEscape(s string) string {
method Complete (line 39) | func (s *Action) Complete(c *cli.Context) {
method CompletionOpenBSDKsh (line 58) | func (s *Action) CompletionOpenBSDKsh(a *cli.App) error {
method CompletionBash (line 82) | func (s *Action) CompletionBash(c *cli.Context) error {
method CompletionFish (line 105) | func (s *Action) CompletionFish(a *cli.App) error {
method CompletionZSH (line 120) | func (s *Action) CompletionZSH(a *cli.App) error {
FILE: internal/action/completion_test.go
function TestBashEscape (line 17) | func TestBashEscape(t *testing.T) {
function TestComplete (line 40) | func TestComplete(t *testing.T) {
FILE: internal/action/config.go
method Config (line 20) | func (s *Action) Config(c *cli.Context) error {
method printConfigValues (line 52) | func (s *Action) printConfigValues(ctx context.Context, store string, ne...
function contains (line 68) | func contains(haystack []string, needle string) bool {
method setConfigValue (line 76) | func (s *Action) setConfigValue(ctx context.Context, store, key, value s...
method configKeys (line 122) | func (s *Action) configKeys() []string {
method ConfigComplete (line 127) | func (s *Action) ConfigComplete(c *cli.Context) {
FILE: internal/action/config_test.go
function TestConfig (line 17) | func TestConfig(t *testing.T) {
FILE: internal/action/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyClip (line 8) | ctxKeyClip contextKey = iota
constant ctxKeyPasswordOnly (line 9) | ctxKeyPasswordOnly
constant ctxKeyPrintQR (line 10) | ctxKeyPrintQR
constant ctxKeyRevision (line 11) | ctxKeyRevision
constant ctxKeyKey (line 12) | ctxKeyKey
constant ctxKeyOnlyClip (line 13) | ctxKeyOnlyClip
constant ctxKeyAlsoClip (line 14) | ctxKeyAlsoClip
constant ctxKeyPrintChars (line 15) | ctxKeyPrintChars
constant ctxKeyWithQRBody (line 16) | ctxKeyWithQRBody
function WithClip (line 21) | func WithClip(ctx context.Context, clip bool) context.Context {
function IsClip (line 26) | func IsClip(ctx context.Context) bool {
function WithAlsoClip (line 37) | func WithAlsoClip(ctx context.Context, clip bool) context.Context {
function IsAlsoClip (line 42) | func IsAlsoClip(ctx context.Context) bool {
function WithOnlyClip (line 53) | func WithOnlyClip(ctx context.Context, clip bool) context.Context {
function IsOnlyClip (line 58) | func IsOnlyClip(ctx context.Context) bool {
function WithPasswordOnly (line 68) | func WithPasswordOnly(ctx context.Context, pw bool) context.Context {
function IsPasswordOnly (line 73) | func IsPasswordOnly(ctx context.Context) bool {
function WithPrintQR (line 83) | func WithPrintQR(ctx context.Context, qr bool) context.Context {
function IsPrintQR (line 88) | func IsPrintQR(ctx context.Context) bool {
function WithRevision (line 98) | func WithRevision(ctx context.Context, rev string) context.Context {
function HasRevision (line 103) | func HasRevision(ctx context.Context) bool {
function GetRevision (line 110) | func GetRevision(ctx context.Context) string {
function WithKey (line 120) | func WithKey(ctx context.Context, sv string) context.Context {
function HasKey (line 125) | func HasKey(ctx context.Context) bool {
function GetKey (line 132) | func GetKey(ctx context.Context) string {
function WithPrintChars (line 142) | func WithPrintChars(ctx context.Context, c []int) context.Context {
function GetPrintChars (line 147) | func GetPrintChars(ctx context.Context) []int {
function WithQRBody (line 157) | func WithQRBody(ctx context.Context, qr bool) context.Context {
function IsQRBody (line 162) | func IsQRBody(ctx context.Context) bool {
FILE: internal/action/context_test.go
function TestWithClip (line 10) | func TestWithClip(t *testing.T) {
function TestWithPasswordOnly (line 22) | func TestWithPasswordOnly(t *testing.T) {
function TestWithPrintQR (line 34) | func TestWithPrintQR(t *testing.T) {
function TestWithRevision (line 41) | func TestWithRevision(t *testing.T) {
function TestWithKey (line 50) | func TestWithKey(t *testing.T) {
function TestWithOnlyClip (line 57) | func TestWithOnlyClip(t *testing.T) {
function TestWithAlsoClip (line 64) | func TestWithAlsoClip(t *testing.T) {
FILE: internal/action/convert.go
method Convert (line 16) | func (s *Action) Convert(c *cli.Context) error {
FILE: internal/action/convert_test.go
function TestConvert (line 17) | func TestConvert(t *testing.T) {
FILE: internal/action/copy.go
method Copy (line 17) | func (s *Action) Copy(c *cli.Context) error {
method copy (line 41) | func (s *Action) copy(ctx context.Context, from, to string, force bool) ...
method copyFlattenDir (line 56) | func (s *Action) copyFlattenDir(ctx context.Context, from, to string, fo...
method copyRegular (line 80) | func (s *Action) copyRegular(ctx context.Context, from, to string, force...
FILE: internal/action/copy_test.go
function TestCopy (line 18) | func TestCopy(t *testing.T) {
function TestCopyGpg (line 96) | func TestCopyGpg(t *testing.T) {
function TestCopyWithTrailingSlash (line 184) | func TestCopyWithTrailingSlash(t *testing.T) {
FILE: internal/action/create.go
method Create (line 19) | func (s *Action) Create(c *cli.Context) error {
method createPrintOrCopy (line 53) | func (s *Action) createPrintOrCopy(ctx context.Context, c *cli.Context, ...
FILE: internal/action/create_test.go
function TestCreate (line 16) | func TestCreate(t *testing.T) {
FILE: internal/action/delete.go
method Delete (line 19) | func (s *Action) Delete(c *cli.Context) error {
method deleteRecursive (line 102) | func (s *Action) deleteRecursive(ctx context.Context, name string, force...
method deleteKeyFromYAML (line 119) | func (s *Action) deleteKeyFromYAML(ctx context.Context, name, key string...
FILE: internal/action/delete_test.go
function TestDelete (line 16) | func TestDelete(t *testing.T) {
FILE: internal/action/edit.go
method Edit (line 25) | func (s *Action) Edit(c *cli.Context) error {
method edit (line 45) | func (s *Action) edit(ctx context.Context, c *cli.Context, name string) ...
method editUpdate (line 73) | func (s *Action) editUpdate(ctx context.Context, name string, content, n...
method editGetContent (line 97) | func (s *Action) editGetContent(ctx context.Context, name string, create...
method editFindName (line 135) | func (s *Action) editFindName(ctx context.Context, name string) (string,...
FILE: internal/action/edit_test.go
function TestEdit (line 15) | func TestEdit(t *testing.T) {
function TestEditUpdate (line 45) | func TestEditUpdate(t *testing.T) {
FILE: internal/action/env.go
method Env (line 20) | func (s *Action) Env(c *cli.Context) error {
FILE: internal/action/env_test.go
function TestEnvLeafHappyPath (line 19) | func TestEnvLeafHappyPath(t *testing.T) {
function TestEnvLeafHappyPathKeepCase (line 51) | func TestEnvLeafHappyPathKeepCase(t *testing.T) {
function TestEnvSecretNotFound (line 86) | func TestEnvSecretNotFound(t *testing.T) {
function TestEnvProgramNotFound (line 102) | func TestEnvProgramNotFound(t *testing.T) {
function TestEnvProgramNotSpecified (line 126) | func TestEnvProgramNotSpecified(t *testing.T) {
FILE: internal/action/exit/errors.go
constant OK (line 12) | OK = iota
constant Unknown (line 14) | Unknown
constant Usage (line 16) | Usage
constant Aborted (line 18) | Aborted
constant Unsupported (line 20) | Unsupported
constant AlreadyInitialized (line 23) | AlreadyInitialized
constant NotInitialized (line 26) | NotInitialized
constant Git (line 28) | Git
constant Mount (line 30) | Mount
constant NoName (line 32) | NoName
constant NotFound (line 34) | NotFound
constant Decrypt (line 36) | Decrypt
constant Encrypt (line 38) | Encrypt
constant List (line 40) | List
constant Audit (line 42) | Audit
constant Fsck (line 44) | Fsck
constant Config (line 46) | Config
constant Recipients (line 48) | Recipients
constant IO (line 50) | IO
constant GPG (line 52) | GPG
constant Hook (line 54) | Hook
function Error (line 58) | func Error(exitCode int, err error, format string, args ...any) error {
FILE: internal/action/exit/errors_test.go
function TestError (line 14) | func TestError(t *testing.T) {
FILE: internal/action/find.go
method Find (line 21) | func (s *Action) Find(c *cli.Context) error {
method FindFuzzy (line 26) | func (s *Action) FindFuzzy(c *cli.Context) error {
method findCmd (line 30) | func (s *Action) findCmd(c *cli.Context, cb showFunc, fuzzy bool) error {
type showFunc (line 49) | type showFunc
method find (line 51) | func (s *Action) find(ctx context.Context, c *cli.Context, needle string...
method findSelection (line 102) | func (s *Action) findSelection(ctx context.Context, c *cli.Context, choi...
function filter (line 147) | func filter(l []string, needle string, reMatch bool) ([]string, error) {
FILE: internal/action/find_test.go
function TestFind (line 23) | func TestFind(t *testing.T) {
FILE: internal/action/fsck.go
method Fsck (line 21) | func (s *Action) Fsck(c *cli.Context) error {
method fsckEntries (line 64) | func (s *Action) fsckEntries(ctx context.Context, filter string) ([]stri...
FILE: internal/action/fsck_test.go
function TestFsck (line 20) | func TestFsck(t *testing.T) {
function TestFsckGpg (line 75) | func TestFsckGpg(t *testing.T) {
FILE: internal/action/generate.go
method Generate (line 33) | func (s *Action) Generate(c *cli.Context) error {
function keyAndLength (line 102) | func keyAndLength(args argList) (string, string) {
method generateCopyOrPrint (line 120) | func (s *Action) generateCopyOrPrint(ctx context.Context, c *cli.Context...
function hasPwRuleForSecret (line 168) | func hasPwRuleForSecret(ctx context.Context, name string) (string, pwrul...
method generatePassword (line 182) | func (s *Action) generatePassword(ctx context.Context, c *cli.Context, l...
function getPwLengthFromEnvOrAskUser (line 249) | func getPwLengthFromEnvOrAskUser(ctx context.Context) (int, error) {
method generatePasswordForRule (line 269) | func (s *Action) generatePasswordForRule(ctx context.Context, length, do...
method generatePasswordXKCD (line 310) | func (s *Action) generatePasswordXKCD(ctx context.Context, c *cli.Contex...
method generateSetPassword (line 357) | func (s *Action) generateSetPassword(ctx context.Context, name, key, pas...
function hasChangeURL (line 415) | func hasChangeURL(ctx context.Context, name string) string {
method generateReplaceExisting (line 426) | func (s *Action) generateReplaceExisting(ctx context.Context, name, key,...
function setMetadata (line 444) | func setMetadata(sec gopass.Secret, kvps map[string]string) {
method CompleteGenerate (line 452) | func (s *Action) CompleteGenerate(c *cli.Context) {
function extractEmails (line 482) | func extractEmails(list []string) []string {
function extractDomains (line 496) | func extractDomains(list []string) []string {
function uniq (line 508) | func uniq(in []string) []string {
function filterPrefix (line 524) | func filterPrefix(in []string, prefix string) []string {
function isStrict (line 535) | func isStrict(ctx context.Context, c *cli.Context) bool {
FILE: internal/action/generate_test.go
function TestRuleLookup (line 24) | func TestRuleLookup(t *testing.T) {
function TestGenerate (line 29) | func TestGenerate(t *testing.T) {
function passIsAlphaNum (line 206) | func passIsAlphaNum(t *testing.T, buf string, want bool) {
function TestKeyAndLength (line 220) | func TestKeyAndLength(t *testing.T) {
function TestExtractEmails (line 260) | func TestExtractEmails(t *testing.T) {
function TestExtractDomains (line 279) | func TestExtractDomains(t *testing.T) {
function TestUniq (line 298) | func TestUniq(t *testing.T) {
function TestFilterPrefix (line 317) | func TestFilterPrefix(t *testing.T) {
function TestDefaultLengthFromEnv (line 345) | func TestDefaultLengthFromEnv(t *testing.T) {
function TestHasPwRuleForSecret (line 377) | func TestHasPwRuleForSecret(t *testing.T) {
FILE: internal/action/git.go
method Git (line 15) | func (s *Action) Git(c *cli.Context) error {
FILE: internal/action/grep.go
method Grep (line 16) | func (s *Action) Grep(c *cli.Context) error {
FILE: internal/action/grep_test.go
function TestGrep (line 16) | func TestGrep(t *testing.T) {
FILE: internal/action/history.go
method History (line 14) | func (s *Action) History(c *cli.Context) error {
FILE: internal/action/history_test.go
function TestHistory (line 18) | func TestHistory(t *testing.T) {
FILE: internal/action/init.go
constant logo (line 19) | logo = `
method IsInitialized (line 30) | func (s *Action) IsInitialized(c *cli.Context) error {
method Init (line 73) | func (s *Action) Init(c *cli.Context) error {
function initParseContext (line 108) | func initParseContext(ctx context.Context, c *cli.Context) (context.Cont...
method init (line 146) | func (s *Action) init(ctx context.Context, alias, path string, keys ...s...
method printRecipients (line 211) | func (s *Action) printRecipients(ctx context.Context, alias string) {
method getCryptoFor (line 221) | func (s *Action) getCryptoFor(ctx context.Context, name string) backend....
FILE: internal/action/init_test.go
function TestInit (line 21) | func TestInit(t *testing.T) {
function TestInitParseContext (line 65) | func TestInitParseContext(t *testing.T) {
FILE: internal/action/insert.go
method Insert (line 24) | func (s *Action) Insert(c *cli.Context) error {
method insert (line 42) | func (s *Action) insert(ctx context.Context, c *cli.Context, name, key s...
method insertStdin (line 104) | func (s *Action) insertStdin(ctx context.Context, name string, content [...
method insertStdinAppend (line 125) | func (s *Action) insertStdinAppend(ctx context.Context, name string, con...
method insertSingle (line 145) | func (s *Action) insertSingle(ctx context.Context, name, pw string, kvps...
method insertGetSecret (line 169) | func (s *Action) insertGetSecret(ctx context.Context, name, pw string) (...
method insertYAML (line 197) | func (s *Action) insertYAML(ctx context.Context, name, key string, conte...
method insertMultiline (line 237) | func (s *Action) insertMultiline(ctx context.Context, c *cli.Context, na...
FILE: internal/action/insert_test.go
function TestInsert (line 17) | func TestInsert(t *testing.T) {
function TestInsertStdin (line 126) | func TestInsertStdin(t *testing.T) {
FILE: internal/action/link.go
method Link (line 10) | func (s *Action) Link(c *cli.Context) error {
FILE: internal/action/link_test.go
function TestLink (line 18) | func TestLink(t *testing.T) {
FILE: internal/action/list.go
method List (line 26) | func (s *Action) List(c *cli.Context) error {
method listFiltered (line 59) | func (s *Action) listFiltered(ctx context.Context, l *tree.Root, limit i...
function redirectPager (line 110) | func redirectPager(ctx context.Context, subtree *tree.Root) (io.Writer, ...
method pager (line 131) | func (s *Action) pager(ctx context.Context, buf io.Reader) error {
FILE: internal/action/list_test.go
function TestList (line 19) | func TestList(t *testing.T) {
function TestListLimit (line 118) | func TestListLimit(t *testing.T) {
function TestRedirectPager (line 215) | func TestRedirectPager(t *testing.T) {
FILE: internal/action/merge.go
method Merge (line 22) | func (s *Action) Merge(c *cli.Context) error {
FILE: internal/action/merge_test.go
function TestMerge (line 19) | func TestMerge(t *testing.T) {
FILE: internal/action/mount.go
method MountRemove (line 26) | func (s *Action) MountRemove(c *cli.Context) error {
method MountsPrint (line 42) | func (s *Action) MountsPrint(c *cli.Context) error {
method MountsComplete (line 69) | func (s *Action) MountsComplete(*cli.Context) {
method MountAdd (line 76) | func (s *Action) MountAdd(c *cli.Context) error {
method MountsVersions (line 124) | func (s *Action) MountsVersions(c *cli.Context) error {
type versioner (line 148) | type versioner interface
function versionInfo (line 153) | func versionInfo(ctx context.Context, v versioner) string {
FILE: internal/action/mount_test.go
function TestMounts (line 17) | func TestMounts(t *testing.T) {
FILE: internal/action/move.go
method Move (line 13) | func (s *Action) Move(c *cli.Context) error {
FILE: internal/action/move_test.go
function TestMove (line 15) | func TestMove(t *testing.T) {
FILE: internal/action/otp.go
method OTP (line 26) | func (s *Action) OTP(c *cli.Context) error {
function tickingBar (line 67) | func tickingBar(ctx context.Context, expiresAt time.Time, bar *termio.Pr...
function waitForKeyPress (line 84) | func waitForKeyPress(ctx context.Context, cancel context.CancelFunc) (fu...
method otp (line 116) | func (s *Action) otp(ctx context.Context, name, qrf string, clip, pw, re...
method otpHandleError (line 248) | func (s *Action) otpHandleError(ctx context.Context, name, qrf string, c...
FILE: internal/action/otp_test.go
function TestOTP (line 19) | func TestOTP(t *testing.T) {
FILE: internal/action/process.go
method Process (line 14) | func (s *Action) Process(c *cli.Context) error {
FILE: internal/action/process_test.go
function TestProcess (line 18) | func TestProcess(t *testing.T) {
FILE: internal/action/pwgen/commands.go
function GetCommands (line 8) | func GetCommands() []*cli.Command {
FILE: internal/action/pwgen/commands_test.go
function testCommand (line 11) | func testCommand(t *testing.T, cmd *cli.Command) {
function TestCommands (line 37) | func TestCommands(t *testing.T) {
FILE: internal/action/pwgen/pwgen.go
function Pwgen (line 20) | func Pwgen(c *cli.Context) error {
function xkcdGen (line 50) | func xkcdGen(c *cli.Context, length, num int) error {
function pwGen (line 85) | func pwGen(c *cli.Context, pwLen, pwNum int) error {
function numPerLine (line 124) | func numPerLine(pwLen int) int {
FILE: internal/action/pwgen/pwgen_test.go
function TestPwgen (line 16) | func TestPwgen(t *testing.T) {
FILE: internal/action/rcs.go
method RCSInit (line 22) | func (s *Action) RCSInit(c *cli.Context) error {
method rcsInit (line 48) | func (s *Action) rcsInit(ctx context.Context, store, un, ue string) error {
method getUserData (line 80) | func (s *Action) getUserData(ctx context.Context, store, name, email str...
method RCSAddRemote (line 121) | func (s *Action) RCSAddRemote(c *cli.Context) error {
method RCSRemoveRemote (line 135) | func (s *Action) RCSRemoveRemote(c *cli.Context) error {
method RCSPull (line 148) | func (s *Action) RCSPull(c *cli.Context) error {
method RCSPush (line 158) | func (s *Action) RCSPush(c *cli.Context) error {
method RCSStatus (line 179) | func (s *Action) RCSStatus(c *cli.Context) error {
FILE: internal/action/rcs_test.go
function TestGit (line 16) | func TestGit(t *testing.T) {
FILE: internal/action/recipients.go
method RecipientsPrint (line 37) | func (s *Action) RecipientsPrint(c *cli.Context) error {
method recipientsList (line 51) | func (s *Action) recipientsList(ctx context.Context) []string {
method RecipientsComplete (line 64) | func (s *Action) RecipientsComplete(c *cli.Context) {
method RecipientsAck (line 78) | func (s *Action) RecipientsAck(c *cli.Context) error {
method RecipientsAdd (line 85) | func (s *Action) RecipientsAdd(c *cli.Context) error {
method RecipientsRemove (line 166) | func (s *Action) RecipientsRemove(c *cli.Context) error {
method recipientsSelectForRemoval (line 264) | func (s *Action) recipientsSelectForRemoval(ctx context.Context, store s...
method recipientsSelectForAdd (line 288) | func (s *Action) recipientsSelectForAdd(ctx context.Context, store strin...
FILE: internal/action/recipients_test.go
function TestRecipients (line 18) | func TestRecipients(t *testing.T) {
function TestRecipientsGpg (line 86) | func TestRecipientsGpg(t *testing.T) {
FILE: internal/action/reminder.go
method printReminder (line 13) | func (s *Action) printReminder(ctx context.Context) {
FILE: internal/action/reorg.go
method Reorg (line 20) | func (s *Action) Reorg(c *cli.Context) error {
method ReorgAfterEdit (line 76) | func (s *Action) ReorgAfterEdit(ctx context.Context, initialSecrets, mod...
method validateMoves (line 143) | func (s *Action) validateMoves(ctx context.Context, moves map[string]str...
FILE: internal/action/reorg_test.go
function TestReorg (line 15) | func TestReorg(t *testing.T) {
FILE: internal/action/repl.go
type mindFlagsCompleter (line 16) | type mindFlagsCompleter struct
method Do (line 20) | func (f *mindFlagsCompleter) Do(line []rune, pos int) ([][]rune, int) {
method entriesForCompleter (line 41) | func (s *Action) entriesForCompleter(ctx context.Context) ([]*readline.P...
method replCompleteRecipients (line 54) | func (s *Action) replCompleteRecipients(ctx context.Context, cmd *cli.Co...
method replCompleteTemplates (line 70) | func (s *Action) replCompleteTemplates(ctx context.Context, cmd *cli.Com...
method prefixCompleter (line 84) | func (s *Action) prefixCompleter(c *cli.Context) *readline.PrefixComplet...
method REPL (line 138) | func (s *Action) REPL(c *cli.Context) error {
method replLock (line 216) | func (s *Action) replLock(ctx context.Context) {
FILE: internal/action/repl_test.go
function TestREPL (line 19) | func TestREPL(t *testing.T) {
function TestEntriesForCompleter (line 57) | func TestEntriesForCompleter(t *testing.T) {
function TestReplCompleteRecipients (line 85) | func TestReplCompleteRecipients(t *testing.T) {
function TestReplCompleteTemplates (line 116) | func TestReplCompleteTemplates(t *testing.T) {
FILE: internal/action/setup.go
method Setup (line 27) | func (s *Action) Setup(c *cli.Context) error {
method initCheckPrivateKeys (line 127) | func (s *Action) initCheckPrivateKeys(ctx context.Context, crypto backen...
method initGenerateIdentity (line 146) | func (s *Action) initGenerateIdentity(ctx context.Context, crypto backen...
type keyExporter (line 243) | type keyExporter interface
method initExportPublicKey (line 247) | func (s *Action) initExportPublicKey(ctx context.Context, crypto backend...
method initHasUseablePrivateKeys (line 280) | func (s *Action) initHasUseablePrivateKeys(ctx context.Context, crypto b...
method initSetupGitRemote (line 292) | func (s *Action) initSetupGitRemote(ctx context.Context, team, remote st...
method initLocal (line 317) | func (s *Action) initLocal(ctx context.Context, remote string) error {
method initDetectPassage (line 349) | func (s *Action) initDetectPassage(ctx context.Context) error {
method initCreateTeam (line 369) | func (s *Action) initCreateTeam(ctx context.Context, team, remote string...
method initJoinTeam (line 401) | func (s *Action) initJoinTeam(ctx context.Context, team, remote string) ...
FILE: internal/action/setup_test.go
function TestSetupAgeGitFS (line 19) | func TestSetupAgeGitFS(t *testing.T) {
function TestSetupPlainFS (line 65) | func TestSetupPlainFS(t *testing.T) {
FILE: internal/action/show.go
function showParseArgs (line 27) | func showParseArgs(c *cli.Context) context.Context {
method Show (line 88) | func (s *Action) Show(c *cli.Context) error {
method show (line 106) | func (s *Action) show(ctx context.Context, c *cli.Context, name string, ...
method showHandleRevision (line 135) | func (s *Action) showHandleRevision(ctx context.Context, c *cli.Context,...
method parseRevision (line 149) | func (s *Action) parseRevision(ctx context.Context, name, revision strin...
method showHandleOutputChars (line 179) | func (s *Action) showHandleOutputChars(ctx context.Context, pw string, c...
method showHandleOutput (line 193) | func (s *Action) showHandleOutput(ctx context.Context, name string, sec ...
method showGetContent (line 254) | func (s *Action) showGetContent(ctx context.Context, sec gopass.Secret) ...
function showSafeContent (line 300) | func showSafeContent(sec gopass.Secret) string {
function isUnsafeKey (line 334) | func isUnsafeKey(key string, sec gopass.Secret) bool {
function randAsterisk (line 358) | func randAsterisk() string {
method hasAliasDomain (line 369) | func (s *Action) hasAliasDomain(ctx context.Context, name string) string {
method showHandleError (line 387) | func (s *Action) showHandleError(ctx context.Context, c *cli.Context, na...
method showPrintQR (line 417) | func (s *Action) showPrintQR(name, pw string) error {
FILE: internal/action/show_test.go
function TestShowMulti (line 20) | func TestShowMulti(t *testing.T) {
function TestShowAutoClip (line 225) | func TestShowAutoClip(t *testing.T) {
function TestShowHandleRevision (line 373) | func TestShowHandleRevision(t *testing.T) {
function TestShowHandleError (line 402) | func TestShowHandleError(t *testing.T) {
function TestShowPrintQR (line 428) | func TestShowPrintQR(t *testing.T) {
function TestShowHasAliasDomain (line 454) | func TestShowHasAliasDomain(t *testing.T) {
FILE: internal/action/sync.go
function init (line 31) | func init() {
method Sync (line 48) | func (s *Action) Sync(c *cli.Context) error {
method autoSync (line 52) | func (s *Action) autoSync(ctx context.Context) error {
method sync (line 99) | func (s *Action) sync(ctx context.Context, store string, isAutosync bool...
method syncMount (line 170) | func (s *Action) syncMount(ctx context.Context, mp string, isAutosync bo...
function syncImportKeys (line 248) | func syncImportKeys(ctx context.Context, sub *leaf.Store, name string) e...
function syncExportKeys (line 259) | func syncExportKeys(ctx context.Context, sub *leaf.Store, name string) e...
function syncPrintDiff (line 282) | func syncPrintDiff(ctxno context.Context, l, r []string) {
FILE: internal/action/sync_test.go
function TestSync (line 15) | func TestSync(t *testing.T) {
FILE: internal/action/templates.go
constant templateExample (line 20) | templateExample = `{{ .Content }}
method TemplatesPrint (line 42) | func (s *Action) TemplatesPrint(c *cli.Context) error {
method TemplatePrint (line 54) | func (s *Action) TemplatePrint(c *cli.Context) error {
method TemplateEdit (line 70) | func (s *Action) TemplateEdit(c *cli.Context) error {
method TemplateRemove (line 100) | func (s *Action) TemplateRemove(c *cli.Context) error {
method templatesList (line 114) | func (s *Action) templatesList(ctx context.Context) []string {
method TemplatesComplete (line 126) | func (s *Action) TemplatesComplete(c *cli.Context) {
method renderTemplate (line 134) | func (s *Action) renderTemplate(ctx context.Context, name string, conten...
FILE: internal/action/templates_test.go
function TestTemplates (line 19) | func TestTemplates(t *testing.T) {
FILE: internal/action/unclip.go
method Unclip (line 15) | func (s *Action) Unclip(c *cli.Context) error {
FILE: internal/action/unclip_test.go
function TestUnclip (line 16) | func TestUnclip(t *testing.T) {
FILE: internal/action/update.go
method Update (line 12) | func (s *Action) Update(c *cli.Context) error {
FILE: internal/action/update_test.go
constant testUpdateJSON (line 24) | testUpdateJSON = `{
function TestUpdate (line 50) | func TestUpdate(t *testing.T) {
FILE: internal/action/version.go
method Version (line 22) | func (s *Action) Version(c *cli.Context) error {
method checkVersion (line 43) | func (s *Action) checkVersion(ctx context.Context, u chan string) {
FILE: internal/action/version_test.go
function TestVersion (line 18) | func TestVersion(t *testing.T) {
FILE: internal/audit/audit.go
type secretGetter (line 29) | type secretGetter interface
type validator (line 35) | type validator struct
type Auditor (line 44) | type Auditor struct
method Batch (line 107) | func (a *Auditor) Batch(ctx context.Context, secrets []string) (*Repor...
method audit (line 159) | func (a *Auditor) audit(ctx context.Context, secrets <-chan string, do...
method auditSecret (line 174) | func (a *Auditor) auditSecret(ctx context.Context, secret string) {
method checkHIBP (line 224) | func (a *Auditor) checkHIBP(ctx context.Context) error {
function New (line 51) | func New(ctx context.Context, s secretGetter) *Auditor {
FILE: internal/audit/audit_test.go
type mockSecretGetter (line 15) | type mockSecretGetter struct
method Get (line 17) | func (m *mockSecretGetter) Get(ctx context.Context, name string) (gopa...
method ListRevisions (line 24) | func (m *mockSecretGetter) ListRevisions(ctx context.Context, name str...
method Concurrency (line 30) | func (m *mockSecretGetter) Concurrency() int {
function TestNewAuditor (line 34) | func TestNewAuditor(t *testing.T) {
function TestBatch (line 45) | func TestBatch(t *testing.T) {
function TestAuditSecret (line 58) | func TestAuditSecret(t *testing.T) {
function TestCheckHIBP (line 69) | func TestCheckHIBP(t *testing.T) {
FILE: internal/audit/excludes.go
type res (line 10) | type res
method Matches (line 12) | func (r res) Matches(s string) bool {
function FilterExcludes (line 25) | func FilterExcludes(excludes string, in []string) []string {
FILE: internal/audit/excludes_test.go
function TestFilterExcludes (line 7) | func TestFilterExcludes(t *testing.T) {
FILE: internal/audit/output.go
method PrintResults (line 20) | func (r *Report) PrintResults(ctx context.Context) error {
method PrintSummary (line 65) | func (r *Report) PrintSummary(ctx context.Context) error {
method RenderCSV (line 93) | func (r *Report) RenderCSV(w io.Writer) error {
method RenderHTML (line 130) | func (r *Report) RenderHTML(w io.Writer) error {
function getHTMLPayload (line 153) | func getHTMLPayload(r *Report) *htmlPayload {
type htmlPayload (line 195) | type htmlPayload struct
FILE: internal/audit/output_test.go
function TestHTML (line 13) | func TestHTML(t *testing.T) {
FILE: internal/audit/report.go
type Finding (line 13) | type Finding struct
type SecretReport (line 18) | type SecretReport struct
method HasFindings (line 25) | func (s *SecretReport) HasFindings() bool {
method HumanizeAge (line 35) | func (s *SecretReport) HumanizeAge() string {
type Report (line 52) | type Report struct
type ReportBuilder (line 63) | type ReportBuilder struct
method AddPassword (line 82) | func (r *ReportBuilder) AddPassword(name, pw string) {
method AddFinding (line 101) | func (r *ReportBuilder) AddFinding(secret, finding, message, severity ...
method SetAge (line 132) | func (r *ReportBuilder) SetAge(name string, age time.Duration) {
method Finalize (line 157) | func (r *ReportBuilder) Finalize() *Report {
function newReport (line 146) | func newReport() *ReportBuilder {
FILE: internal/audit/report_test.go
function TestFinalize (line 9) | func TestFinalize(t *testing.T) {
FILE: internal/audit/single.go
function Single (line 12) | func Single(ctx context.Context, password string) {
FILE: internal/backend/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyCryptoBackend (line 8) | ctxKeyCryptoBackend contextKey = iota
constant ctxKeyStorageBackend (line 9) | ctxKeyStorageBackend
function CryptoBackendName (line 13) | func CryptoBackendName(cb CryptoBackend) string {
function WithCryptoBackendString (line 22) | func WithCryptoBackendString(ctx context.Context, be string) (context.Co...
function WithCryptoBackend (line 32) | func WithCryptoBackend(ctx context.Context, be CryptoBackend) context.Co...
function HasCryptoBackend (line 37) | func HasCryptoBackend(ctx context.Context) bool {
function GetCryptoBackend (line 44) | func GetCryptoBackend(ctx context.Context) CryptoBackend {
function WithStorageBackendString (line 54) | func WithStorageBackendString(ctx context.Context, sb string) (context.C...
function WithStorageBackend (line 64) | func WithStorageBackend(ctx context.Context, sb StorageBackend) context....
function GetStorageBackend (line 69) | func GetStorageBackend(ctx context.Context) StorageBackend {
function HasStorageBackend (line 79) | func HasStorageBackend(ctx context.Context) bool {
function StorageBackendName (line 86) | func StorageBackendName(sb StorageBackend) string {
FILE: internal/backend/context_test.go
function TestCryptoBackend (line 11) | func TestCryptoBackend(t *testing.T) {
function TestStorageBackend (line 24) | func TestStorageBackend(t *testing.T) {
function TestComposite (line 38) | func TestComposite(t *testing.T) {
FILE: internal/backend/crypto.go
type CryptoBackend (line 12) | type CryptoBackend
method String (line 23) | func (c CryptoBackend) String() string {
constant Plain (line 16) | Plain CryptoBackend = iota
constant GPGCLI (line 18) | GPGCLI
constant Age (line 20) | Age
type Keyring (line 32) | type Keyring interface
type Crypto (line 48) | type Crypto interface
function NewCrypto (line 64) | func NewCrypto(ctx context.Context, id CryptoBackend) (Crypto, error) {
function DetectCrypto (line 73) | func DetectCrypto(ctx context.Context, storage Storage) (Crypto, error) {
FILE: internal/backend/crypto/age/age.go
constant Ext (line 23) | Ext = "age"
constant IDFile (line 25) | IDFile = ".age-recipients"
type githubSSHCacher (line 28) | type githubSSHCacher interface
type Age (line 34) | type Age struct
method tryStartAgent (line 68) | func (a *Age) tryStartAgent(ctx context.Context) {
method Initialized (line 127) | func (a *Age) Initialized(ctx context.Context) error {
method Name (line 136) | func (a *Age) Name() string {
method Version (line 141) | func (a *Age) Version(ctx context.Context) semver.Version {
method Ext (line 146) | func (a *Age) Ext() string {
method IDFile (line 151) | func (a *Age) IDFile() string {
method Concurrency (line 156) | func (a *Age) Concurrency() int {
method GetFingerprint (line 161) | func (a *Age) GetFingerprint(ctx context.Context, key []byte) (string,...
method Lock (line 166) | func (a *Age) Lock() {
method identitiesToString (line 170) | func (a *Age) identitiesToString(ids []age.Identity) (string, error) {
method String (line 180) | func (a *Age) String() string {
function New (line 43) | func New(ctx context.Context, sshKeyPath string) (*Age, error) {
FILE: internal/backend/crypto/age/age_test.go
function TestNew (line 11) | func TestNew(t *testing.T) {
function TestInitialized (line 18) | func TestInitialized(t *testing.T) {
function TestName (line 28) | func TestName(t *testing.T) {
function TestVersion (line 38) | func TestVersion(t *testing.T) {
function TestExt (line 49) | func TestExt(t *testing.T) {
function TestIDFile (line 59) | func TestIDFile(t *testing.T) {
function TestConcurrency (line 69) | func TestConcurrency(t *testing.T) {
FILE: internal/backend/crypto/age/agent/agent.go
constant socketName (line 27) | socketName = "gopass-age-agent.sock"
type Agent (line 31) | type Agent struct
method Run (line 59) | func (a *Agent) Run(ctx context.Context) error {
method Shutdown (line 100) | func (a *Agent) Shutdown(ctx context.Context) {
method handleConnection (line 111) | func (a *Agent) handleConnection(ctx context.Context, conn net.Conn) {
method setTimeout (line 222) | func (a *Agent) setTimeout(timeout time.Duration) {
method lock (line 237) | func (a *Agent) lock() {
method decrypt (line 249) | func (a *Agent) decrypt(ciphertext []byte) ([]byte, error) {
function New (line 43) | func New() (*Agent, error) {
FILE: internal/backend/crypto/age/agent/agent_test.go
function TestAgent (line 14) | func TestAgent(t *testing.T) {
function TestAgentAutoLock (line 61) | func TestAgentAutoLock(t *testing.T) {
FILE: internal/backend/crypto/age/agent/client.go
type Client (line 17) | type Client struct
method connect (line 28) | func (c *Client) connect() (net.Conn, error) {
method send (line 44) | func (c *Client) send(cmd string) (string, error) {
method Ping (line 71) | func (c *Client) Ping() error {
method Status (line 78) | func (c *Client) Status() (string, error) {
method SendIdentities (line 83) | func (c *Client) SendIdentities(ids string) error {
method Decrypt (line 90) | func (c *Client) Decrypt(ciphertext []byte) ([]byte, error) {
method Remove (line 100) | func (c *Client) Remove(key string) error {
method Lock (line 107) | func (c *Client) Lock() error {
method Unlock (line 114) | func (c *Client) Unlock() error {
method SetTimeout (line 121) | func (c *Client) SetTimeout(timeout int) error {
method Quit (line 128) | func (c *Client) Quit() error {
function NewClient (line 22) | func NewClient() *Client {
FILE: internal/backend/crypto/age/agent/client_unix.go
method checkSocketSecurity (line 11) | func (c *Client) checkSocketSecurity() error {
FILE: internal/backend/crypto/age/agent/client_windows.go
method checkSocketSecurity (line 5) | func (c *Client) checkSocketSecurity() error {
FILE: internal/backend/crypto/age/agent_starter_unix.go
function startAgent (line 12) | func startAgent(_ context.Context) error {
FILE: internal/backend/crypto/age/agent_starter_windows.go
function startAgent (line 11) | func startAgent(_ context.Context) error {
FILE: internal/backend/crypto/age/askpass.go
type cacher (line 17) | type cacher interface
type osKeyring (line 24) | type osKeyring struct
method Get (line 34) | func (o *osKeyring) Get(key string) (string, bool) {
method Set (line 46) | func (o *osKeyring) Set(name, value string) {
method Remove (line 53) | func (o *osKeyring) Remove(name string) {
method Purge (line 62) | func (o *osKeyring) Purge() {
function newOsKeyring (line 28) | func newOsKeyring() *osKeyring {
type askPass (line 75) | type askPass struct
method Ping (line 95) | func (a *askPass) Ping(_ context.Context) error {
method Passphrase (line 99) | func (a *askPass) Passphrase(key string, reason string, repeat bool) (...
method getPassphrase (line 118) | func (a *askPass) getPassphrase(reason string, repeat bool) (string, e...
method Remove (line 158) | func (a *askPass) Remove(key string) {
method Lock (line 162) | func (a *askPass) Lock() {
function newAskPass (line 80) | func newAskPass(ctx context.Context) *askPass {
FILE: internal/backend/crypto/age/commands.go
method Commands (line 19) | func (l loader) Commands() []*cli.Command {
method agent (line 324) | func (l loader) agent(c *cli.Context) error {
method lock (line 335) | func (l loader) lock(c *cli.Context) error {
FILE: internal/backend/crypto/age/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyOnlyNative (line 8) | ctxKeyOnlyNative contextKey = iota
function WithOnlyNative (line 12) | func WithOnlyNative(ctx context.Context, at bool) context.Context {
function IsOnlyNative (line 18) | func IsOnlyNative(ctx context.Context) bool {
FILE: internal/backend/crypto/age/context_test.go
function TestWithOnlyNative (line 7) | func TestWithOnlyNative(t *testing.T) {
function TestIsOnlyNative (line 26) | func TestIsOnlyNative(t *testing.T) {
FILE: internal/backend/crypto/age/decrypt.go
method Decrypt (line 20) | func (a *Age) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, e...
method decryptWithAgent (line 48) | func (a *Age) decryptWithAgent(ctx context.Context, ciphertext []byte) (...
method decrypt (line 89) | func (a *Age) decrypt(ciphertext []byte, ids ...age.Identity) ([]byte, e...
method decryptFile (line 108) | func (a *Age) decryptFile(ctx context.Context, filename string) ([]byte,...
method getAllIds (line 134) | func (a *Age) getAllIds(ctx context.Context) ([]age.Identity, error) {
FILE: internal/backend/crypto/age/encrypt.go
method Encrypt (line 16) | func (a *Age) Encrypt(ctx context.Context, plaintext []byte, recipients ...
function dedupe (line 36) | func dedupe(recp []age.Recipient) []age.Recipient {
method encrypt (line 77) | func (a *Age) encrypt(plaintext []byte, recp ...age.Recipient) ([]byte, ...
method encryptFile (line 95) | func (a *Age) encryptFile(ctx context.Context, filename string, plaintex...
FILE: internal/backend/crypto/age/encrypt_test.go
function TestDedupe (line 16) | func TestDedupe(t *testing.T) {
type Recipients (line 41) | type Recipients
method Len (line 43) | func (r Recipients) Len() int {
method Swap (line 47) | func (r Recipients) Swap(i, j int) {
method Less (line 51) | func (r Recipients) Less(i, j int) bool {
FILE: internal/backend/crypto/age/identities.go
type wrappedIdentity (line 33) | type wrappedIdentity struct
method Recipient (line 39) | func (w *wrappedIdentity) Recipient() age.Recipient { return w.rec }
method String (line 40) | func (w *wrappedIdentity) String() string { return w.encoding }
method SafeStr (line 44) | func (w *wrappedIdentity) SafeStr() string {
method Unwrap (line 55) | func (w *wrappedIdentity) Unwrap(stanzas []*age.Stanza) ([]byte, error) {
type wrappedRecipient (line 62) | type wrappedRecipient struct
method String (line 67) | func (w *wrappedRecipient) String() string { return w.encoding }
method Wrap (line 70) | func (w *wrappedRecipient) Wrap(fileKey []byte) ([]*age.Stanza, error) {
method Identities (line 75) | func (a *Age) Identities(ctx context.Context) ([]age.Identity, error) {
function parseIdentity (line 113) | func parseIdentity(s string) (age.Identity, error) {
function parseIdentities (line 149) | func parseIdentities(f io.Reader) ([]age.Identity, error) {
method IdentityRecipients (line 180) | func (a *Age) IdentityRecipients(ctx context.Context) ([]age.Recipient, ...
function IdentityToRecipient (line 211) | func IdentityToRecipient(id age.Identity) age.Recipient {
method GenerateIdentity (line 245) | func (a *Age) GenerateIdentity(ctx context.Context, _ string, _ string, ...
method ListIdentities (line 269) | func (a *Age) ListIdentities(ctx context.Context) ([]string, error) {
method FindIdentities (line 287) | func (a *Age) FindIdentities(ctx context.Context, keys ...string) ([]str...
method cachedIDRecipients (line 311) | func (a *Age) cachedIDRecipients() []age.Recipient {
method addIdentity (line 336) | func (a *Age) addIdentity(ctx context.Context, id age.Identity) error {
method saveIdentities (line 349) | func (a *Age) saveIdentities(ctx context.Context, ids []string, newFile ...
method getAllIdentities (line 385) | func (a *Age) getAllIdentities(ctx context.Context) (map[string]age.Iden...
method getPassageIdentities (line 426) | func (a *Age) getPassageIdentities(_ context.Context) (map[string]age.Id...
function PassageIDFile (line 445) | func PassageIDFile() string {
method getNativeIdentities (line 449) | func (a *Age) getNativeIdentities(ctx context.Context) (map[string]age.I...
function idMap (line 458) | func idMap(ids []age.Identity) map[string]age.Identity {
function recipientsToString (line 477) | func recipientsToString(recps []age.Recipient) []string {
function identitiesToString (line 486) | func identitiesToString(ids []age.Identity) []string {
function modTime (line 495) | func modTime(path string) time.Time {
FILE: internal/backend/crypto/age/identities_test.go
function TestParseIdentity (line 13) | func TestParseIdentity(t *testing.T) {
function TestIdentityAndRecipient (line 58) | func TestIdentityAndRecipient(t *testing.T) {
FILE: internal/backend/crypto/age/keyring.go
function OldKeyringPath (line 26) | func OldKeyringPath() string {
function migrate (line 30) | func migrate(ctx context.Context, s backend.Storage) error {
type Keyring (line 102) | type Keyring
type Keypair (line 106) | type Keypair struct
method loadIdentitiesFromKeyring (line 112) | func (a *Age) loadIdentitiesFromKeyring(ctx context.Context) ([]string, ...
FILE: internal/backend/crypto/age/loader.go
constant name (line 15) | name = "age"
function init (line 18) | func init() {
type loader (line 22) | type loader struct
method New (line 24) | func (l loader) New(ctx context.Context) (backend.Crypto, error) {
method Handles (line 30) | func (l loader) Handles(ctx context.Context, s backend.Storage) error {
method Priority (line 52) | func (l loader) Priority() int {
method String (line 56) | func (l loader) String() string {
FILE: internal/backend/crypto/age/loader_test.go
function TestLoader_New (line 11) | func TestLoader_New(t *testing.T) {
function TestLoader_Handles (line 20) | func TestLoader_Handles(t *testing.T) {
function TestLoader_Priority (line 60) | func TestLoader_Priority(t *testing.T) {
function TestLoader_String (line 65) | func TestLoader_String(t *testing.T) {
FILE: internal/backend/crypto/age/recipients.go
method FindRecipients (line 18) | func (a *Age) FindRecipients(ctx context.Context, search ...string) ([]s...
method parseRecipients (line 49) | func (a *Age) parseRecipients(ctx context.Context, recipients []string) ...
FILE: internal/backend/crypto/age/recipients_test.go
function TestFindRecipients (line 11) | func TestFindRecipients(t *testing.T) {
function TestParseRecipients (line 53) | func TestParseRecipients(t *testing.T) {
type mockGHCache (line 91) | type mockGHCache struct
method ListKeys (line 93) | func (m *mockGHCache) ListKeys(ctx context.Context, user string) ([]st...
method String (line 97) | func (m *mockGHCache) String() string {
FILE: internal/backend/crypto/age/ssh.go
method getSSHIdentities (line 28) | func (a *Age) getSSHIdentities(ctx context.Context) (map[string]age.Iden...
function getSSHDir (line 98) | func getSSHDir() (string, error) {
method parseSSHIdentity (line 117) | func (a *Age) parseSSHIdentity(ctx context.Context, pubFn string) (strin...
FILE: internal/backend/crypto/age/unsupported.go
method FormatKey (line 9) | func (a *Age) FormatKey(ctx context.Context, id, tpl string) string {
method Fingerprint (line 14) | func (a *Age) Fingerprint(ctx context.Context, id string) string {
method ListRecipients (line 19) | func (a *Age) ListRecipients(context.Context) ([]string, error) {
method ReadNamesFromKey (line 24) | func (a *Age) ReadNamesFromKey(ctx context.Context, buf []byte) ([]strin...
method RecipientIDs (line 29) | func (a *Age) RecipientIDs(ctx context.Context, buf []byte) ([]string, e...
FILE: internal/backend/crypto/gpg/cli/decrypt.go
method Decrypt (line 14) | func (g *GPG) Decrypt(ctx context.Context, ciphertext []byte) ([]byte, e...
FILE: internal/backend/crypto/gpg/cli/encrypt.go
method Encrypt (line 21) | func (g *GPG) Encrypt(ctx context.Context, plaintext []byte, recipients ...
FILE: internal/backend/crypto/gpg/cli/encrypt_test.go
function TestEncryptDecrypt (line 19) | func TestEncryptDecrypt(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/generate.go
method GenerateIdentity (line 16) | func (g *GPG) GenerateIdentity(ctx context.Context, name, email, passphr...
FILE: internal/backend/crypto/gpg/cli/gpg.go
type GPG (line 32) | type GPG struct
method Initialized (line 91) | func (g *GPG) Initialized(ctx context.Context) error {
method Name (line 96) | func (g *GPG) Name() string {
method Ext (line 101) | func (g *GPG) Ext() string {
method IDFile (line 106) | func (g *GPG) IDFile() string {
method Concurrency (line 112) | func (g *GPG) Concurrency() int {
method Binary (line 117) | func (g *GPG) Binary() string {
method String (line 126) | func (g *GPG) String() string {
type Config (line 42) | type Config struct
function New (line 49) | func New(ctx context.Context, cfg Config) (*GPG, error) {
FILE: internal/backend/crypto/gpg/cli/gpg_others_test.go
function TestEncrypt (line 12) | func TestEncrypt(t *testing.T) {
function TestDecrypt (line 25) | func TestDecrypt(t *testing.T) {
function TestGenerateIdentity (line 37) | func TestGenerateIdentity(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/gpg_test.go
function TestGPG (line 11) | func TestGPG(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/gpg_windows_test.go
function TestEncrypt (line 11) | func TestEncrypt(t *testing.T) {
function TestDecrypt (line 26) | func TestDecrypt(t *testing.T) {
function TestGenerateIdentity (line 39) | func TestGenerateIdentity(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/identities.go
method ListIdentities (line 11) | func (g *GPG) ListIdentities(ctx context.Context) ([]string, error) {
method FindIdentities (line 28) | func (g *GPG) FindIdentities(ctx context.Context, search ...string) ([]s...
method findKey (line 41) | func (g *GPG) findKey(ctx context.Context, id string) (gpg.Key, bool) {
FILE: internal/backend/crypto/gpg/cli/keyring.go
method listKeys (line 20) | func (g *GPG) listKeys(ctx context.Context, typ string, search ...string...
method Fingerprint (line 60) | func (g *GPG) Fingerprint(ctx context.Context, id string) string {
method FormatKey (line 73) | func (g *GPG) FormatKey(ctx context.Context, id, tpl string) string {
method ReadNamesFromKey (line 105) | func (g *GPG) ReadNamesFromKey(ctx context.Context, buf []byte) ([]strin...
method ImportPublicKey (line 124) | func (g *GPG) ImportPublicKey(ctx context.Context, buf []byte) error {
method GetFingerprint (line 152) | func (g *GPG) GetFingerprint(ctx context.Context, buf []byte) (string, e...
method ExportPublicKey (line 174) | func (g *GPG) ExportPublicKey(ctx context.Context, id string) ([]byte, e...
FILE: internal/backend/crypto/gpg/cli/keyring_test.go
constant pubkey (line 13) | pubkey = `
function TestReadNamesFromKey (line 68) | func TestReadNamesFromKey(t *testing.T) {
function TestExportPublicKey (line 83) | func TestExportPublicKey(t *testing.T) {
function TestImport (line 94) | func TestImport(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/loader.go
constant name (line 15) | name = "gpgcli"
function init (line 18) | func init() {
type loader (line 22) | type loader struct
method New (line 25) | func (l loader) New(ctx context.Context) (backend.Crypto, error) {
method Handles (line 35) | func (l loader) Handles(ctx context.Context, s backend.Storage) error {
method Priority (line 43) | func (l loader) Priority() int {
method String (line 47) | func (l loader) String() string {
FILE: internal/backend/crypto/gpg/cli/recipients.go
method ListRecipients (line 19) | func (g *GPG) ListRecipients(ctx context.Context) ([]string, error) {
method FindRecipients (line 36) | func (g *GPG) FindRecipients(ctx context.Context, search ...string) ([]s...
method RecipientIDs (line 83) | func (g *GPG) RecipientIDs(ctx context.Context, buf []byte) ([]string, e...
function splitPacket (line 140) | func splitPacket(in string) map[string]string {
FILE: internal/backend/crypto/gpg/cli/recipients_test.go
function TestSplitPacket (line 9) | func TestSplitPacket(t *testing.T) {
FILE: internal/backend/crypto/gpg/cli/version.go
method Version (line 11) | func (g *GPG) Version(ctx context.Context) semver.Version {
FILE: internal/backend/crypto/gpg/colons/parse_colons.go
function Parse (line 64) | func Parse(reader io.Reader) gpg.KeyList {
function parseKeyCaps (line 120) | func parseKeyCaps(field string) gpg.Capabilities {
function parseColonIdentity (line 146) | func parseColonIdentity(fields []string) gpg.Identity {
FILE: internal/backend/crypto/gpg/colons/parse_colons_test.go
function TestParseColonIdentity (line 10) | func TestParseColonIdentity(t *testing.T) {
FILE: internal/backend/crypto/gpg/colons/parse_fuzz.go
function Fuzz (line 7) | func Fuzz(data []byte) int {
FILE: internal/backend/crypto/gpg/colons/utils.go
function parseTS (line 10) | func parseTS(str string) time.Time {
function parseInt (line 22) | func parseInt(str string) int {
FILE: internal/backend/crypto/gpg/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyAlwaysTrust (line 8) | ctxKeyAlwaysTrust contextKey = iota
constant ctxKeyUseCache (line 9) | ctxKeyUseCache
function WithAlwaysTrust (line 13) | func WithAlwaysTrust(ctx context.Context, at bool) context.Context {
function IsAlwaysTrust (line 19) | func IsAlwaysTrust(ctx context.Context) bool {
function WithUseCache (line 29) | func WithUseCache(ctx context.Context, nc bool) context.Context {
function UseCache (line 34) | func UseCache(ctx context.Context) bool {
FILE: internal/backend/crypto/gpg/context_test.go
function TestAlwaysTrust (line 9) | func TestAlwaysTrust(t *testing.T) {
FILE: internal/backend/crypto/gpg/gpgconf/binary.go
function Binary (line 11) | func Binary(ctx context.Context, bin string) (string, error) {
FILE: internal/backend/crypto/gpg/gpgconf/binary_others.go
function detectBinary (line 13) | func detectBinary(_ context.Context, name string) (string, error) {
FILE: internal/backend/crypto/gpg/gpgconf/binary_windows.go
function detectBinary (line 16) | func detectBinary(ctx context.Context, bin string) (string, error) {
function detectBinaryCandidates (line 45) | func detectBinaryCandidates(bin string) ([]string, error) {
function searchRegistry (line 62) | func searchRegistry(bin string, bins []string) ([]string, error) {
function searchPath (line 84) | func searchPath(bin string, bins []string) ([]string, error) {
FILE: internal/backend/crypto/gpg/gpgconf/binary_windows_test.go
function TestDetectBinaryCandidates (line 11) | func TestDetectBinaryCandidates(t *testing.T) {
FILE: internal/backend/crypto/gpg/gpgconf/gpgconf.go
function Path (line 12) | func Path(key string) (string, error) {
FILE: internal/backend/crypto/gpg/gpgconf/utils.go
function GPGOpts (line 12) | func GPGOpts() []string {
function gpgConfigLoc (line 23) | func gpgConfigLoc() string {
function Config (line 34) | func Config() (map[string]string, error) {
function parseGpgConfig (line 46) | func parseGpgConfig(fh io.Reader) (map[string]string, error) {
FILE: internal/backend/crypto/gpg/gpgconf/utils_linux.go
function TTY (line 14) | func TTY() string {
function Umask (line 24) | func Umask(mask int) int {
FILE: internal/backend/crypto/gpg/gpgconf/utils_linux_test.go
function TestTTY (line 11) | func TestTTY(t *testing.T) {
FILE: internal/backend/crypto/gpg/gpgconf/utils_others.go
function TTY (line 11) | func TTY() string {
function Umask (line 22) | func Umask(mask int) int {
FILE: internal/backend/crypto/gpg/gpgconf/utils_test.go
function TestGpgOpts (line 11) | func TestGpgOpts(t *testing.T) {
function TestGPGConfig (line 25) | func TestGPGConfig(t *testing.T) {
FILE: internal/backend/crypto/gpg/gpgconf/utils_windows.go
function TTY (line 5) | func TTY() string {
function Umask (line 9) | func Umask(mask int) int {
FILE: internal/backend/crypto/gpg/gpgconf/version.go
type gpgBin (line 11) | type gpgBin struct
type byVersion (line 16) | type byVersion
method Len (line 18) | func (v byVersion) Len() int {
method Swap (line 22) | func (v byVersion) Swap(i, j int) {
method Less (line 26) | func (v byVersion) Less(i, j int) bool {
function Version (line 31) | func Version(ctx context.Context, binary string) semver.Version {
FILE: internal/backend/crypto/gpg/gpgconf/version_test.go
function TestSort (line 11) | func TestSort(t *testing.T) {
FILE: internal/backend/crypto/gpg/identity.go
type Identity (line 6) | type Identity struct
method ID (line 15) | func (i Identity) ID() string {
method String (line 29) | func (i Identity) String() string {
FILE: internal/backend/crypto/gpg/identity_test.go
function TestIdentity (line 10) | func TestIdentity(t *testing.T) {
FILE: internal/backend/crypto/gpg/key.go
type Key (line 11) | type Key struct
method IsUseable (line 34) | func (k Key) IsUseable(alwaysTrust bool) bool {
method String (line 65) | func (k Key) String() string {
method OneLine (line 87) | func (k Key) OneLine() string {
method Identity (line 96) | func (k Key) Identity() Identity {
method ID (line 114) | func (k Key) ID() string {
type Capabilities (line 25) | type Capabilities struct
FILE: internal/backend/crypto/gpg/key_list.go
type KeyList (line 13) | type KeyList
method Recipients (line 16) | func (kl KeyList) Recipients() []string {
method UseableKeys (line 35) | func (kl KeyList) UseableKeys(alwaysTrust bool) KeyList {
method UnusableKeys (line 51) | func (kl KeyList) UnusableKeys(alwaysTrust bool) KeyList {
method FindKey (line 68) | func (kl KeyList) FindKey(id string) (Key, error) {
method Len (line 100) | func (kl KeyList) Len() int {
method Less (line 104) | func (kl KeyList) Less(i, j int) bool {
method Swap (line 108) | func (kl KeyList) Swap(i, j int) {
FILE: internal/backend/crypto/gpg/key_list_test.go
function TestKeyList (line 10) | func TestKeyList(t *testing.T) {
FILE: internal/backend/crypto/gpg/key_test.go
function genTestKey (line 11) | func genTestKey(args ...string) Key {
function TestKey (line 77) | func TestKey(t *testing.T) {
function TestIdentitySort (line 92) | func TestIdentitySort(t *testing.T) {
function TestUseability (line 109) | func TestUseability(t *testing.T) {
FILE: internal/backend/crypto/plain/backend.go
type Mocker (line 48) | type Mocker struct
method ListRecipients (line 56) | func (m *Mocker) ListRecipients(context.Context) ([]string, error) {
method FindRecipients (line 61) | func (m *Mocker) FindRecipients(ctx context.Context, keys ...string) (...
method ListIdentities (line 77) | func (m *Mocker) ListIdentities(context.Context) ([]string, error) {
method FindIdentities (line 82) | func (m *Mocker) FindIdentities(ctx context.Context, keys ...string) (...
method RecipientIDs (line 87) | func (m *Mocker) RecipientIDs(context.Context, []byte) ([]string, erro...
method Encrypt (line 92) | func (m *Mocker) Encrypt(ctx context.Context, content []byte, recipien...
method Decrypt (line 97) | func (m *Mocker) Decrypt(ctx context.Context, ciphertext []byte) ([]by...
method ImportPublicKey (line 102) | func (m *Mocker) ImportPublicKey(context.Context, []byte) error {
method Version (line 107) | func (m *Mocker) Version(context.Context) semver.Version {
method Binary (line 112) | func (m *Mocker) Binary() string {
method GenerateIdentity (line 117) | func (m *Mocker) GenerateIdentity(ctx context.Context, name, email, pw...
method Fingerprint (line 122) | func (m *Mocker) Fingerprint(ctx context.Context, id string) string {
method FormatKey (line 127) | func (m *Mocker) FormatKey(ctx context.Context, id, tpl string) string {
method Initialized (line 132) | func (m *Mocker) Initialized(context.Context) error {
method Name (line 137) | func (m *Mocker) Name() string {
method Ext (line 142) | func (m *Mocker) Ext() string {
method IDFile (line 156) | func (m *Mocker) IDFile() string {
method ReadNamesFromKey (line 161) | func (m *Mocker) ReadNamesFromKey(ctx context.Context, buf []byte) ([]...
method GetFingerprint (line 166) | func (m *Mocker) GetFingerprint(ctx context.Context, key []byte) (stri...
method Concurrency (line 171) | func (m *Mocker) Concurrency() int {
method String (line 176) | func (m *Mocker) String() string {
function New (line 51) | func New() *Mocker {
constant Name (line 148) | Name = "plain"
constant Ext (line 150) | Ext = "txt"
constant IDFile (line 152) | IDFile = ".plain-id"
FILE: internal/backend/crypto/plain/backend_test.go
function TestPlain (line 12) | func TestPlain(t *testing.T) {
function TestLoader (line 68) | func TestLoader(t *testing.T) {
FILE: internal/backend/crypto/plain/loader.go
constant name (line 12) | name = "plain"
function init (line 15) | func init() {
type loader (line 19) | type loader struct
method New (line 22) | func (l loader) New(ctx context.Context) (backend.Crypto, error) {
method Handles (line 28) | func (l loader) Handles(ctx context.Context, s backend.Storage) error {
method Priority (line 36) | func (l loader) Priority() int {
method String (line 40) | func (l loader) String() string {
FILE: internal/backend/crypto_test.go
function TestDetectCrypto (line 13) | func TestDetectCrypto(t *testing.T) {
FILE: internal/backend/rcs.go
type rcs (line 12) | type rcs interface
type Revision (line 34) | type Revision struct
type Revisions (line 44) | type Revisions
method Len (line 46) | func (r Revisions) Len() int {
method Less (line 50) | func (r Revisions) Less(i, j int) bool {
method Swap (line 54) | func (r Revisions) Swap(i, j int) {
function Clone (line 59) | func Clone(ctx context.Context, id StorageBackend, repo, path string) (S...
FILE: internal/backend/rcs_test.go
function TestClone (line 16) | func TestClone(t *testing.T) {
function TestInitRCS (line 35) | func TestInitRCS(t *testing.T) {
FILE: internal/backend/registry.go
type Prioritized (line 25) | type Prioritized interface
type CryptoLoader (line 30) | type CryptoLoader interface
type StorageLoader (line 38) | type StorageLoader interface
function NewRegistry (line 48) | func NewRegistry[K comparable, V Prioritized]() *Registry[K, V] {
type Registry (line 57) | type Registry struct
method Register (line 65) | func (r *Registry[K, V]) Register(backend K, name string, loader V) {
method BackendNames (line 74) | func (r *Registry[K, V]) BackendNames() []string {
method Backends (line 81) | func (r *Registry[K, V]) Backends() []V {
method Prioritized (line 93) | func (r *Registry[K, V]) Prioritized() []V {
method Get (line 104) | func (r *Registry[K, V]) Get(key K) (V, error) {
method Backend (line 116) | func (r *Registry[K, V]) Backend(name string) (K, error) {
method BackendName (line 133) | func (r *Registry[K, V]) BackendName(backend K) (string, error) {
FILE: internal/backend/registry_test.go
type fakeCryptoLoaderHighPrio (line 16) | type fakeCryptoLoaderHighPrio struct
method New (line 18) | func (l fakeCryptoLoaderHighPrio) New(context.Context) (backend.Crypto...
method String (line 22) | func (l fakeCryptoLoaderHighPrio) String() string {
method Handles (line 26) | func (l fakeCryptoLoaderHighPrio) Handles(context.Context, backend.Sto...
method Priority (line 30) | func (l fakeCryptoLoaderHighPrio) Priority() int {
type fakeCryptoLoaderLowPrio (line 34) | type fakeCryptoLoaderLowPrio struct
method New (line 36) | func (l fakeCryptoLoaderLowPrio) New(context.Context) (backend.Crypto,...
method String (line 40) | func (l fakeCryptoLoaderLowPrio) String() string {
method Handles (line 44) | func (l fakeCryptoLoaderLowPrio) Handles(context.Context, backend.Stor...
method Priority (line 48) | func (l fakeCryptoLoaderLowPrio) Priority() int {
function TestCryptoLoader (line 52) | func TestCryptoLoader(t *testing.T) {
function TestRegistry_BackendNames (line 62) | func TestRegistry_BackendNames(t *testing.T) {
function TestRegistry_Backends (line 75) | func TestRegistry_Backends(t *testing.T) {
function TestRegistry_Prioritized (line 87) | func TestRegistry_Prioritized(t *testing.T) {
function TestRegistry_Get (line 102) | func TestRegistry_Get(t *testing.T) {
function TestRegistry_Backend (line 134) | func TestRegistry_Backend(t *testing.T) {
function TestRegistry_BackendName (line 171) | func TestRegistry_BackendName(t *testing.T) {
FILE: internal/backend/storage.go
type StorageBackend (line 15) | type StorageBackend
method String (line 30) | func (s StorageBackend) String() string {
constant FS (line 19) | FS StorageBackend = iota
constant GitFS (line 21) | GitFS
constant FossilFS (line 23) | FossilFS
constant JJFS (line 25) | JJFS
constant CryptFS (line 27) | CryptFS
type Storage (line 39) | type Storage interface
function DetectStorage (line 59) | func DetectStorage(ctx context.Context, path string) (Storage, error) {
function NewStorage (line 106) | func NewStorage(ctx context.Context, id StorageBackend, path string) (St...
function InitStorage (line 117) | func InitStorage(ctx context.Context, id StorageBackend, path string) (S...
FILE: internal/backend/storage/cryptfs/crypt.go
constant name (line 26) | name = "cryptfs"
constant mappingFile (line 28) | mappingFile = ".gopass-mapping"
type Crypt (line 32) | type Crypt struct
method hash (line 62) | func (c *Crypt) hash(s string) string {
method loadMappings (line 69) | func (c *Crypt) loadMappings(ctx context.Context) error {
method saveMappings (line 87) | func (c *Crypt) saveMappings(ctx context.Context) error {
method String (line 113) | func (c *Crypt) String() string {
method Name (line 118) | func (c *Crypt) Name() string {
method Path (line 123) | func (c *Crypt) Path() string {
method Version (line 128) | func (c *Crypt) Version(ctx context.Context) semver.Version {
method Fsck (line 133) | func (c *Crypt) Fsck(ctx context.Context) error {
method Prune (line 167) | func (c *Crypt) Prune(ctx context.Context, prefix string) error {
method Link (line 172) | func (c *Crypt) Link(ctx context.Context, from, to string) error {
method getCryptoExt (line 190) | func (c *Crypt) getCryptoExt(ctx context.Context) string {
method pathToName (line 206) | func (c *Crypt) pathToName(ctx context.Context, p string) (string, err...
method Add (line 218) | func (c *Crypt) Add(ctx context.Context, files ...string) error {
method Commit (line 258) | func (c *Crypt) Commit(ctx context.Context, msg string) error {
method TryAdd (line 262) | func (c *Crypt) TryAdd(ctx context.Context, files ...string) error {
method TryCommit (line 276) | func (c *Crypt) TryCommit(ctx context.Context, msg string) error {
method Push (line 280) | func (c *Crypt) Push(ctx context.Context, remote, branch string) error {
method Pull (line 284) | func (c *Crypt) Pull(ctx context.Context, remote, branch string) error {
method TryPush (line 288) | func (c *Crypt) TryPush(ctx context.Context, remote, branch string) er...
method Revisions (line 292) | func (c *Crypt) Revisions(ctx context.Context, name string) ([]backend...
method GetRevision (line 304) | func (c *Crypt) GetRevision(ctx context.Context, name, revision string...
method Status (line 316) | func (c *Crypt) Status(ctx context.Context) ([]byte, error) {
method Compact (line 320) | func (c *Crypt) Compact(ctx context.Context) error {
method InitConfig (line 324) | func (c *Crypt) InitConfig(ctx context.Context, name, email string) er...
method AddRemote (line 328) | func (c *Crypt) AddRemote(ctx context.Context, remote, url string) err...
method RemoveRemote (line 332) | func (c *Crypt) RemoveRemote(ctx context.Context, remote string) error {
method IsDir (line 337) | func (c *Crypt) IsDir(ctx context.Context, name string) bool {
method List (line 351) | func (c *Crypt) List(ctx context.Context, prefix string) ([]string, er...
method Get (line 373) | func (c *Crypt) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 392) | func (c *Crypt) Set(ctx context.Context, name string, value []byte) er...
method Delete (line 413) | func (c *Crypt) Delete(ctx context.Context, name string) error {
method Exists (line 430) | func (c *Crypt) Exists(ctx context.Context, name string) bool {
method Move (line 444) | func (c *Crypt) Move(ctx context.Context, from, to string, del bool) e...
function newCrypt (line 41) | func newCrypt(ctx context.Context, sub backend.Storage) (*Crypt, error) {
FILE: internal/backend/storage/cryptfs/crypt_test.go
function newTestCryptFS (line 20) | func newTestCryptFS(ctx context.Context, t *testing.T, td string) (*Cryp...
function TestSetGet (line 52) | func TestSetGet(t *testing.T) {
function TestList (line 75) | func TestList(t *testing.T) {
function TestDelete (line 103) | func TestDelete(t *testing.T) {
function TestMove (line 124) | func TestMove(t *testing.T) {
function TestIsDir (line 146) | func TestIsDir(t *testing.T) {
function TestGit (line 165) | func TestGit(t *testing.T) {
FILE: internal/backend/storage/cryptfs/loader.go
function init (line 14) | func init() {
type loader (line 18) | type loader struct
method New (line 21) | func (l *loader) New(ctx context.Context, path string) (backend.Storag...
method Init (line 36) | func (l *loader) Init(ctx context.Context, path string) (backend.Stora...
method Handles (line 61) | func (l *loader) Handles(ctx context.Context, path string) error {
method String (line 70) | func (l *loader) String() string {
method Priority (line 75) | func (l *loader) Priority() int {
method Clone (line 80) | func (l *loader) Clone(ctx context.Context, repo, path string) (backen...
function getSubStorage (line 99) | func getSubStorage(ctx context.Context) (backend.StorageBackend, error) {
FILE: internal/backend/storage/fossilfs/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyPathOverride (line 8) | ctxKeyPathOverride contextKey = iota
function withPathOverride (line 11) | func withPathOverride(ctx context.Context, path string) context.Context {
function getPathOverride (line 15) | func getPathOverride(ctx context.Context, def string) string {
FILE: internal/backend/storage/fossilfs/context_test.go
function TestWithPathOverride (line 7) | func TestWithPathOverride(t *testing.T) {
function TestGetPathOverride (line 17) | func TestGetPathOverride(t *testing.T) {
FILE: internal/backend/storage/fossilfs/fossil.go
constant CheckoutMarker (line 25) | CheckoutMarker = ".fslckout"
type Fossil (line 29) | type Fossil struct
method captureCmd (line 125) | func (f *Fossil) captureCmd(ctx context.Context, name string, args ......
method Cmd (line 141) | func (f *Fossil) Cmd(ctx context.Context, name string, args ...string)...
method Name (line 153) | func (f *Fossil) Name() string {
method Version (line 158) | func (f *Fossil) Version(ctx context.Context) semver.Version {
method IsInitialized (line 185) | func (f *Fossil) IsInitialized() bool {
method Add (line 195) | func (f *Fossil) Add(ctx context.Context, files ...string) error {
method TryAdd (line 212) | func (f *Fossil) TryAdd(ctx context.Context, files ...string) error {
method HasStagedChanges (line 227) | func (f *Fossil) HasStagedChanges(ctx context.Context) bool {
method ListUntrackedFiles (line 238) | func (f *Fossil) ListUntrackedFiles(ctx context.Context) []string {
method Commit (line 249) | func (f *Fossil) Commit(ctx context.Context, msg string) error {
method TryCommit (line 271) | func (f *Fossil) TryCommit(ctx context.Context, msg string) error {
method PushPull (line 292) | func (f *Fossil) PushPull(ctx context.Context, op, remote, branch stri...
method Push (line 322) | func (f *Fossil) Push(ctx context.Context, remote, branch string) error {
method TryPush (line 333) | func (f *Fossil) TryPush(ctx context.Context, remote, branch string) e...
method Pull (line 354) | func (f *Fossil) Pull(ctx context.Context, remote, branch string) error {
method AddRemote (line 365) | func (f *Fossil) AddRemote(ctx context.Context, remote, url string) er...
method RemoveRemote (line 370) | func (f *Fossil) RemoveRemote(ctx context.Context, remote string) error {
method Revisions (line 375) | func (f *Fossil) Revisions(ctx context.Context, name string) ([]backen...
method GetRevision (line 449) | func (f *Fossil) GetRevision(ctx context.Context, name, revision strin...
method Status (line 469) | func (f *Fossil) Status(ctx context.Context) ([]byte, error) {
method Compact (line 481) | func (f *Fossil) Compact(ctx context.Context) error {
function New (line 34) | func New(path string) (*Fossil, error) {
function Clone (line 46) | func Clone(ctx context.Context, repo, path string) (*Fossil, error) {
function Init (line 75) | func Init(ctx context.Context, path, _, _ string) (*Fossil, error) {
FILE: internal/backend/storage/fossilfs/fossil_test.go
function TestNew (line 14) | func TestNew(t *testing.T) {
function TestClone (line 26) | func TestClone(t *testing.T) {
function TestInit (line 37) | func TestInit(t *testing.T) {
function TestAdd (line 47) | func TestAdd(t *testing.T) {
function TestCommit (line 58) | func TestCommit(t *testing.T) {
function TestPush (line 69) | func TestPush(t *testing.T) {
function TestPull (line 80) | func TestPull(t *testing.T) {
function TestAddRemote (line 91) | func TestAddRemote(t *testing.T) {
function TestRemoveRemote (line 102) | func TestRemoveRemote(t *testing.T) {
function TestRevisions (line 113) | func TestRevisions(t *testing.T) {
function TestGetRevision (line 125) | func TestGetRevision(t *testing.T) {
function TestStatus (line 137) | func TestStatus(t *testing.T) {
function TestCompact (line 149) | func TestCompact(t *testing.T) {
FILE: internal/backend/storage/fossilfs/loader.go
constant name (line 13) | name = "fossilfs"
function init (line 16) | func init() {
type loader (line 20) | type loader struct
method New (line 22) | func (l loader) New(ctx context.Context, path string) (backend.Storage...
method Open (line 26) | func (l loader) Open(ctx context.Context, path string) (backend.Storag...
method Clone (line 30) | func (l loader) Clone(ctx context.Context, repo, path string) (backend...
method Init (line 34) | func (l loader) Init(ctx context.Context, path string) (backend.Storag...
method Handles (line 38) | func (l loader) Handles(ctx context.Context, path string) error {
method Priority (line 49) | func (l loader) Priority() int {
method String (line 53) | func (l loader) String() string {
FILE: internal/backend/storage/fossilfs/loader_test.go
function createMarker (line 17) | func createMarker(t *testing.T, path string) {
function TestLoader_New (line 26) | func TestLoader_New(t *testing.T) {
function TestLoader_Open (line 37) | func TestLoader_Open(t *testing.T) {
function TestLoader_Clone (line 48) | func TestLoader_Clone(t *testing.T) {
function TestLoader_Init (line 62) | func TestLoader_Init(t *testing.T) {
function TestLoader_Handles (line 75) | func TestLoader_Handles(t *testing.T) {
function TestLoader_Priority (line 89) | func TestLoader_Priority(t *testing.T) {
function TestLoader_String (line 94) | func TestLoader_String(t *testing.T) {
FILE: internal/backend/storage/fossilfs/settings.go
method fixConfig (line 14) | func (f *Fossil) fixConfig(ctx context.Context) error {
method InitConfig (line 29) | func (f *Fossil) InitConfig(ctx context.Context, _, _ string) error {
method ConfigSet (line 39) | func (f *Fossil) ConfigSet(ctx context.Context, key, value string) error {
method ConfigGet (line 44) | func (f *Fossil) ConfigGet(ctx context.Context, key string) (string, err...
method ConfigList (line 67) | func (f *Fossil) ConfigList(ctx context.Context) (map[string]string, err...
FILE: internal/backend/storage/fossilfs/status.go
type fossilStatus (line 10) | type fossilStatus struct
method Untracked (line 49) | func (fs *fossilStatus) Untracked() set.Set[string] {
method Staged (line 53) | func (fs *fossilStatus) Staged() set.Set[string] {
method getStatus (line 17) | func (f *Fossil) getStatus(ctx context.Context) (fossilStatus, error) {
FILE: internal/backend/storage/fossilfs/storage.go
method Get (line 9) | func (f *Fossil) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 14) | func (f *Fossil) Set(ctx context.Context, name string, value []byte) err...
method Delete (line 19) | func (f *Fossil) Delete(ctx context.Context, name string) error {
method Exists (line 24) | func (f *Fossil) Exists(ctx context.Context, name string) bool {
method List (line 31) | func (f *Fossil) List(ctx context.Context, prefix string) ([]string, err...
method IsDir (line 36) | func (f *Fossil) IsDir(ctx context.Context, name string) bool {
method Prune (line 41) | func (f *Fossil) Prune(ctx context.Context, prefix string) error {
method String (line 46) | func (f *Fossil) String() string {
method Path (line 51) | func (f *Fossil) Path() string {
method Fsck (line 56) | func (f *Fossil) Fsck(ctx context.Context) error {
method Link (line 66) | func (f *Fossil) Link(ctx context.Context, from, to string) error {
method Move (line 71) | func (f *Fossil) Move(ctx context.Context, src, dst string, del bool) er...
FILE: internal/backend/storage/fossilfs/storage_test.go
function TestFossil_Get (line 13) | func TestFossil_Get(t *testing.T) {
function TestFossil_Set (line 26) | func TestFossil_Set(t *testing.T) {
function TestFossil_Delete (line 37) | func TestFossil_Delete(t *testing.T) {
function TestFossil_Exists (line 51) | func TestFossil_Exists(t *testing.T) {
function TestFossil_List (line 63) | func TestFossil_List(t *testing.T) {
function TestFossil_IsDir (line 78) | func TestFossil_IsDir(t *testing.T) {
function TestFossil_Prune (line 89) | func TestFossil_Prune(t *testing.T) {
function TestFossil_String (line 102) | func TestFossil_String(t *testing.T) {
function TestFossil_Path (line 111) | func TestFossil_Path(t *testing.T) {
function TestFossil_Fsck (line 119) | func TestFossil_Fsck(t *testing.T) {
function TestFossil_Link (line 128) | func TestFossil_Link(t *testing.T) {
function TestFossil_Move (line 141) | func TestFossil_Move(t *testing.T) {
FILE: internal/backend/storage/fs/fsck.go
method Fsck (line 18) | func (s *Store) Fsck(ctx context.Context) error {
method fsckCheckFile (line 57) | func (s *Store) fsckCheckFile(ctx context.Context, filename string) error {
method fsckCheckDir (line 78) | func (s *Store) fsckCheckDir(ctx context.Context, dirname string) error {
method fsckCheckEmptyDirs (line 110) | func (s *Store) fsckCheckEmptyDirs() error {
function fsckRemoveEmptyDir (line 149) | func fsckRemoveEmptyDir(fp string) error {
FILE: internal/backend/storage/fs/fsck_test.go
function TestFsck (line 13) | func TestFsck(t *testing.T) {
FILE: internal/backend/storage/fs/link.go
function addRel (line 16) | func addRel(src, dst string) string {
function longestCommonPrefix (line 25) | func longestCommonPrefix(l, r string) string {
method Link (line 44) | func (s *Store) Link(ctx context.Context, from, to string) error {
FILE: internal/backend/storage/fs/link_test.go
function TestLongestCommonPrefix (line 9) | func TestLongestCommonPrefix(t *testing.T) {
function TestAddRel (line 28) | func TestAddRel(t *testing.T) {
FILE: internal/backend/storage/fs/loader.go
constant name (line 14) | name = "fs"
function init (line 17) | func init() {
type loader (line 21) | type loader struct
method New (line 24) | func (l loader) New(ctx context.Context, path string) (backend.Storage...
method Init (line 34) | func (l loader) Init(ctx context.Context, path string) (backend.Storag...
method Clone (line 43) | func (l loader) Clone(ctx context.Context, repo, path string) (backend...
method Handles (line 49) | func (l loader) Handles(ctx context.Context, path string) error {
method Priority (line 61) | func (l loader) Priority() int {
method String (line 65) | func (l loader) String() string {
FILE: internal/backend/storage/fs/rcs.go
method Add (line 12) | func (s *Store) Add(ctx context.Context, args ...string) error {
method TryAdd (line 17) | func (s *Store) TryAdd(ctx context.Context, args ...string) error {
method Commit (line 22) | func (s *Store) Commit(ctx context.Context, msg string) error {
method TryCommit (line 27) | func (s *Store) TryCommit(ctx context.Context, msg string) error {
method Push (line 32) | func (s *Store) Push(ctx context.Context, origin, branch string) error {
method TryPush (line 37) | func (s *Store) TryPush(ctx context.Context, origin, branch string) error {
method Pull (line 42) | func (s *Store) Pull(ctx context.Context, origin, branch string) error {
method Cmd (line 47) | func (s *Store) Cmd(ctx context.Context, name string, args ...string) er...
method Init (line 52) | func (s *Store) Init(context.Context, string, string) error {
method InitConfig (line 57) | func (s *Store) InitConfig(context.Context, string, string) error {
method AddRemote (line 62) | func (s *Store) AddRemote(ctx context.Context, remote, url string) error {
method RemoveRemote (line 67) | func (s *Store) RemoveRemote(ctx context.Context, remote string) error {
method Revisions (line 72) | func (s *Store) Revisions(context.Context, string) ([]backend.Revision, ...
method GetRevision (line 82) | func (s *Store) GetRevision(ctx context.Context, name string, revision s...
method Status (line 91) | func (s *Store) Status(context.Context) ([]byte, error) {
method Compact (line 96) | func (s *Store) Compact(context.Context) error {
FILE: internal/backend/storage/fs/rcs_test.go
function TestRCS (line 11) | func TestRCS(t *testing.T) {
FILE: internal/backend/storage/fs/store.go
type Store (line 22) | type Store struct
method Get (line 38) | func (s *Store) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 50) | func (s *Store) Set(ctx context.Context, name string, value []byte) er...
method Move (line 78) | func (s *Store) Move(ctx context.Context, from, to string, del bool) e...
method Delete (line 107) | func (s *Store) Delete(ctx context.Context, name string) error {
method removeEmptyParentDirectories (line 122) | func (s *Store) removeEmptyParentDirectories(path string) error {
method Exists (line 148) | func (s *Store) Exists(ctx context.Context, name string) bool {
method List (line 162) | func (s *Store) List(ctx context.Context, prefix string) ([]string, er...
method IsDir (line 207) | func (s *Store) IsDir(ctx context.Context, name string) bool {
method Prune (line 219) | func (s *Store) Prune(ctx context.Context, prefix string) error {
method Name (line 231) | func (s *Store) Name() string {
method Version (line 236) | func (s *Store) Version(context.Context) semver.Version {
method String (line 241) | func (s *Store) String() string {
method Path (line 246) | func (s *Store) Path() string {
function New (line 27) | func New(dir string) *Store {
FILE: internal/backend/storage/fs/store_others.go
function notEmptyErr (line 11) | func notEmptyErr(err error) bool {
FILE: internal/backend/storage/fs/store_test.go
function TestSetAndGet (line 13) | func TestSetAndGet(t *testing.T) {
function TestMove (line 47) | func TestMove(t *testing.T) {
function TestRemoveEmptyParentDirectories (line 91) | func TestRemoveEmptyParentDirectories(t *testing.T) {
function TestDelete (line 178) | func TestDelete(t *testing.T) {
FILE: internal/backend/storage/fs/store_windows.go
function notEmptyErr (line 8) | func notEmptyErr(err error) bool {
FILE: internal/backend/storage/fs/walk.go
function walkSymlinks (line 9) | func walkSymlinks(path string, walkFn filepath.WalkFunc) error {
function walk (line 13) | func walk(filename, linkDir string, walkFn filepath.WalkFunc) error {
FILE: internal/backend/storage/fs/walk_test.go
function TestWalkTooLong (line 14) | func TestWalkTooLong(t *testing.T) {
function TestWalkSameFile (line 50) | func TestWalkSameFile(t *testing.T) {
FILE: internal/backend/storage/gitfs/commands.go
method Commands (line 20) | func (l loader) Commands(i func(*cli.Context) error, s func(string) (str...
FILE: internal/backend/storage/gitfs/config.go
constant fileMode (line 15) | fileMode = 0o600
method fixConfig (line 21) | func (g *Git) fixConfig(ctx context.Context) error {
method InitConfig (line 56) | func (g *Git) InitConfig(ctx context.Context, userName, userEmail string...
method ConfigSet (line 92) | func (g *Git) ConfigSet(ctx context.Context, key, value string) error {
method ConfigGet (line 98) | func (g *Git) ConfigGet(ctx context.Context, key string) (string, error) {
method ConfigList (line 114) | func (g *Git) ConfigList(ctx context.Context) (map[string]string, error) {
FILE: internal/backend/storage/gitfs/config_test.go
function TestGitConfig (line 16) | func TestGitConfig(t *testing.T) {
FILE: internal/backend/storage/gitfs/git.go
type contextKey (line 27) | type contextKey
constant ctxKeyPathOverride (line 30) | ctxKeyPathOverride contextKey = iota
function withPathOverride (line 33) | func withPathOverride(ctx context.Context, path string) context.Context {
function getPathOverride (line 37) | func getPathOverride(ctx context.Context, def string) string {
type Git (line 46) | type Git struct
method captureCmd (line 136) | func (g *Git) captureCmd(ctx context.Context, name string, args ...str...
method Cmd (line 152) | func (g *Git) Cmd(ctx context.Context, name string, args ...string) er...
method Name (line 164) | func (g *Git) Name() string {
method Version (line 169) | func (g *Git) Version(ctx context.Context) semver.Version {
method IsInitialized (line 217) | func (g *Git) IsInitialized() bool {
method Add (line 222) | func (g *Git) Add(ctx context.Context, files ...string) error {
method TryAdd (line 238) | func (g *Git) TryAdd(ctx context.Context, files ...string) error {
method HasStagedChanges (line 253) | func (g *Git) HasStagedChanges(ctx context.Context) bool {
method ListUntrackedFiles (line 262) | func (g *Git) ListUntrackedFiles(ctx context.Context) []string {
method Commit (line 279) | func (g *Git) Commit(ctx context.Context, msg string) error {
method TryCommit (line 298) | func (g *Git) TryCommit(ctx context.Context, msg string) error {
method defaultRemote (line 317) | func (g *Git) defaultRemote(ctx context.Context, branch string) string {
method defaultBranch (line 338) | func (g *Git) defaultBranch(ctx context.Context) string {
method PushPull (line 350) | func (g *Git) PushPull(ctx context.Context, op, remote, branch string)...
method TryPush (line 396) | func (g *Git) TryPush(ctx context.Context, remote, branch string) error {
method Push (line 417) | func (g *Git) Push(ctx context.Context, remote, branch string) error {
method Pull (line 428) | func (g *Git) Pull(ctx context.Context, remote, branch string) error {
method AddRemote (line 439) | func (g *Git) AddRemote(ctx context.Context, remote, url string) error {
method RemoveRemote (line 444) | func (g *Git) RemoveRemote(ctx context.Context, remote string) error {
method Revisions (line 451) | func (g *Git) Revisions(ctx context.Context, name string) ([]backend.R...
method GetRevision (line 512) | func (g *Git) GetRevision(ctx context.Context, name, revision string) ...
method Status (line 530) | func (g *Git) Status(ctx context.Context) ([]byte, error) {
method Compact (line 542) | func (g *Git) Compact(ctx context.Context) error {
function New (line 52) | func New(path string) (*Git, error) {
function Clone (line 68) | func Clone(ctx context.Context, repo, path, userName, userEmail string) ...
function Init (line 90) | func Init(ctx context.Context, path, userName, userEmail string) (*Git, ...
function parseVersion (line 197) | func parseVersion(sv string) (semver.Version, error) {
FILE: internal/backend/storage/gitfs/git_test.go
function TestGit (line 17) | func TestGit(t *testing.T) {
function TestParseVersion (line 85) | func TestParseVersion(t *testing.T) {
FILE: internal/backend/storage/gitfs/loader.go
constant name (line 14) | name = "gitfs"
function init (line 17) | func init() {
type loader (line 21) | type loader struct
method New (line 23) | func (l loader) New(ctx context.Context, path string) (backend.Storage...
method Open (line 28) | func (l loader) Open(ctx context.Context, path string) (backend.Storag...
method Clone (line 33) | func (l loader) Clone(ctx context.Context, repo, path string) (backend...
method Init (line 38) | func (l loader) Init(ctx context.Context, path string) (backend.Storag...
method Handles (line 42) | func (l loader) Handles(ctx context.Context, path string) error {
method Priority (line 51) | func (l loader) Priority() int {
method String (line 55) | func (l loader) String() string {
FILE: internal/backend/storage/gitfs/ssh_darwin.go
function gitSSHCommand (line 16) | func gitSSHCommand() string {
FILE: internal/backend/storage/gitfs/ssh_others.go
function gitSSHCommand (line 17) | func gitSSHCommand() string {
FILE: internal/backend/storage/gitfs/ssh_windows.go
function gitSSHCommand (line 5) | func gitSSHCommand() string {
FILE: internal/backend/storage/gitfs/storage.go
method Get (line 11) | func (g *Git) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 16) | func (g *Git) Set(ctx context.Context, name string, value []byte) error {
method Delete (line 21) | func (g *Git) Delete(ctx context.Context, name string) error {
method Exists (line 26) | func (g *Git) Exists(ctx context.Context, name string) bool {
method List (line 33) | func (g *Git) List(ctx context.Context, prefix string) ([]string, error) {
method IsDir (line 38) | func (g *Git) IsDir(ctx context.Context, name string) bool {
method Prune (line 43) | func (g *Git) Prune(ctx context.Context, prefix string) error {
method String (line 48) | func (g *Git) String() string {
method Path (line 53) | func (g *Git) Path() string {
method Fsck (line 58) | func (g *Git) Fsck(ctx context.Context) error {
method addUntrackedFiles (line 72) | func (g *Git) addUntrackedFiles(ctx context.Context) error {
method Link (line 89) | func (g *Git) Link(ctx context.Context, from, to string) error {
method Move (line 94) | func (g *Git) Move(ctx context.Context, src, dst string, del bool) error {
FILE: internal/backend/storage/jjfs/jj.go
type JJFS (line 25) | type JJFS struct
method captureCmd (line 61) | func (j *JJFS) captureCmd(ctx context.Context, name string, args ...st...
method Cmd (line 77) | func (j *JJFS) Cmd(ctx context.Context, name string, args ...string) e...
method Name (line 89) | func (j *JJFS) Name() string {
method Version (line 94) | func (j *JJFS) Version(ctx context.Context) semver.Version {
method IsInitialized (line 115) | func (j *JJFS) IsInitialized() bool {
method Add (line 120) | func (j *JJFS) Add(ctx context.Context, files ...string) error {
method TryAdd (line 136) | func (j *JJFS) TryAdd(ctx context.Context, files ...string) error {
method Commit (line 151) | func (j *JJFS) Commit(ctx context.Context, msg string) error {
method TryCommit (line 160) | func (j *JJFS) TryCommit(ctx context.Context, msg string) error {
method Push (line 180) | func (j *JJFS) Push(ctx context.Context, _, _ string) error {
method Pull (line 194) | func (j *JJFS) Pull(ctx context.Context, _, _ string) error {
method TryPush (line 208) | func (j *JJFS) TryPush(ctx context.Context, remote, branch string) err...
method Revisions (line 229) | func (j *JJFS) Revisions(ctx context.Context, name string) ([]backend....
method GetRevision (line 287) | func (j *JJFS) GetRevision(ctx context.Context, name, revision string)...
method Status (line 310) | func (j *JJFS) Status(ctx context.Context) ([]byte, error) {
method Compact (line 322) | func (j *JJFS) Compact(ctx context.Context) error {
method ListUntrackedFiles (line 327) | func (j *JJFS) ListUntrackedFiles(ctx context.Context) []string {
method HasStagedChanges (line 346) | func (j *JJFS) HasStagedChanges(ctx context.Context) bool {
method AddRemote (line 356) | func (j *JJFS) AddRemote(ctx context.Context, remote, url string) error {
method RemoveRemote (line 361) | func (j *JJFS) RemoveRemote(ctx context.Context, remote string) error {
method InitConfig (line 366) | func (j *JJFS) InitConfig(ctx context.Context, name, email string) err...
method Get (line 371) | func (j *JJFS) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 376) | func (j *JJFS) Set(ctx context.Context, name string, value []byte) err...
method Delete (line 381) | func (j *JJFS) Delete(ctx context.Context, name string) error {
method Exists (line 386) | func (j *JJFS) Exists(ctx context.Context, name string) bool {
method List (line 391) | func (j *JJFS) List(ctx context.Context, prefix string) ([]string, err...
method IsDir (line 396) | func (j *JJFS) IsDir(ctx context.Context, name string) bool {
method Prune (line 401) | func (j *JJFS) Prune(ctx context.Context, prefix string) error {
method Link (line 406) | func (j *JJFS) Link(ctx context.Context, from, to string) error {
method Path (line 411) | func (j *JJFS) Path() string {
method Fsck (line 416) | func (j *JJFS) Fsck(ctx context.Context) error {
method Move (line 421) | func (j *JJFS) Move(ctx context.Context, from, to string, del bool) er...
method String (line 425) | func (j *JJFS) String() string {
function New (line 30) | func New(path string) (*JJFS, error) {
function Init (line 38) | func Init(ctx context.Context, path, userName, userEmail string) (*JJFS,...
FILE: internal/backend/storage/jjfs/loader.go
function init (line 11) | func init() {
type loader (line 15) | type loader struct
method String (line 17) | func (l loader) String() string {
method Priority (line 21) | func (l loader) Priority() int {
method New (line 25) | func (l loader) New(ctx context.Context, path string) (backend.Storage...
method Init (line 29) | func (l loader) Init(ctx context.Context, path string) (backend.Storag...
method Clone (line 33) | func (l loader) Clone(ctx context.Context, repo, path string) (backend...
method Handles (line 37) | func (l loader) Handles(ctx context.Context, path string) error {
FILE: internal/backend/storage_test.go
function TestDetectStorage (line 15) | func TestDetectStorage(t *testing.T) {
FILE: internal/cache/disk.go
type OnDisk (line 18) | type OnDisk struct
method ensureDir (line 44) | func (o *OnDisk) ensureDir() error {
method String (line 53) | func (o *OnDisk) String() string {
method Get (line 58) | func (o *OnDisk) Get(key string) ([]string, error) {
method Set (line 79) | func (o *OnDisk) Set(key string, value []string) error {
method ModTime (line 95) | func (o *OnDisk) ModTime(key string) time.Time {
method Remove (line 107) | func (o *OnDisk) Remove(key string) error {
method Purge (line 118) | func (o *OnDisk) Purge() error {
function NewOnDisk (line 25) | func NewOnDisk(name string, ttl time.Duration) (*OnDisk, error) {
function NewOnDiskWithDir (line 32) | func NewOnDiskWithDir(name, dir string, ttl time.Duration) (*OnDisk, err...
FILE: internal/cache/disk_test.go
function TestOnDisk (line 11) | func TestOnDisk(t *testing.T) {
function TestOnDiskExpiry (line 29) | func TestOnDiskExpiry(t *testing.T) {
FILE: internal/cache/ghssh/cache.go
type Cache (line 11) | type Cache struct
method String (line 29) | func (c *Cache) String() string {
function New (line 17) | func New() (*Cache, error) {
FILE: internal/cache/ghssh/cache_test.go
function TestNew (line 11) | func TestNew(t *testing.T) {
function TestCache_String (line 23) | func TestCache_String(t *testing.T) {
FILE: internal/cache/ghssh/github.go
method ListKeys (line 30) | func (c *Cache) ListKeys(ctx context.Context, user string) ([]string, er...
method fetchKeys (line 55) | func (c *Cache) fetchKeys(ctx context.Context, user string) ([]string, e...
FILE: internal/cache/ghssh/github_test.go
function TestListKeys (line 12) | func TestListKeys(t *testing.T) {
function TestFetchKeys (line 51) | func TestFetchKeys(t *testing.T) {
FILE: internal/cache/inmem.go
type cacheEntry (line 8) | type cacheEntry struct
method isExpired (line 16) | func (ce *cacheEntry[V]) isExpired() bool {
type InMemTTL (line 29) | type InMemTTL struct
function NewInMemTTL (line 38) | func NewInMemTTL[K comparable, V any](ttl time.Duration, maxTTL time.Dur...
method Get (line 47) | func (c *InMemTTL[K, V]) Get(key K) (V, bool) {
method purgeExpired (line 73) | func (c *InMemTTL[K, V]) purgeExpired() {
method Set (line 82) | func (c *InMemTTL[K, V]) Set(key K, value V) {
method Remove (line 105) | func (c *InMemTTL[K, V]) Remove(key K) {
method Purge (line 113) | func (c *InMemTTL[K, V]) Purge() {
FILE: internal/cache/inmem_test.go
function nowFunc (line 11) | func nowFunc(ns int) func() time.Time {
function TestTTL (line 17) | func TestTTL(t *testing.T) {
function TestPar (line 70) | func TestPar(t *testing.T) {
FILE: internal/completion/fish/completion.go
function longName (line 15) | func longName(name string) string {
function shortName (line 21) | func shortName(name string) string {
function escapePasswordName (line 30) | func escapePasswordName(name string) string {
function formatFlag (line 42) | func formatFlag(name, usage, typ string) string {
function formatFlagFunc (line 55) | func formatFlagFunc(typ string) func(cli.Flag) (string, error) {
function GetCompletion (line 87) | func GetCompletion(a *cli.App) (string, error) {
FILE: internal/completion/fish/completion_escaping_test.go
function TestEscapePasswordName (line 9) | func TestEscapePasswordName(t *testing.T) {
FILE: internal/completion/fish/completion_test.go
type unknownFlag (line 12) | type unknownFlag struct
method String (line 14) | func (u *unknownFlag) String() string {
method Apply (line 18) | func (u *unknownFlag) Apply(*flag.FlagSet) error {
method GetName (line 22) | func (u *unknownFlag) GetName() string {
method IsSet (line 26) | func (u *unknownFlag) IsSet() bool {
method Names (line 30) | func (u *unknownFlag) Names() []string {
function TestFormatFlag (line 34) | func TestFormatFlag(t *testing.T) {
function TestGetCompletion (line 57) | func TestGetCompletion(t *testing.T) {
function TestFormatflagFunc (line 76) | func TestFormatflagFunc(t *testing.T) {
FILE: internal/completion/zsh/completion.go
function longName (line 16) | func longName(name string) string {
function escapePasswordName (line 22) | func escapePasswordName(name string) string {
function formatFlag (line 34) | func formatFlag(name, usage string) string {
function formatFlagFunc (line 42) | func formatFlagFunc() func(cli.Flag) (string, error) {
function GetCompletion (line 74) | func GetCompletion(a *cli.App) (string, error) {
FILE: internal/completion/zsh/completion_escaping_test.go
function TestEscapePasswordName (line 9) | func TestEscapePasswordName(t *testing.T) {
FILE: internal/completion/zsh/completion_test.go
type unknownFlag (line 12) | type unknownFlag struct
method String (line 14) | func (u *unknownFlag) String() string {
method Apply (line 18) | func (u *unknownFlag) Apply(*flag.FlagSet) error {
method GetName (line 22) | func (u *unknownFlag) GetName() string {
method IsSet (line 26) | func (u *unknownFlag) IsSet() bool {
method Names (line 30) | func (u *unknownFlag) Names() []string {
function TestFormatFlag (line 34) | func TestFormatFlag(t *testing.T) {
function TestGetCompletion (line 51) | func TestGetCompletion(t *testing.T) {
function TestFormatflagFunc (line 70) | func TestFormatflagFunc(t *testing.T) {
FILE: internal/config/config.go
constant DefaultPasswordLength (line 18) | DefaultPasswordLength = 24
constant DefaultXKCDLength (line 19) | DefaultXKCDLength = 4
type Level (line 27) | type Level
constant None (line 30) | None Level = iota
constant Env (line 31) | Env
constant Worktree (line 32) | Worktree
constant Local (line 33) | Local
constant Global (line 34) | Global
constant System (line 35) | System
constant Preset (line 36) | Preset
function newGitconfig (line 39) | func newGitconfig() *gitconfig.Configs {
type Config (line 62) | type Config struct
method IsSet (line 151) | func (c *Config) IsSet(key string) bool {
method IsSetM (line 156) | func (c *Config) IsSetM(mount, key string) bool {
method Get (line 169) | func (c *Config) Get(key string) string {
method GetAll (line 174) | func (c *Config) GetAll(key string) []string {
method GetGlobal (line 180) | func (c *Config) GetGlobal(key string) string {
method GetM (line 185) | func (c *Config) GetM(mount, key string) string {
method Set (line 211) | func (c *Config) Set(mount, key, value string) error {
method SetWithLevel (line 219) | func (c *Config) SetWithLevel(mount, key, value string) (Level, error) {
method SetEnv (line 238) | func (c *Config) SetEnv(key, value string) error {
method Path (line 243) | func (c *Config) Path() string {
method MountPath (line 248) | func (c *Config) MountPath(mountPoint string) string {
method SetPath (line 253) | func (c *Config) SetPath(path string) error {
method SetMountPath (line 258) | func (c *Config) SetMountPath(mount, path string) error {
method Mounts (line 269) | func (c *Config) Mounts() []string {
method Unset (line 274) | func (c *Config) Unset(mount, key string) error {
method Keys (line 291) | func (c *Config) Keys(mount string) []string {
method migrateOptions (line 305) | func (c *Config) migrateOptions(migrations map[string]string) {
function New (line 81) | func New() *Config {
function NewInMemory (line 91) | func NewInMemory() *Config {
function NewContextInMemory (line 96) | func NewContextInMemory() context.Context {
function newWithOptions (line 100) | func newWithOptions(noWrites bool) *Config {
function HasGlobalConfig (line 146) | func HasGlobalConfig() bool {
function mpk (line 263) | func mpk(mount string) string {
function DefaultPasswordLengthFromEnv (line 349) | func DefaultPasswordLengthFromEnv(ctx context.Context) (int, bool) {
FILE: internal/config/config_test.go
function TestConfig (line 11) | func TestConfig(t *testing.T) {
function TestEnvConfig (line 66) | func TestEnvConfig(t *testing.T) {
function TestInvalidEnvConfig (line 91) | func TestInvalidEnvConfig(t *testing.T) {
function TestOptsMigration (line 118) | func TestOptsMigration(t *testing.T) {
FILE: internal/config/config_windows.go
function init (line 5) | func init() {
FILE: internal/config/context.go
type contextKey (line 10) | type contextKey
constant ctxKeyConfig (line 13) | ctxKeyConfig contextKey = iota
constant ctxKeyMountPoint (line 14) | ctxKeyMountPoint
method WithConfig (line 17) | func (c *Config) WithConfig(ctx context.Context) context.Context {
function WithMount (line 21) | func WithMount(ctx context.Context, mp string) context.Context {
function FromContext (line 26) | func FromContext(ctx context.Context) (*Config, string) {
FILE: internal/config/docs_test.go
function TestConfigOptsInDocs (line 54) | func TestConfigOptsInDocs(t *testing.T) {
function usedOpts (line 81) | func usedOpts(t *testing.T) map[string]bool {
function usedOptsInFile (line 113) | func usedOptsInFile(t *testing.T, fn string, opts map[string]bool, re *r...
function documentedOpts (line 152) | func documentedOpts(t *testing.T) map[string]bool {
function TestEnvVarsInDocs (line 185) | func TestEnvVarsInDocs(t *testing.T) {
function usedEnvs (line 206) | func usedEnvs(t *testing.T) map[string]bool {
function usedEnvsInFile (line 241) | func usedEnvsInFile(t *testing.T, fn string, opts map[string]bool, re *r...
function documentedEnvs (line 276) | func documentedEnvs(t *testing.T) map[string]bool {
FILE: internal/config/legacy.go
function migrateConfigs (line 10) | func migrateConfigs() error {
FILE: internal/config/legacy/config.go
type Config (line 22) | type Config struct
method CheckOverflow (line 57) | func (c *Config) CheckOverflow() error {
method Config (line 62) | func (c *Config) Config() *Config {
method SetConfigValue (line 67) | func (c *Config) SetConfigValue(key, value string) error {
method setConfigValue (line 76) | func (c *Config) setConfigValue(key, value string) error {
method String (line 126) | func (c *Config) String() string {
method Directory (line 131) | func (c *Config) Directory() string {
method ConfigMap (line 136) | func (c *Config) ConfigMap() map[string]string {
function New (line 42) | func New() *Config {
FILE: internal/config/legacy/config_test.go
function TestNewConfig (line 16) | func TestNewConfig(t *testing.T) {
function TestSetConfigValue (line 38) | func TestSetConfigValue(t *testing.T) {
FILE: internal/config/legacy/io.go
function LoadWithFallbackRelaxed (line 17) | func LoadWithFallbackRelaxed() *Config {
function LoadWithFallback (line 22) | func LoadWithFallback() *Config {
function LoadWithOptions (line 27) | func LoadWithOptions(relaxed, useDefault bool) *Config {
function Load (line 42) | func Load() *Config {
function loadConfig (line 50) | func loadConfig(l string, relaxed bool) *Config {
function loadDefault (line 67) | func loadDefault() *Config {
function load (line 75) | func load(cf string, relaxed bool) (*Config, error) {
function checkOverflow (line 104) | func checkOverflow(m map[string]any) error {
type configer (line 114) | type configer interface
function decode (line 119) | func decode(buf []byte, relaxed bool) (*Config, error) {
method Save (line 204) | func (c *Config) Save() error {
FILE: internal/config/legacy/io_test.go
function TestConfigs (line 18) | func TestConfigs(t *testing.T) {
constant testConfig (line 348) | testConfig = `root:
function TestLoad (line 378) | func TestLoad(t *testing.T) {
function TestLoadError (line 391) | func TestLoadError(t *testing.T) {
function TestDecodeError (line 415) | func TestDecodeError(t *testing.T) {
function capture (line 432) | func capture(t *testing.T, fn func() error) string {
FILE: internal/config/legacy/legacy.go
type Pre1127 (line 10) | type Pre1127 struct
method Config (line 30) | func (c *Pre1127) Config() *Config {
method CheckOverflow (line 50) | func (c *Pre1127) CheckOverflow() error {
type Pre1102 (line 55) | type Pre1102 struct
method CheckOverflow (line 73) | func (c *Pre1102) CheckOverflow() error {
method Config (line 78) | func (c *Pre1102) Config() *Config {
type Pre193 (line 98) | type Pre193 struct
method CheckOverflow (line 128) | func (c *Pre193) CheckOverflow() error {
method Config (line 133) | func (c *Pre193) Config() *Config {
type Pre193StoreConfig (line 108) | type Pre193StoreConfig struct
type Pre182 (line 163) | type Pre182 struct
method CheckOverflow (line 194) | func (c *Pre182) CheckOverflow() error {
method Config (line 199) | func (c *Pre182) Config() *Config {
type Pre182StoreConfig (line 174) | type Pre182StoreConfig struct
type Pre140 (line 229) | type Pre140 struct
method CheckOverflow (line 245) | func (c *Pre140) CheckOverflow() error {
method Config (line 250) | func (c *Pre140) Config() *Config {
type Pre130 (line 268) | type Pre130 struct
method CheckOverflow (line 290) | func (c *Pre130) CheckOverflow() error {
method Config (line 295) | func (c *Pre130) Config() *Config {
function pathFromURL (line 311) | func pathFromURL(u string) (string, error) {
FILE: internal/config/legacy/location.go
function configLocation (line 15) | func configLocation() string {
function ConfigLocations (line 29) | func ConfigLocations() []string {
function PwStoreDir (line 43) | func PwStoreDir(mount string) string {
FILE: internal/config/legacy/location_xdg_test.go
function TestConfigLocations (line 13) | func TestConfigLocations(t *testing.T) {
FILE: internal/config/location.go
function configLocation (line 15) | func configLocation() string {
function PwStoreDir (line 29) | func PwStoreDir(mount string) string {
function Directory (line 52) | func Directory() string {
FILE: internal/config/location_test.go
function TestPwStoreDirNoEnv (line 12) | func TestPwStoreDirNoEnv(t *testing.T) {
function TestDirectory (line 31) | func TestDirectory(t *testing.T) {
FILE: internal/config/location_xdg_test.go
function TestPwStoreDir (line 14) | func TestPwStoreDir(t *testing.T) {
function TestConfigLocation (line 41) | func TestConfigLocation(t *testing.T) {
FILE: internal/config/utils.go
function AsBool (line 9) | func AsBool(s string) bool {
function AsBoolWithDefault (line 14) | func AsBoolWithDefault(s string, def bool) bool {
function AsInt (line 30) | func AsInt(s string) int {
function AsIntWithDefault (line 35) | func AsIntWithDefault(s string, def int) int {
function Bool (line 49) | func Bool(ctx context.Context, key string) bool {
function String (line 56) | func String(ctx context.Context, key string) string {
function Int (line 63) | func Int(ctx context.Context, key string) int {
FILE: internal/config/utils_test.go
function TestAsBoolWithDefault (line 7) | func TestAsBoolWithDefault(t *testing.T) {
function TestAsIntWithDefault (line 51) | func TestAsIntWithDefault(t *testing.T) {
FILE: internal/create/helpers.go
function fmtfn (line 14) | func fmtfn(d int, n string, t string) string {
function extractHostname (line 25) | func extractHostname(in string) string {
FILE: internal/create/helpers_test.go
function TestFmtfn (line 10) | func TestFmtfn(t *testing.T) {
function TestExtractHostname (line 30) | func TestExtractHostname(t *testing.T) {
FILE: internal/create/templates.go
type storageSetter (line 64) | type storageSetter interface
method writeTemplates (line 70) | func (w *Wizard) writeTemplates(ctx context.Context, s storageSetter) er...
FILE: internal/create/wizard.go
constant tplPath (line 35) | tplPath = ".gopass/create/"
type Attribute (line 40) | type Attribute struct
type Template (line 52) | type Template struct
type Wizard (line 62) | type Wizard struct
method parseTemplatesFallback (line 106) | func (w *Wizard) parseTemplatesFallback(_ context.Context) ([]Template...
method parseTemplates (line 119) | func (w *Wizard) parseTemplates(ctx context.Context, s backend.Storage...
method Actions (line 161) | func (w *Wizard) Actions(s *root.Store, cb ActionCallback) cui.Actions {
function New (line 68) | func New(ctx context.Context, s backend.Storage) (*Wizard, error) {
type ActionCallback (line 157) | type ActionCallback
function mkActFunc (line 177) | func mkActFunc(tpl Template, s *root.Store, cb ActionCallback) func(cont...
function renderTemplate (line 343) | func renderTemplate(ctx context.Context, name string, s *root.Store) ([]...
function generatePassword (line 367) | func generatePassword(ctx context.Context, hostname, charset string, str...
function generatePasswordXKCD (line 422) | func generatePasswordXKCD(ctx context.Context) (string, error) {
FILE: internal/create/wizard_test.go
type fakeSetter (line 13) | type fakeSetter struct
method Set (line 15) | func (f *fakeSetter) Set(ctx context.Context, name string, content []b...
method Add (line 19) | func (f *fakeSetter) Add(ctx context.Context, args ...string) error {
method TryAdd (line 23) | func (f *fakeSetter) TryAdd(ctx context.Context, args ...string) error {
method Commit (line 27) | func (f *fakeSetter) Commit(ctx context.Context, msg string) error {
method TryCommit (line 31) | func (f *fakeSetter) TryCommit(ctx context.Context, msg string) error {
function TestWrite (line 35) | func TestWrite(t *testing.T) {
function TestNew (line 44) | func TestNew(t *testing.T) {
FILE: internal/cui/actions.go
type Action (line 11) | type Action struct
type Actions (line 17) | type Actions
method Selection (line 20) | func (ca Actions) Selection() []string {
method Run (line 30) | func (ca Actions) Run(ctx context.Context, c *cli.Context, i int) error {
FILE: internal/cui/actions_test.go
function TestCreateActions (line 13) | func TestCreateActions(t *testing.T) {
FILE: internal/cui/cui.go
function GetSelection (line 17) | func GetSelection(ctx context.Context, prompt string, choices []string) ...
FILE: internal/cui/cui_test.go
function TestGetSelection (line 11) | func TestGetSelection(t *testing.T) {
FILE: internal/cui/recipients.go
constant maxTries (line 27) | maxTries = 42
function AskForPrivateKey (line 31) | func AskForPrivateKey(ctx context.Context, crypto backend.Crypto, prompt...
function AskForGitConfigUser (line 91) | func AskForGitConfigUser(ctx context.Context, crypto backend.Crypto) (st...
type mountPointer (line 145) | type mountPointer interface
function sorted (line 149) | func sorted(s []string) []string {
function AskForStore (line 156) | func AskForStore(ctx context.Context, s mountPointer) string {
FILE: internal/cui/recipients_test.go
function TestAskForPrivateKey (line 16) | func TestAskForPrivateKey(t *testing.T) {
function TestAskForGitConfigUser (line 32) | func TestAskForGitConfigUser(t *testing.T) {
type fakeMountPointer (line 45) | type fakeMountPointer
method MountPoints (line 47) | func (f fakeMountPointer) MountPoints() []string {
function TestAskForStore (line 51) | func TestAskForStore(t *testing.T) {
function TestSorted (line 73) | func TestSorted(t *testing.T) {
FILE: internal/diff/diff.go
function Stat (line 6) | func Stat[K comparable](l, r []K) (int, int) {
function List (line 14) | func List[K comparable](l, r []K) ([]K, []K) {
function listToMap (line 37) | func listToMap[K comparable](l []K) map[K]struct{} {
FILE: internal/diff/diff_test.go
function TestStat (line 9) | func TestStat(t *testing.T) {
function TestList (line 49) | func TestList(t *testing.T) {
function TestListToMap (line 83) | func TestListToMap(t *testing.T) {
FILE: internal/editor/edit_linux.go
function Path (line 15) | func Path(c *cli.Context) string {
FILE: internal/editor/edit_others.go
function Path (line 13) | func Path(c *cli.Context) string {
FILE: internal/editor/edit_others_test.go
function TestEditor (line 18) | func TestEditor(t *testing.T) {
function TestGetEditor (line 35) | func TestGetEditor(t *testing.T) {
FILE: internal/editor/edit_test.go
function TestEdit (line 14) | func TestEdit(t *testing.T) {
FILE: internal/editor/edit_windows.go
function Path (line 13) | func Path(c *cli.Context) string {
FILE: internal/editor/edit_windows_test.go
function TestEditor (line 15) | func TestEditor(t *testing.T) {
function TestGetEditor (line 31) | func TestGetEditor(t *testing.T) {
FILE: internal/editor/editor.go
function Invoke (line 33) | func Invoke(ctx context.Context, editor string, content []byte) ([]byte,...
function vimOptions (line 94) | func vimOptions(editor string) []string {
function isVim (line 127) | func isVim(editor string) bool {
function resolveEditor (line 149) | func resolveEditor(editor string) string {
FILE: internal/env/env_darwin.go
function Check (line 24) | func Check(ctx context.Context) (string, error) {
FILE: internal/env/env_others.go
function Check (line 8) | func Check(ctx context.Context) (string, error) {
FILE: internal/hashsum/hashsums.go
function MD5Hex (line 16) | func MD5Hex(in string) string {
function SHA1Hex (line 24) | func SHA1Hex(in string) string {
function SHA256Hex (line 31) | func SHA256Hex(in string) string {
function SHA512Hex (line 38) | func SHA512Hex(in string) string {
function Blake3Hex (line 45) | func Blake3Hex(in string) string {
FILE: internal/hashsum/hashsums_test.go
function TestMD5Hex (line 7) | func TestMD5Hex(t *testing.T) {
function TestSHA1Hex (line 18) | func TestSHA1Hex(t *testing.T) {
function TestSHA256Hex (line 29) | func TestSHA256Hex(t *testing.T) {
function TestSHA512Hex (line 40) | func TestSHA512Hex(t *testing.T) {
function TestBlake3Hex (line 51) | func TestBlake3Hex(t *testing.T) {
FILE: internal/hook/hook.go
type subStoreGetter (line 24) | type subStoreGetter interface
function InvokeRoot (line 29) | func InvokeRoot(ctx context.Context, hookName, secName string, s subStor...
function Invoke (line 38) | func Invoke(ctx context.Context, hook, dir string, hookArgs ...string) e...
FILE: internal/notify/icon.go
function iconURI (line 16) | func iconURI(ctx context.Context) string {
function bindataWrite (line 54) | func bindataWrite(in []byte, out io.Writer) error {
function assetLogoSmallPng (line 68) | func assetLogoSmallPng() []byte {
FILE: internal/notify/notify_darwin.go
constant terminalNotifier (line 14) | terminalNotifier string = "terminal-notifier"
constant osascript (line 15) | osascript string = "osascript"
function Notify (line 24) | func Notify(ctx context.Context, subj, msg string) error {
function osaNotification (line 39) | func osaNotification(msg string, subj string) error {
function execNotification (line 50) | func execNotification(executable string, args []string) error {
function tnNotification (line 55) | func tnNotification(ctx context.Context, msg string, subj string) error {
function executableExists (line 62) | func executableExists(executable string) (bool, error) {
FILE: internal/notify/notify_darwin_test.go
function TestDarwinNotify (line 14) | func TestDarwinNotify(t *testing.T) {
function TestLegacyNotification (line 20) | func TestLegacyNotification(t *testing.T) {
function TestLegacyTerminalNotifierNotification (line 32) | func TestLegacyTerminalNotifierNotification(t *testing.T) {
function TestNoExecutableFound (line 45) | func TestNoExecutableFound(t *testing.T) {
function mockExecLookPath (line 58) | func mockExecLookPath(_ string) (string, error) {
function mockExecLookPathTerminalNotifier (line 62) | func mockExecLookPathTerminalNotifier(command string) (string, error) {
function mockExecCommand (line 70) | func mockExecCommand(command string, args ...string) *exec.Cmd {
FILE: internal/notify/notify_dbus.go
function Notify (line 15) | func Notify(ctx context.Context, subj, msg string) error {
FILE: internal/notify/notify_others.go
function Notify (line 12) | func Notify(ctx context.Context, subj, msg string) error {
FILE: internal/notify/notify_test.go
function TestNotify (line 13) | func TestNotify(t *testing.T) {
function TestIcon (line 20) | func TestIcon(t *testing.T) {
FILE: internal/notify/notify_windows.go
function Notify (line 14) | func Notify(ctx context.Context, subj, msg string) error {
FILE: internal/out/context.go
type contextKey (line 5) | type contextKey
constant ctxKeyPrefix (line 8) | ctxKeyPrefix contextKey = iota
constant ctxKeyNewline (line 9) | ctxKeyNewline
function WithPrefix (line 13) | func WithPrefix(ctx context.Context, prefix string) context.Context {
function AddPrefix (line 19) | func AddPrefix(ctx context.Context, prefix string) context.Context {
function Prefix (line 33) | func Prefix(ctx context.Context) string {
function WithNewline (line 43) | func WithNewline(ctx context.Context, nl bool) context.Context {
function HasNewline (line 48) | func HasNewline(ctx context.Context) bool {
FILE: internal/out/context_test.go
function TestPrefix (line 10) | func TestPrefix(t *testing.T) {
function TestNewline (line 27) | func TestNewline(t *testing.T) {
FILE: internal/out/print.go
type Secret (line 26) | type Secret
method SafeStr (line 29) | func (s Secret) SafeStr() string {
function newline (line 33) | func newline(ctx context.Context) string {
function Print (line 42) | func Print(ctx context.Context, arg any) {
function Printf (line 51) | func Printf(ctx context.Context, format string, args ...any) {
function Notice (line 60) | func Notice(ctx context.Context, arg any) {
function Noticef (line 69) | func Noticef(ctx context.Context, format string, args ...any) {
function Error (line 78) | func Error(ctx context.Context, arg any) {
function Errorf (line 87) | func Errorf(ctx context.Context, format string, args ...any) {
function OK (line 96) | func OK(ctx context.Context, arg any) {
function OKf (line 105) | func OKf(ctx context.Context, format string, args ...any) {
function Warning (line 114) | func Warning(ctx context.Context, arg any) {
function Warningf (line 123) | func Warningf(ctx context.Context, format string, args ...any) {
FILE: internal/out/print_test.go
function TestPrint (line 13) | func TestPrint(t *testing.T) {
FILE: internal/pwschemes/argon2i/argon2i.go
type Params (line 43) | type Params struct
function Generate (line 60) | func Generate(password string, saltLen uint32) (string, error) {
function Validate (line 82) | func Validate(password string, hash string) (bool, error) {
function unpackHash (line 101) | func unpackHash(hash string) (*Params, []byte, []byte, error) {
FILE: internal/pwschemes/argon2i/argon2i_test.go
function TestArgon2I (line 10) | func TestArgon2I(t *testing.T) {
FILE: internal/pwschemes/argon2id/argon2id.go
type Params (line 43) | type Params struct
function Generate (line 60) | func Generate(password string, saltLen uint32) (string, error) {
function Validate (line 82) | func Validate(password string, hash string) (bool, error) {
function unpackHash (line 101) | func unpackHash(hash string) (*Params, []byte, []byte, error) {
FILE: internal/pwschemes/argon2id/argon2id_test.go
function TestArgon2ID (line 10) | func TestArgon2ID(t *testing.T) {
FILE: internal/pwschemes/bcrypt/bcrypt.go
constant cost (line 13) | cost = 12
function Generate (line 21) | func Generate(password string) (string, error) {
function Validate (line 31) | func Validate(password, hash string) error {
FILE: internal/pwschemes/bcrypt/bcrypt_test.go
function TestBcrypt (line 9) | func TestBcrypt(t *testing.T) {
FILE: internal/queue/background.go
type contextKey (line 19) | type contextKey
constant ctxKeyQueue (line 22) | ctxKeyQueue contextKey = iota
type Queuer (line 26) | type Queuer interface
function WithQueue (line 34) | func WithQueue(ctx context.Context, q *Queue) context.Context {
function GetQueue (line 40) | func GetQueue(ctx context.Context) Queuer {
type noop (line 48) | type noop struct
method Add (line 51) | func (n *noop) Add(t Task) Task {
method Close (line 56) | func (n *noop) Close(_ context.Context) error {
method Idle (line 61) | func (n *noop) Idle(_ time.Duration) error {
type Task (line 66) | type Task
type Queue (line 69) | type Queue struct
method run (line 85) | func (q *Queue) run(ctx context.Context) {
method Add (line 104) | func (q *Queue) Add(t Task) Task {
method Idle (line 114) | func (q *Queue) Idle(maxWait time.Duration) error {
method Close (line 141) | func (q *Queue) Close(ctx context.Context) error {
function New (line 75) | func New(ctx context.Context) *Queue {
FILE: internal/queue/background_test.go
function TestQueue_Add (line 9) | func TestQueue_Add(t *testing.T) {
function TestQueue_Close (line 24) | func TestQueue_Close(t *testing.T) {
function TestQueue_Idle (line 43) | func TestQueue_Idle(t *testing.T) {
function TestWithQueue (line 68) | func TestWithQueue(t *testing.T) {
function TestGetQueue (line 78) | func TestGetQueue(t *testing.T) {
FILE: internal/recipients/recipients.go
type Recipients (line 16) | type Recipients struct
method Len (line 30) | func (r *Recipients) Len() int {
method IDs (line 39) | func (r *Recipients) IDs() []string {
method Add (line 44) | func (r *Recipients) Add(key string) bool {
method Remove (line 57) | func (r *Recipients) Remove(key string) bool {
method Has (line 69) | func (r *Recipients) Has(key string) bool {
method Marshal (line 77) | func (r *Recipients) Marshal() []byte {
method Hash (line 131) | func (r *Recipients) Hash() string {
function New (line 22) | func New() *Recipients {
function Unmarshal (line 139) | func Unmarshal(buf []byte) *Recipients {
FILE: internal/recipients/recipients_test.go
function TestMarshal (line 11) | func TestMarshal(t *testing.T) {
function TestUnmarshal (line 45) | func TestUnmarshal(t *testing.T) {
function TestEndToEnd (line 91) | func TestEndToEnd(t *testing.T) {
FILE: internal/reminder/reminder.go
type Store (line 14) | type Store struct
method LastSeen (line 31) | func (s *Store) LastSeen(key string) time.Time {
method Reset (line 61) | func (s *Store) Reset(key string) error {
method Overdue (line 71) | func (s *Store) Overdue(key string) bool {
function New (line 19) | func New() (*Store, error) {
FILE: internal/reminder/reminder_test.go
function TestNew (line 11) | func TestNew(t *testing.T) {
function TestLastSeen (line 19) | func TestLastSeen(t *testing.T) {
function TestReset (line 35) | func TestReset(t *testing.T) {
function TestOverdue (line 50) | func TestOverdue(t *testing.T) {
FILE: internal/store/leaf/context.go
type contextKey (line 9) | type contextKey
constant ctxKeyFsckCheck (line 12) | ctxKeyFsckCheck contextKey = iota
constant ctxKeyFsckForce (line 13) | ctxKeyFsckForce
constant ctxKeyFsckFunc (line 14) | ctxKeyFsckFunc
constant ctxKeyFsckDecrypt (line 15) | ctxKeyFsckDecrypt
constant ctxKeyNoGitOps (line 16) | ctxKeyNoGitOps
constant ctxKeyPubkeyUpdate (line 17) | ctxKeyPubkeyUpdate
function WithFsckCheck (line 21) | func WithFsckCheck(ctx context.Context, check bool) context.Context {
function HasFsckCheck (line 27) | func HasFsckCheck(ctx context.Context) bool {
function IsFsckCheck (line 32) | func IsFsckCheck(ctx context.Context) bool {
function WithFsckForce (line 42) | func WithFsckForce(ctx context.Context, force bool) context.Context {
function HasFsckForce (line 48) | func HasFsckForce(ctx context.Context) bool {
function IsFsckForce (line 53) | func IsFsckForce(ctx context.Context) bool {
function WithFsckFunc (line 63) | func WithFsckFunc(ctx context.Context, imf store.FsckCallback) context.C...
function HasFsckFunc (line 68) | func HasFsckFunc(ctx context.Context) bool {
function GetFsckFunc (line 77) | func GetFsckFunc(ctx context.Context) store.FsckCallback {
function WithFsckDecrypt (line 90) | func WithFsckDecrypt(ctx context.Context, d bool) context.Context {
function IsFsckDecrypt (line 96) | func IsFsckDecrypt(ctx context.Context) bool {
function WithNoGitOps (line 102) | func WithNoGitOps(ctx context.Context, d bool) context.Context {
function IsNoGitOps (line 108) | func IsNoGitOps(ctx context.Context) bool {
function IsPubkeyUpdate (line 114) | func IsPubkeyUpdate(ctx context.Context) bool {
function WithPubkeyUpdate (line 120) | func WithPubkeyUpdate(ctx context.Context, d bool) context.Context {
function hasBool (line 126) | func hasBool(ctx context.Context, key contextKey) bool {
function is (line 134) | func is(ctx context.Context, key contextKey, def bool) bool {
FILE: internal/store/leaf/context_test.go
function TestFsckCheck (line 11) | func TestFsckCheck(t *testing.T) {
function TestFsckForce (line 22) | func TestFsckForce(t *testing.T) {
function TestFsckFunc (line 33) | func TestFsckFunc(t *testing.T) {
FILE: internal/store/leaf/convert.go
method Convert (line 26) | func (s *Store) Convert(ctx context.Context, cryptoBe backend.CryptoBack...
FILE: internal/store/leaf/crypto.go
method initCryptoBackend (line 19) | func (s *Store) initCryptoBackend(ctx context.Context) error {
method Crypto (line 30) | func (s *Store) Crypto() backend.Crypto {
method recipientCheck (line 36) | func (s *Store) recipientCheck(ctx context.Context, r string) bool {
method ImportMissingPublicKeys (line 97) | func (s *Store) ImportMissingPublicKeys(ctx context.Context, newrs ...st...
method decodePublicKey (line 148) | func (s *Store) decodePublicKey(ctx context.Context, r string) ([]string...
method exportPublicKey (line 168) | func (s *Store) exportPublicKey(ctx context.Context, exp keyExporter, r ...
type keyImporter (line 200) | type keyImporter interface
type keyExporter (line 203) | type keyExporter interface
method getPublicKey (line 207) | func (s *Store) getPublicKey(ctx context.Context, r string) ([]byte, err...
method importPublicKey (line 224) | func (s *Store) importPublicKey(ctx context.Context, r string) error {
type locker (line 240) | type locker interface
method Lock (line 245) | func (s *Store) Lock() error {
FILE: internal/store/leaf/crypto_test.go
function TestGPG (line 13) | func TestGPG(t *testing.T) {
FILE: internal/store/leaf/fsck.go
type ErrorSeverity (line 23) | type ErrorSeverity
method String (line 31) | func (e ErrorSeverity) String() string {
constant errsNil (line 26) | errsNil ErrorSeverity = iota
constant errsNonFatal (line 27) | errsNonFatal
constant errsFatal (line 28) | errsFatal
type fsckMultiError (line 44) | type fsckMultiError struct
method IsError (line 49) | func (f *fsckMultiError) IsError() bool {
method Error (line 53) | func (f *fsckMultiError) Error() string {
method Append (line 69) | func (f *fsckMultiError) Append(s ErrorSeverity, e error) *fsckMultiEr...
method ErrorOrNil (line 86) | func (f *fsckMultiError) ErrorOrNil() error {
method Fsck (line 95) | func (s *Store) Fsck(ctx context.Context, path string) error {
method fsckLoop (line 143) | func (s *Store) fsckLoop(ctx context.Context, path string) error {
method fsckUpdatePublicKeys (line 220) | func (s *Store) fsckUpdatePublicKeys(ctx context.Context) error {
type convertedSecret (line 241) | type convertedSecret interface
method fsckCheckEntry (line 246) | func (s *Store) fsckCheckEntry(ctx context.Context, name string) (string...
method fsckCheckRecipients (line 314) | func (s *Store) fsckCheckRecipients(ctx context.Context, name string) *f...
function fingerprints (line 357) | func fingerprints(ctx context.Context, crypto backend.Crypto, in []strin...
function compareStringSlices (line 366) | func compareStringSlices(want, have []string) ([]string, []string) {
FILE: internal/store/leaf/fsck_test.go
function TestFsck (line 18) | func TestFsck(t *testing.T) {
function TestCompareStringSlices (line 54) | func TestCompareStringSlices(t *testing.T) {
FILE: internal/store/leaf/init.go
method IsInitialized (line 14) | func (s *Store) IsInitialized(ctx context.Context) bool {
method Init (line 26) | func (s *Store) Init(ctx context.Context, path string, ids ...string) er...
FILE: internal/store/leaf/init_test.go
function TestInit (line 10) | func TestInit(t *testing.T) {
FILE: internal/store/leaf/link.go
method Link (line 14) | func (s *Store) Link(ctx context.Context, from, to string) error {
FILE: internal/store/leaf/link_test.go
function TestLink (line 12) | func TestLink(t *testing.T) {
FILE: internal/store/leaf/list.go
method List (line 14) | func (s *Store) List(ctx context.Context, prefix string) ([]string, erro...
FILE: internal/store/leaf/list_test.go
function TestList (line 18) | func TestList(t *testing.T) {
FILE: internal/store/leaf/move.go
method Copy (line 21) | func (s *Store) Copy(ctx context.Context, from, to string) error {
method Move (line 56) | func (s *Store) Move(ctx context.Context, from, to string) error {
method directMove (line 92) | func (s *Store) directMove(ctx context.Context, from, to string, del boo...
method Delete (line 141) | func (s *Store) Delete(ctx context.Context, name string) error {
method Prune (line 146) | func (s *Store) Prune(ctx context.Context, tree string) error {
method delete (line 152) | func (s *Store) delete(ctx context.Context, name string, recurse bool) e...
method deleteRecurse (line 194) | func (s *Store) deleteRecurse(ctx context.Context, name, path string) er...
method deleteSingle (line 216) | func (s *Store) deleteSingle(ctx context.Context, path string) error {
FILE: internal/store/leaf/move_test.go
function TestCopy (line 18) | func TestCopy(t *testing.T) {
function TestMove (line 100) | func TestMove(t *testing.T) {
function TestDelete (line 183) | func TestDelete(t *testing.T) {
function TestPrune (line 248) | func TestPrune(t *testing.T) {
FILE: internal/store/leaf/rcs.go
method GitInit (line 16) | func (s *Store) GitInit(ctx context.Context) error {
method ListRevisions (line 27) | func (s *Store) ListRevisions(ctx context.Context, name string) ([]backe...
method GetRevision (line 34) | func (s *Store) GetRevision(ctx context.Context, name, revision string) ...
method GitStatus (line 57) | func (s *Store) GitStatus(ctx context.Context, _ string) error {
FILE: internal/store/leaf/rcs_test.go
function TestGit (line 13) | func TestGit(t *testing.T) {
function TestGitRevisions (line 36) | func TestGitRevisions(t *testing.T) {
FILE: internal/store/leaf/read.go
method Get (line 16) | func (s *Store) Get(ctx context.Context, name string) (gopass.Secret, er...
FILE: internal/store/leaf/recipients.go
constant keyDir (line 23) | keyDir = ".public-keys"
constant oldKeyDir (line 24) | oldKeyDir = ".gpg-keys"
type InvalidRecipientsError (line 32) | type InvalidRecipientsError struct
method Error (line 36) | func (e InvalidRecipientsError) Error() string {
method IsError (line 51) | func (e InvalidRecipientsError) IsError() bool {
method Recipients (line 56) | func (s *Store) Recipients(ctx context.Context) []string {
method RecipientsTree (line 70) | func (s *Store) RecipientsTree(ctx context.Context) map[string][]string {
method AllRecipients (line 102) | func (s *Store) AllRecipients(ctx context.Context) *recipients.Recipients {
method CheckRecipients (line 114) | func (s *Store) CheckRecipients(ctx context.Context) error {
method AddRecipient (line 150) | func (s *Store) AddRecipient(ctx context.Context, id string) error {
method SaveRecipients (line 185) | func (s *Store) SaveRecipients(ctx context.Context, ack bool) error {
method SetRecipients (line 197) | func (s *Store) SetRecipients(ctx context.Context, rs *recipients.Recipi...
method RemoveRecipient (line 204) | func (s *Store) RemoveRecipient(ctx context.Context, key string) error {
method ensureOurKeyID (line 266) | func (s *Store) ensureOurKeyID(ctx context.Context, recp []string) []str...
method OurKeyID (line 288) | func (s *Store) OurKeyID(ctx context.Context) string {
method GetRecipients (line 306) | func (s *Store) GetRecipients(ctx context.Context, name string) (*recipi...
method getRecipients (line 310) | func (s *Store) getRecipients(ctx context.Context, idf string) (*recipie...
method UpdateExportedPublicKeys (line 336) | func (s *Store) UpdateExportedPublicKeys(ctx context.Context) (bool, err...
method addMissingKeys (line 376) | func (s *Store) addMissingKeys(ctx context.Context, exp keyExporter, rec...
function extraKeys (line 408) | func extraKeys(recipients map[string]bool, keys []string) []string {
method removeExtraKeys (line 426) | func (s *Store) removeExtraKeys(ctx context.Context, recipients map[stri...
type recipientMarshaler (line 460) | type recipientMarshaler interface
method saveRecipients (line 467) | func (s *Store) saveRecipients(ctx context.Context, rs recipientMarshale...
method rhKey (line 542) | func (s *Store) rhKey() string {
FILE: internal/store/leaf/recipients_test.go
function TestGetRecipientsDefault (line 25) | func TestGetRecipientsDefault(t *testing.T) {
function TestGetRecipientsSubID (line 58) | func TestGetRecipientsSubID(t *testing.T) {
function TestSaveRecipients (line 94) | func TestSaveRecipients(t *testing.T) {
function TestAddRecipient (line 153) | func TestAddRecipient(t *testing.T) {
function TestRemoveRecipient (line 192) | func TestRemoveRecipient(t *testing.T) {
function TestListRecipients (line 226) | func TestListRecipients(t *testing.T) {
function TestCheckRecipients (line 259) | func TestCheckRecipients(t *testing.T) {
function TestExtraKeys (line 286) | func TestExtraKeys(t *testing.T) {
FILE: internal/store/leaf/reencrypt.go
method reencrypt (line 22) | func (s *Store) reencrypt(ctx context.Context) error {
method reencryptGitPush (line 118) | func (s *Store) reencryptGitPush(ctx context.Context) error {
FILE: internal/store/leaf/storage.go
method initStorageBackend (line 11) | func (s *Store) initStorageBackend(ctx context.Context) error {
FILE: internal/store/leaf/store.go
type Store (line 19) | type Store struct
method idFile (line 83) | func (s *Store) idFile(ctx context.Context, name string) string {
method idFiles (line 114) | func (s *Store) idFiles(ctx context.Context) []string {
method Equals (line 143) | func (s *Store) Equals(other *Store) bool {
method IsDir (line 152) | func (s *Store) IsDir(ctx context.Context, name string) bool {
method Exists (line 157) | func (s *Store) Exists(ctx context.Context, name string) bool {
method useableKeys (line 161) | func (s *Store) useableKeys(ctx context.Context, name string) ([]strin...
method Passfile (line 187) | func (s *Store) Passfile(name string) string {
method String (line 192) | func (s *Store) String() string {
method Path (line 197) | func (s *Store) Path() string {
method Alias (line 202) | func (s *Store) Alias() string {
method Storage (line 207) | func (s *Store) Storage() backend.Storage {
method Valid (line 212) | func (s *Store) Valid() bool {
method Concurrency (line 218) | func (s *Store) Concurrency() int {
function Init (line 27) | func Init(ctx context.Context, alias, path string) (*Store, error) {
function New (line 55) | func New(ctx context.Context, alias, path string) (*Store, error) {
FILE: internal/store/leaf/store_test.go
function createSubStore (line 21) | func createSubStore(t *testing.T) (*Store, error) {
function createStore (line 55) | func createStore(dir string, recipients, entries []string) ([]string, []...
function TestStore (line 88) | func TestStore(t *testing.T) {
function TestIdFile (line 97) | func TestIdFile(t *testing.T) {
function TestNew (line 129) | func TestNew(t *testing.T) {
FILE: internal/store/leaf/templates.go
constant TemplateFile (line 20) | TemplateFile = ".pass-template"
method LookupTemplate (line 24) | func (s *Store) LookupTemplate(ctx context.Context, name string) (string...
method ListTemplates (line 51) | func (s *Store) ListTemplates(ctx context.Context, prefix string) []stri...
method TemplateTree (line 87) | func (s *Store) TemplateTree(ctx context.Context) *tree.Root {
method templatefile (line 100) | func (s *Store) templatefile(name string) string {
method HasTemplate (line 105) | func (s *Store) HasTemplate(ctx context.Context, name string) bool {
method GetTemplate (line 110) | func (s *Store) GetTemplate(ctx context.Context, name string) ([]byte, e...
method SetTemplate (line 115) | func (s *Store) SetTemplate(ctx context.Context, name string, content []...
method RemoveTemplate (line 138) | func (s *Store) RemoveTemplate(ctx context.Context, name string) error {
FILE: internal/store/leaf/templates_test.go
function TestTemplates (line 13) | func TestTemplates(t *testing.T) {
FILE: internal/store/leaf/write.go
method Set (line 17) | func (s *Store) Set(ctx context.Context, name string, sec gopass.Byter) ...
method gitCommitAndPush (line 80) | func (s *Store) gitCommitAndPush(ctx context.Context, name string) error {
FILE: internal/store/leaf/write_test.go
function TestSet (line 13) | func TestSet(t *testing.T) {
FILE: internal/store/mockstore/inmem/store.go
type InMem (line 17) | type InMem struct
method Get (line 30) | func (m *InMem) Get(ctx context.Context, name string) ([]byte, error) {
method Set (line 49) | func (m *InMem) Set(ctx context.Context, name string, value []byte) er...
method Delete (line 59) | func (m *InMem) Delete(ctx context.Context, name string) error {
method Exists (line 69) | func (m *InMem) Exists(ctx context.Context, name string) bool {
method List (line 79) | func (m *InMem) List(ctx context.Context, prefix string) ([]string, er...
method IsDir (line 87) | func (m *InMem) IsDir(ctx context.Context, name string) bool {
method Prune (line 101) | func (m *InMem) Prune(ctx context.Context, prefix string) error {
method Name (line 122) | func (m *InMem) Name() string {
method Version (line 127) | func (m *InMem) Version(context.Context) semver.Version {
method String (line 132) | func (m *InMem) String() string {
method Path (line 137) | func (m *InMem) Path() string {
method Fsck (line 142) | func (m *InMem) Fsck(ctx context.Context) error {
method Add (line 147) | func (m *InMem) Add(ctx context.Context, args ...string) error {
method TryAdd (line 152) | func (m *InMem) TryAdd(ctx context.Context, args ...string) error {
method Commit (line 157) | func (m *InMem) Commit(ctx context.Context, msg string) error {
method TryCommit (line 162) | func (m *InMem) TryCommit(ctx context.Context, msg string) error {
method Push (line 167) | func (m *InMem) Push(ctx context.Context, origin, branch string) error {
method TryPush (line 172) | func (m *InMem) TryPush(ctx context.Context, origin, branch string) er...
method Pull (line 177) | func (m *InMem) Pull(ctx context.Context, origin, branch string) error {
method Cmd (line 182) | func (m *InMem) Cmd(ctx context.Context, name string, args ...string) ...
method Init (line 187) | func (m *InMem) Init(context.Context, string, string) error {
method InitConfig (line 192) | func (m *InMem) InitConfig(context.Context, string, string) error {
method AddRemote (line 197) | func (m *InMem) AddRemote(ctx context.Context, remote, url string) err...
method RemoveRemote (line 202) | func (m *InMem) RemoveRemote(ctx context.Context, remote string) error {
method Revisions (line 207) | func (m *InMem) Revisions(context.Context, string) ([]backend.Revision...
method GetRevision (line 217) | func (m *InMem) GetRevision(context.Context, string, string) ([]byte, ...
method Status (line 222) | func (m *InMem) Status(context.Context) ([]byte, error) {
method Compact (line 227) | func (m *InMem) Compact(context.Context) error {
method Link (line 232) | func (m *InMem) Link(context.Context, string, string) error {
method Move (line 237) | func (m *InMem) Move(context.Context, string, string, bool) error {
function New (line 23) | func New() *InMem {
FILE: internal/store/mockstore/store.go
type MockStore (line 19) | type MockStore struct
method String (line 33) | func (m *MockStore) String() string {
method GetTemplate (line 38) | func (m *MockStore) GetTemplate(context.Context, string) ([]byte, erro...
method HasTemplate (line 43) | func (m *MockStore) HasTemplate(context.Context, string) bool {
method ListTemplates (line 48) | func (m *MockStore) ListTemplates(context.Context, string) []string {
method LookupTemplate (line 53) | func (m *MockStore) LookupTemplate(context.Context, string) ([]byte, b...
method RemoveTemplate (line 58) | func (m *MockStore) RemoveTemplate(context.Context, string) error {
method SetTemplate (line 63) | func (m *MockStore) SetTemplate(context.Context, string, []byte) error {
method TemplateTree (line 68) | func (m *MockStore) TemplateTree(context.Context) (*tree.Root, error) {
method AddRecipient (line 73) | func (m *MockStore) AddRecipient(context.Context, string) error {
method GetRecipients (line 78) | func (m *MockStore) GetRecipients(context.Context, string) ([]string, ...
method RemoveRecipient (line 83) | func (m *MockStore) RemoveRecipient(context.Context, string) error {
method SaveRecipients (line 88) | func (m *MockStore) SaveRecipients(context.Context) error {
method Recipients (line 93) | func (m *MockStore) Recipients(context.Context) []string {
method ImportMissingPublicKeys (line 98) | func (m *MockStore) ImportMissingPublicKeys(context.Context) error {
method ExportMissingPublicKeys (line 103) | func (m *MockStore) ExportMissingPublicKeys(context.Context, []string)...
method Fsck (line 108) | func (m *MockStore) Fsck(context.Context, string) error {
method Path (line 113) | func (m *MockStore) Path() string {
method URL (line 118) | func (m *MockStore) URL() string {
method Crypto (line 123) | func (m *MockStore) Crypto() backend.Crypto {
method Storage (line 128) | func (m *MockStore) Storage() backend.Storage {
method GitInit (line 133) | func (m *MockStore) GitInit(context.Context, string, string) error {
method Alias (line 138) | func (m *MockStore) Alias() string {
method Copy (line 143) | func (m *MockStore) Copy(ctx context.Context, from string, to string) ...
method Delete (line 153) | func (m *MockStore) Delete(ctx context.Context, name string) error {
method Equals (line 158) | func (m *MockStore) Equals(other *MockStore) bool {
method Exists (line 163) | func (m *MockStore) Exists(ctx context.Context, name string) bool {
method Get (line 168) | func (m *MockStore) Get(ctx context.Context, name string) (gopass.Secr...
method GetRevision (line 178) | func (m *MockStore) GetRevision(context.Context, string, string) (gopa...
method Init (line 183) | func (m *MockStore) Init(context.Context, string, ...string) error {
method Initialized (line 188) | func (m *MockStore) Initialized(context.Context) bool {
method IsDir (line 193) | func (m *MockStore) IsDir(ctx context.Context, name string) bool {
method List (line 198) | func (m *MockStore) List(ctx context.Context, name string) ([]string, ...
method ListRevisions (line 203) | func (m *MockStore) ListRevisions(context.Context, string) ([]backend....
method Move (line 208) | func (m *MockStore) Move(ctx context.Context, from string, to string) ...
method Set (line 216) | func (m *MockStore) Set(ctx context.Context, name string, sec gopass.B...
method Prune (line 221) | func (m *MockStore) Prune(context.Context, string) error {
method Valid (line 226) | func (m *MockStore) Valid() bool {
method MountPoints (line 231) | func (m *MockStore) MountPoints() []string {
method Link (line 236) | func (m *MockStore) Link(context.Context, string, string) error {
function New (line 25) | func New(alias string) *MockStore {
FILE: internal/store/mockstore/store_test.go
function TestMockStore (line 11) | func TestMockStore(t *testing.T) {
FILE: internal/store/root/convert.go
method Convert (line 13) | func (r *Store) Convert(ctx context.Context, name string, cryptoBe backe...
FILE: internal/store/root/crypto.go
method Crypto (line 11) | func (r *Store) Crypto(ctx context.Context, name string) backend.Crypto {
FILE: internal/store/root/crypto_test.go
function TestCrypto (line 14) | func TestCrypto(t *testing.T) {
FILE: internal/store/root/errors.go
type AlreadyMountedError (line 7) | type AlreadyMountedError
method Error (line 9) | func (a AlreadyMountedError) Error() string {
type NotInitializedError (line 16) | type NotInitializedError struct
method Alias (line 22) | func (n NotInitializedError) Alias() string { return n.alias }
method Path (line 25) | func (n NotInitializedError) Path() string { return n.path }
method Error (line 27) | func (n NotInitializedError) Error() string {
FILE: internal/store/root/fsck.go
method Fsck (line 13) | func (r *Store) Fsck(ctx context.Context, store, path string) error {
FILE: internal/store/root/fsck_test.go
function TestFsck (line 12) | func TestFsck(t *testing.T) {
FILE: internal/store/root/init.go
method IsInitialized (line 16) | func (r *Store) IsInitialized(ctx context.Context) (bool, error) {
method Init (line 31) | func (r *Store) Init(ctx context.Context, alias, path string, ids ...str...
method initialize (line 69) | func (r *Store) initialize(ctx context.Context) error {
FILE: internal/store/root/init_test.go
function TestInit (line 14) | func TestInit(t *testing.T) {
FILE: internal/store/root/link.go
method Link (line 9) | func (r *Store) Link(ctx context.Context, from, to string) error {
FILE: internal/store/root/list.go
method List (line 16) | func (r *Store) List(ctx context.Context, maxDepth int) ([]string, error) {
method Tree (line 26) | func (r *Store) Tree(ctx context.Context) (*tree.Root, error) {
method HasSubDirs (line 97) | func (r *Store) HasSubDirs(ctx context.Context, name string) (bool, erro...
method Format (line 115) | func (r *Store) Format(ctx context.Context, maxDepth int) (string, error) {
FILE: internal/store/root/list_test.go
function TestList (line 15) | func TestList(t *testing.T) {
FILE: internal/store/root/mount.go
method AddMount (line 18) | func (r *Store) AddMount(ctx context.Context, alias, path string, keys ....
method addMount (line 27) | func (r *Store) addMount(ctx context.Context, alias, path string, keys ....
method initSub (line 69) | func (r *Store) initSub(ctx context.Context, alias, path string, keys []...
method RemoveMount (line 105) | func (r *Store) RemoveMount(ctx context.Context, alias string) error {
method Mounts (line 123) | func (r *Store) Mounts() map[string]string {
method MountPoints (line 135) | func (r *Store) MountPoints() []string {
method MountPoint (line 147) | func (r *Store) MountPoint(name string) string {
method Lock (line 159) | func (r *Store) Lock() error {
method getStore (line 171) | func (r *Store) getStore(name string) (*leaf.Store, string) {
method GetSubStore (line 184) | func (r *Store) GetSubStore(name string) (*leaf.Store, error) {
method checkMounts (line 200) | func (r *Store) checkMounts() error {
function CleanMountAlias (line 215) | func CleanMountAlias(alias string) string {
FILE: internal/store/root/mount_test.go
function TestMount (line 14) | func TestMount(t *testing.T) {
function TestMountPoint (line 39) | func TestMountPoint(t *testing.T) {
function TestMountPointIllegal (line 57) | func TestMountPointIllegal(t *testing.T) {
function TestCleanMountAlias (line 77) | func TestCleanMountAlias(t *testing.T) {
FILE: internal/store/root/move.go
method Copy (line 23) | func (r *Store) Copy(ctx context.Context, from, to string) error {
method Move (line 33) | func (r *Store) Move(ctx context.Context, from, to string) error {
method move (line 41) | func (r *Store) move(ctx context.Context, from, to string, del bool) err...
method moveFromTo (line 79) | func (r *Store) moveFromTo(ctx context.Context, subFrom *leaf.Store, fro...
method directMove (line 162) | func (r *Store) directMove(ctx context.Context, from, to string, del boo...
function computeMoveDestination (line 209) | func computeMoveDestination(src, from, to string, srcIsDir, dstIsDir boo...
method Delete (line 249) | func (r *Store) Delete(ctx context.Context, name string) error {
method Prune (line 259) | func (r *Store) Prune(ctx context.Context, tree string) error {
FILE: internal/store/root/move_test.go
function TestMoveShadow (line 15) | func TestMoveShadow(t *testing.T) {
function TestMove (line 51) | func TestMove(t *testing.T) {
function TestUnixMvSemantics (line 146) | func TestUnixMvSemantics(t *testing.T) {
function TestRegression2079 (line 183) | func TestRegression2079(t *testing.T) {
function TestCopy (line 220) | func TestCopy(t *testing.T) {
function TestMoveSelf (line 301) | func TestMoveSelf(t *testing.T) {
function TestComputeMoveDestination (line 337) | func TestComputeMoveDestination(t *testing.T) {
function TestRegression892 (line 419) | func TestRegression892(t *testing.T) {
function TestMoveInMountedStore (line 456) | func TestMoveInMountedStore(t *testing.T) {
FILE: internal/store/root/rcs.go
method RCSInit (line 14) | func (r *Store) RCSInit(ctx context.Context, name, userName, userEmail s...
method RCSInitConfig (line 23) | func (r *Store) RCSInitConfig(ctx context.Context, name, userName, userE...
method RCSAddRemote (line 30) | func (r *Store) RCSAddRemote(ctx context.Context, name, remote, url stri...
method RCSRemoveRemote (line 37) | func (r *Store) RCSRemoveRemote(ctx context.Context, name, remote string...
method RCSPull (line 44) | func (r *Store) RCSPull(ctx context.Context, name, origin, remote string...
method RCSPush (line 51) | func (r *Store) RCSPush(ctx context.Context, name, origin, remote string...
method ListRevisions (line 58) | func (r *Store) ListRevisions(ctx context.Context, name string) ([]backe...
method GetRevision (line 65) | func (r *Store) GetRevision(ctx context.Context, name, revision string) ...
method RCSStatus (line 83) | func (r *Store) RCSStatus(ctx context.Context, name string) error {
FILE: internal/store/root/rcs_test.go
function TestRCS (line 14) | func TestRCS(t *testing.T) {
FILE: internal/store/root/read.go
method Get (line 12) | func (r *Store) Get(ctx context.Context, name string) (gopass.Secret, er...
FILE: internal/store/root/read_test.go
function TestGet (line 12) | func TestGet(t *testing.T) {
FILE: internal/store/root/recipients.go
method ListRecipients (line 17) | func (r *Store) ListRecipients(ctx context.Context, store string) []stri...
method CheckRecipients (line 25) | func (r *Store) CheckRecipients(ctx context.Context, store string) error {
method AddRecipient (line 32) | func (r *Store) AddRecipient(ctx context.Context, store, rec string) err...
method RemoveRecipient (line 39) | func (r *Store) RemoveRecipient(ctx context.Context, store, rec string) ...
method addRecipient (line 45) | func (r *Store) addRecipient(ctx context.Context, prefix string, root *t...
method ImportMissingPublicKeys (line 72) | func (r *Store) ImportMissingPublicKeys(ctx context.Context) error {
method SaveRecipients (line 84) | func (r *Store) SaveRecipients(ctx context.Context, ack bool) error {
method RecipientsTree (line 95) | func (r *Store) RecipientsTree(ctx context.Context, pretty bool) (*tree....
FILE: internal/store/root/recipients_test.go
function TestRecipients (line 14) | func TestRecipients(t *testing.T) {
FILE: internal/store/root/store.go
type Store (line 22) | type Store struct
method WithStoreConfig (line 45) | func (r *Store) WithStoreConfig(ctx context.Context) context.Context {
method Exists (line 50) | func (r *Store) Exists(ctx context.Context, name string) bool {
method IsDir (line 57) | func (r *Store) IsDir(ctx context.Context, name string) bool {
method String (line 63) | func (r *Store) String() string {
method Path (line 78) | func (r *Store) Path() string {
method Alias (line 87) | func (r *Store) Alias() string {
method Storage (line 92) | func (r *Store) Storage(ctx context.Context, name string) backend.Stor...
method Concurrency (line 105) | func (r *Store) Concurrency() int {
function New (line 29) | func New(cfg *config.Config) *Store {
FILE: internal/store/root/store_test.go
function TestSimpleList (line 19) | func TestSimpleList(t *testing.T) {
function TestListMulti (line 32) | func TestListMulti(t *testing.T) {
function TestListNested (line 75) | func TestListNested(t *testing.T) {
function createRootStore (line 129) | func createRootStore(ctx context.Context, u *gptest.Unit) (*Store, error) {
FILE: internal/store/root/templates.go
method LookupTemplate (line 16) | func (r *Store) LookupTemplate(ctx context.Context, name string) (string...
method TemplateTree (line 26) | func (r *Store) TemplateTree(ctx context.Context) (*tree.Root, error) {
method HasTemplate (line 63) | func (r *Store) HasTemplate(ctx context.Context, name string) bool {
method GetTemplate (line 70) | func (r *Store) GetTemplate(ctx context.Context, name string) ([]byte, e...
method SetTemplate (line 77) | func (r *Store) SetTemplate(ctx context.Context, name string, content []...
method RemoveTemplate (line 84) | func (r *Store) RemoveTemplate(ctx context.Context, name string) error {
FILE: internal/store/root/templates_test.go
function TestTemplate (line 14) | func TestTemplate(t *testing.T) {
FILE: internal/store/root/write.go
method Set (line 10) | func (r *Store) Set(ctx context.Context, name string, sec gopass.Byter) ...
FILE: internal/store/root/write_test.go
function TestSet (line 13) | func TestSet(t *testing.T) {
FILE: internal/store/sort.go
type ByPathLen (line 6) | type ByPathLen
method Len (line 8) | func (s ByPathLen) Len() int { return len(s) }
method Less (line 10) | func (s ByPathLen) Less(i, j int) bool {
method Swap (line 14) | func (s ByPathLen) Swap(i, j int) {
type ByLen (line 19) | type ByLen
method Len (line 22) | func (s ByLen) Len() int { return len(s) }
method Less (line 25) | func (s ByLen) Less(i, j int) bool { return len(s[i]) > len(s[j]) }
method Swap (line 28) | func (s ByLen) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
FILE: internal/store/sort_test.go
function TestMountPointSort (line 8) | func TestMountPointSort(t *testing.T) {
function TestMountPointReverseSort (line 32) | func TestMountPointReverseSort(t *testing.T) {
function TestSortByLen (line 56) | func TestSortByLen(t *testing.T) {
FILE: internal/store/store.go
type RecipientCallback (line 10) | type RecipientCallback
type ImportCallback (line 14) | type ImportCallback
type FsckCallback (line 18) | type FsckCallback
FILE: internal/tpl/funcs.go
constant FuncMd5sum (line 25) | FuncMd5sum = "md5sum"
constant FuncSha1sum (line 26) | FuncSha1sum = "sha1sum"
constant FuncSha256sum (line 27) | FuncSha256sum = "sha256sum"
constant FuncSha512sum (line 28) | FuncSha512sum = "sha512sum"
constant FuncBlake3 (line 29) | FuncBlake3 = "blake3"
constant FuncMd5Crypt (line 30) | FuncMd5Crypt = "md5crypt"
constant FuncSSHA (line 31) | FuncSSHA = "ssha"
constant FuncSSHA256 (line 32) | FuncSSHA256 = "ssha256"
constant FuncSSHA512 (line 33) | FuncSSHA512 = "ssha512"
constant FuncGet (line 34) | FuncGet = "get"
constant FuncGetPassword (line 35) | FuncGetPassword = "getpw"
constant FuncGetValue (line 36) | FuncGetValue = "getval"
constant FuncGetValues (line 37) | FuncGetValues = "getvals"
constant FuncArgon2i (line 38) | FuncArgon2i = "argon2i"
constant FuncArgon2id (line 39) | FuncArgon2id = "argon2id"
constant FuncBcrypt (line 40) | FuncBcrypt = "bcrypt"
constant FuncJoin (line 41) | FuncJoin = "join"
constant FuncRoundDuration (line 42) | FuncRoundDuration = "roundDuration"
constant FuncDate (line 43) | FuncDate = "date"
constant FuncTruncate (line 44) | FuncTruncate = "truncate"
function md5sum (line 47) | func md5sum() func(...string) (string, error) {
function sha1sum (line 53) | func sha1sum() func(...string) (string, error) {
function sha256sum (line 59) | func sha256sum() func(...string) (string, error) {
function sha512sum (line 65) | func sha512sum() func(...string) (string, error) {
function blake3sum (line 71) | func blake3sum() func(...string) (string, error) {
function saltLen (line 78) | func saltLen(s []string) uint8 {
function md5cryptFunc (line 99) | func md5cryptFunc() func(...string) (string, error) {
function sshaFunc (line 115) | func sshaFunc() func(...string) (string, error) {
function ssha256Func (line 126) | func ssha256Func() func(...string) (string, error) {
function ssha512Func (line 137) | func ssha512Func() func(...string) (string, error) {
function argon2iFunc (line 148) | func argon2iFunc() func(...string) (string, error) {
function argon2idFunc (line 159) | func argon2idFunc() func(...string) (string, error) {
function bcryptFunc (line 170) | func bcryptFunc() func(...string) (string, error) {
function get (line 181) | func get(ctx context.Context, kv kvstore) func(...string) (string, error) {
function getPassword (line 200) | func getPassword(ctx context.Context, kv kvstore) func(...string) (strin...
function getValue (line 219) | func getValue(ctx context.Context, kv kvstore) func(...string) (string, ...
function getValues (line 243) | func getValues(ctx context.Context, kv kvstore) func(...string) ([]strin...
function roundDuration (line 267) | func roundDuration(duration any) string {
function date (line 308) | func date(ts time.Time) string {
function truncate (line 312) | func truncate(length int, v any) string {
function join (line 322) | func join(sep string, v any) string {
function stringslice (line 326) | func stringslice(v any) []string {
function strval (line 365) | func strval(v any) string {
function funcMap (line 380) | func funcMap(ctx context.Context, kv kvstore) template.FuncMap {
function PublicFuncMap (line 406) | func PublicFuncMap() template.FuncMap {
FILE: internal/tpl/funcs_test.go
function TestMd5sum (line 13) | func TestMd5sum(t *testing.T) {
function TestSha1sum (line 19) | func TestSha1sum(t *testing.T) {
function TestSha256sum (line 25) | func TestSha256sum(t *testing.T) {
function TestSha512sum (line 31) | func TestSha512sum(t *testing.T) {
function TestBlake3sum (line 37) | func TestBlake3sum(t *testing.T) {
function TestMd5cryptFunc (line 43) | func TestMd5cryptFunc(t *testing.T) {
function TestSshaFunc (line 49) | func TestSshaFunc(t *testing.T) {
function TestSsha256Func (line 55) | func TestSsha256Func(t *testing.T) {
function TestSsha512Func (line 61) | func TestSsha512Func(t *testing.T) {
function TestArgon2iFunc (line 67) | func TestArgon2iFunc(t *testing.T) {
function TestArgon2idFunc (line 73) | func TestArgon2idFunc(t *testing.T) {
function TestBcryptFunc (line 79) | func TestBcryptFunc(t *testing.T) {
function TestRoundDuration (line 85) | func TestRoundDuration(t *testing.T) {
function TestDate (line 94) | func TestDate(t *testing.T) {
function TestTruncate (line 99) | func TestTruncate(t *testing.T) {
function TestJoin (line 111) | func TestJoin(t *testing.T) {
FILE: internal/tpl/template.go
type kvstore (line 15) | type kvstore interface
type payload (line 19) | type payload struct
function Execute (line 28) | func Execute(ctx context.Context, tpl, name string, content []byte, s kv...
FILE: internal/tpl/template_test.go
function Example (line 22) | func Example() { //nolint:testableexamples
type kvMock (line 48) | type kvMock struct
method Get (line 50) | func (k kvMock) Get(ctx context.Context, key string) (gopass.Secret, e...
function TestVars (line 55) | func TestVars(t *testing.T) {
FILE: internal/tree/node.go
type Node (line 10) | type Node struct
method Equals (line 40) | func (n Node) Equals(other Node) bool {
method Merge (line 69) | func (n Node) Merge(other Node) *Node {
method format (line 121) | func (n *Node) format(prefix string, last bool, maxDepth, curDepth int...
method Len (line 176) | func (n *Node) Len() int {
method list (line 196) | func (n *Node) list(prefix string, maxDepth, curDepth int, files bool)...
constant INF (line 21) | INF = -1
type Nodes (line 25) | type Nodes
method Len (line 27) | func (n Nodes) Len() int {
method Less (line 31) | func (n Nodes) Less(i, j int) bool {
method Swap (line 35) | func (n Nodes) Swap(i, j int) {
FILE: internal/tree/node_test.go
function TestNodeEquals (line 9) | func TestNodeEquals(t *testing.T) {
function TestNodeMerge (line 18) | func TestNodeMerge(t *testing.T) {
function TestNodeFormat (line 31) | func TestNodeFormat(t *testing.T) {
function TestNodeLen (line 39) | func TestNodeLen(t *testing.T) {
function TestNodeList (line 48) | func TestNodeList(t *testing.T) {
FILE: internal/tree/root.go
constant symEmpty (line 13) | symEmpty = " "
constant symBranch (line 14) | symBranch = "├── "
constant symLeaf (line 15) | symLeaf = "└── "
constant symVert (line 16) | symVert = "│ "
type Root (line 32) | type Root struct
method AddFile (line 47) | func (r *Root) AddFile(path string, _ string) error {
method AddMount (line 52) | func (r *Root) AddMount(path, dest string) error {
method AddTemplate (line 57) | func (r *Root) AddTemplate(path string) error {
method insert (line 61) | func (r *Root) insert(path string, template bool, mountPath string) er...
method Format (line 105) | func (r *Root) Format(maxDepth int) string {
method List (line 124) | func (r *Root) List(maxDepth int) []string {
method ListFolders (line 134) | func (r *Root) ListFolders(maxDepth int) []string {
method String (line 144) | func (r *Root) String() string {
method FindFolder (line 149) | func (r *Root) FindFolder(path string) (*Root, error) {
method SetName (line 169) | func (r *Root) SetName(n string) {
method Len (line 175) | func (r *Root) Len() int {
function New (line 39) | func New(name string) *Root {
FILE: internal/tree/root_test.go
function TestRoot (line 11) | func TestRoot(t *testing.T) {
function TestMountShadow (line 58) | func TestMountShadow(t *testing.T) {
function TestAddFile (line 89) | func TestAddFile(t *testing.T) {
function TestAddTemplate (line 97) | func TestAddTemplate(t *testing.T) {
function TestAddMount (line 105) | func TestAddMount(t *testing.T) {
function TestFindFolderNotFound (line 115) | func TestFindFolderNotFound(t *testing.T) {
function TestSetName (line 124) | func TestSetName(t *testing.T) {
function TestLen (line 132) | func TestLen(t *testing.T) {
FILE: internal/tree/tree.go
type Tree (line 15) | type Tree struct
method String (line 27) | func (t *Tree) String() string {
method Equals (line 32) | func (t *Tree) Equals(other *Tree) bool {
method Insert (line 47) | func (t *Tree) Insert(other *Node) *Node {
method findPositionFor (line 65) | func (t *Tree) findPositionFor(name string) (int, *Node) {
method Sort (line 78) | func (t *Tree) Sort() {
function NewTree (line 20) | func NewTree() *Tree {
FILE: internal/tree/tree_test.go
function TestTree (line 9) | func TestTree(t *testing.T) {
function TestTreeInsert (line 24) | func TestTreeInsert(t *testing.T) {
function TestTreeString (line 36) | func TestTreeString(t *testing.T) {
function TestTreeSort (line 46) | func TestTreeSort(t *testing.T) {
function TestTreeFindPositionFor (line 61) | func TestTreeFindPositionFor(t *testing.T) {
FILE: internal/updater/access_others.go
function canWrite (line 7) | func canWrite(path string) error {
function removeOldBinary (line 11) | func removeOldBinary(dir, dest string) error {
FILE: internal/updater/access_windows.go
function canWrite (line 11) | func canWrite(path string) error {
function removeOldBinary (line 20) | func removeOldBinary(dir, dest string) error {
FILE: internal/updater/download.go
function tryDownload (line 33) | func tryDownload(ctx context.Context, url string) ([]byte, error) {
function download (line 58) | func download(ctx context.Context, url string) ([]byte, error) {
type setter (line 101) | type setter interface
type passThru (line 105) | type passThru struct
method Read (line 110) | func (pt *passThru) Read(p []byte) (int, error) {
FILE: internal/updater/extract.go
function extractFile (line 18) | func extractFile(buf []byte, filename, dest string) error {
function extractToTempFile (line 44) | func extractToTempFile(buf []byte, filename, dest string) (string, error) {
function extractZip (line 76) | func extractZip(buf []byte, dfh io.WriteCloser, dest string) (string, er...
function extractTar (line 108) | func extractTar(rd io.Reader, dfh io.WriteCloser, dest string) (string, ...
FILE: internal/updater/extract_test.go
function TestExtractFile (line 17) | func TestExtractFile(t *testing.T) {
function TestExtractToTempFile (line 45) | func TestExtractToTempFile(t *testing.T) {
FILE: internal/updater/github.go
type Asset (line 26) | type Asset struct
type Release (line 33) | type Release struct
function downloadAsset (line 44) | func downloadAsset(ctx context.Context, assets []Asset, suffix string) (...
function FetchLatestRelease (line 74) | func FetchLatestRelease(ctx context.Context) (Release, error) {
FILE: internal/updater/github_test.go
function TestFetchLatestRelease (line 12) | func TestFetchLatestRelease(t *testing.T) {
function TestDownloadAsset (line 93) | func TestDownloadAsset(t *testing.T) {
FILE: internal/updater/update.go
function Update (line 25) | func Update(ctx context.Context, currentVersion semver.Version) error {
FILE: internal/updater/update_test.go
function TestIsUpdateable (line 17) | func TestIsUpdateable(t *testing.T) {
FILE: internal/updater/updateable.go
function IsUpdateable (line 16) | func IsUpdateable(ctx context.Context) error {
FILE: internal/updater/verify.go
type krLogger (line 67) | type krLogger struct
method Str (line 71) | func (k *krLogger) Str() string {
function gpgVerify (line 84) | func gpgVerify(data, sig []byte) (bool, error) {
function gpgVerifyAt (line 88) | func gpgVerifyAt(data, sig []byte, nowFn func() time.Time) (bool, error) {
function findHashForFile (line 123) | func findHashForFile(buf []byte, filename string) ([]byte, error) {
FILE: internal/updater/verify_test.go
function TestGPGVerify (line 33) | func TestGPGVerify(t *testing.T) {
function TestGPGVerifyIn6Months (line 44) | func TestGPGVerifyIn6Months(t *testing.T) {
FILE: main.go
constant name (line 44) | name = "gopass"
function main (line 50) | func main() {
function setupApp (line 105) | func setupApp(ctx context.Context, sv semver.Version) (context.Context, ...
function getCommands (line 156) | func getCommands(action *ap.Action, app *cli.App) []*cli.Command {
type pathGetter (line 204) | type pathGetter interface
function mkHookFn (line 208) | func mkHookFn(hookName, cmdName string, s pathGetter, fn func(c *cli.Con...
function parseBuildInfo (line 226) | func parseBuildInfo() (string, string, string) {
function makeVersionPrinter (line 256) | func makeVersionPrinter(out io.Writer, sv semver.Version) func(c *cli.Co...
type errorWriter (line 290) | type errorWriter struct
method Write (line 294) | func (e errorWriter) Write(p []byte) (int, error) {
function initContext (line 298) | func initContext(ctx context.Context, cfg *config.Config) context.Context {
function writeCPUProfile (line 346) | func writeCPUProfile() func() {
function writeMemProfile (line 370) | func writeMemProfile() {
FILE: main_test.go
function TestVersionPrinter (line 25) | func TestVersionPrinter(t *testing.T) {
function TestGetVersion (line 38) | func TestGetVersion(t *testing.T) {
function TestSetupApp (line 48) | func TestSetupApp(t *testing.T) {
function TestGetCommands (line 104) | func TestGetCommands(t *testing.T) {
function testCommands (line 146) | func testCommands(t *testing.T, c *cli.Context, commands []*cli.Command,...
function TestInitContext (line 181) | func TestInitContext(t *testing.T) {
FILE: main_unix.go
function init (line 10) | func init() {
FILE: pkg/appdir/appdir.go
type Appdir (line 16) | type Appdir struct
method Name (line 31) | func (a *Appdir) Name() string {
function New (line 24) | func New(name string) *Appdir {
function UserConfig (line 37) | func UserConfig() string {
function UserCache (line 43) | func UserCache() string {
function UserData (line 49) | func UserData() string {
function UserHome (line 55) | func UserHome() string {
FILE: pkg/appdir/appdir_test.go
function TestUserHome (line 9) | func TestUserHome(t *testing.T) {
FILE: pkg/appdir/appdir_windows.go
method UserConfig (line 11) | func (a *Appdir) UserConfig() string {
method UserCache (line 22) | func (a *Appdir) UserCache() string {
method UserData (line 33) | func (a *Appdir) UserData() string {
FILE: pkg/appdir/appdir_xdg.go
method UserConfig (line 16) | func (a *Appdir) UserConfig() string {
method UserCache (line 35) | func (a *Appdir) UserCache() string {
method UserData (line 52) | func (a *Appdir) UserData() string {
FILE: pkg/appdir/appdir_xdg_test.go
function TestUserConfig (line 12) | func TestUserConfig(t *testing.T) {
function TestUserCache (line 32) | func TestUserCache(t *testing.T) {
function TestUserData (line 52) | func TestUserData(t *testing.T) {
FILE: pkg/appdir/runtime_windows.go
method UserRuntime (line 9) | func (a *Appdir) UserRuntime() string {
function UserRuntime (line 18) | func UserRuntime() string {
FILE: pkg/appdir/runtime_xdg.go
method UserRuntime (line 11) | func (a *Appdir) UserRuntime() string {
function UserRuntime (line 25) | func UserRuntime() string {
FILE: pkg/clipboard/clipboard.go
function CopyTo (line 29) | func CopyTo(ctx context.Context, name string, content []byte, timeout in...
function callCommand (line 71) | func callCommand(_ context.Context, cmd string, parameter string, stdinV...
function killProc (line 103) | func killProc(pid int) {
FILE: pkg/clipboard/clipboard_others.go
function clearClip (line 22) | func clearClip(ctx context.Context, name string, content []byte, timeout...
function walkFn (line 51) | func walkFn(pid int, killFn func(int)) {
FILE: pkg/clipboard/clipboard_test.go
function TestNotExistingClipboardCopyCommand (line 21) | func TestNotExistingClipboardCopyCommand(t *testing.T) {
function TestUnsupportedCopyToClipboard (line 33) | func TestUnsupportedCopyToClipboard(t *testing.T) {
function TestClearClipboard (line 48) | func TestClearClipboard(t *testing.T) {
function BenchmarkWalkProc (line 55) | func BenchmarkWalkProc(b *testing.B) {
function BenchmarkListProc (line 78) | func BenchmarkListProc(b *testing.B) {
FILE: pkg/clipboard/clipboard_windows.go
function clearClip (line 19) | func clearClip(ctx context.Context, name string, content []byte, timeout...
function walkFn (line 34) | func walkFn(int, func(int)) {}
FILE: pkg/clipboard/copy_darwin.go
function copyToClipboard (line 12) | func copyToClipboard(ctx context.Context, content []byte) error {
FILE: pkg/clipboard/copy_others.go
function copyToClipboard (line 12) | func copyToClipboard(ctx context.Context, content []byte) error {
FILE: pkg/clipboard/kill_others.go
function killPrecedessors (line 5) | func killPrecedessors() error {
FILE: pkg/clipboard/kill_ps.go
function killPrecedessors (line 14) | func killPrecedessors() error {
FILE: pkg/clipboard/unclip.go
function Clear (line 15) | func Clear(ctx context.Context, name string, checksum string, force bool...
FILE: pkg/clipboard/unclip_linux.go
function clearClipboardHistory (line 13) | func clearClipboardHistory(ctx context.Context) error {
FILE: pkg/clipboard/unclip_others.go
function clearClipboardHistory (line 7) | func clearClipboardHistory(ctx context.Context) error {
FILE: pkg/clipboard/unclip_test.go
function TestNotExistingClipboardClearCommand (line 15) | func TestNotExistingClipboardClearCommand(t *testing.T) {
function TestUnclip (line 26) | func TestUnclip(t *testing.T) {
FILE: pkg/ctxutil/ctxutil.go
type contextKey (line 14) | type contextKey
constant ctxKeyTerminal (line 17) | ctxKeyTerminal contextKey = iota
constant ctxKeyInteractive (line 18) | ctxKeyInteractive
constant ctxKeyStdin (line 19) | ctxKeyStdin
constant ctxKeyGitCommit (line 20) | ctxKeyGitCommit
constant ctxKeyAlwaysYes (line 21) | ctxKeyAlwaysYes
constant ctxKeyProgressCallback (line 22) | ctxKeyProgressCallback
constant ctxKeyAlias (line 23) | ctxKeyAlias
constant ctxKeyGitInit (line 24) | ctxKeyGitInit
constant ctxKeyForce (line 25) | ctxKeyForce
constant ctxKeyCommitMessage (line 26) | ctxKeyCommitMessage
constant ctxKeyNoNetwork (line 27) | ctxKeyNoNetwork
constant ctxKeyUsername (line 28) | ctxKeyUsername
constant ctxKeyEmail (line 29) | ctxKeyEmail
constant ctxKeyImportFunc (line 30) | ctxKeyImportFunc
constant ctxKeyPasswordCallback (line 31) | ctxKeyPasswordCallback
constant ctxKeyPasswordPurgeCallback (line 32) | ctxKeyPasswordPurgeCallback
constant ctxKeyCommitTimestamp (line 33) | ctxKeyCommitTimestamp
constant ctxKeyShowParsing (line 34) | ctxKeyShowParsing
constant ctxKeyHidden (line 35) | ctxKeyHidden
constant ctxFollowRef (line 36) | ctxFollowRef
function WithGlobalFlags (line 45) | func WithGlobalFlags(c *cli.Context) context.Context {
type ProgressCallback (line 54) | type ProgressCallback
function WithTerminal (line 58) | func WithTerminal(ctx context.Context, isTerm bool) context.Context {
function HasTerminal (line 63) | func HasTerminal(ctx context.Context) bool {
function IsTerminal (line 70) | func IsTerminal(ctx context.Context) bool {
function WithInteractive (line 81) | func WithInteractive(ctx context.Context, isInteractive bool) context.Co...
function HasInteractive (line 86) | func HasInteractive(ctx context.Context) bool {
function IsInteractive (line 93) | func IsInteractive(ctx context.Context) bool {
function WithStdin (line 104) | func WithStdin(ctx context.Context, isStdin bool) context.Context {
function HasStdin (line 109) | func HasStdin(ctx context.Context) bool {
function IsStdin (line 117) | func IsStdin(ctx context.Context) bool {
function WithShowParsing (line 128) | func WithShowParsing(ctx context.Context, bv bool) context.Context {
function HasShowParsing (line 133) | func HasShowParsing(ctx context.Context) bool {
function IsShowParsing (line 140) | func IsShowParsing(ctx context.Context) bool {
function WithGitCommit (line 151) | func WithGitCommit(ctx context.Context, bv bool) context.Context {
function HasGitCommit (line 156) | func HasGitCommit(ctx context.Context) bool {
function IsGitCommit (line 163) | func IsGitCommit(ctx context.Context) bool {
function IsFollowRef (line 169) | func IsFollowRef(ctx context.Context) bool {
function HasFollowRef (line 174) | func HasFollowRef(ctx context.Context) bool {
function WithFollowRef (line 181) | func WithFollowRef(ctx context.Context, bv bool) context.Context {
function WithAlwaysYes (line 187) | func WithAlwaysYes(ctx context.Context, bv bool) context.Context {
function HasAlwaysYes (line 192) | func HasAlwaysYes(ctx context.Context) bool {
function IsAlwaysYes (line 199) | func IsAlwaysYes(ctx context.Context) bool {
function WithProgressCallback (line 209) | func WithProgressCallback(ctx context.Context, cb ProgressCallback) cont...
function HasProgressCallback (line 214) | func HasProgressCallback(ctx context.Context) bool {
function GetProgressCallback (line 222) | func GetProgressCallback(ctx context.Context) ProgressCallback {
function WithAlias (line 232) | func WithAlias(ctx context.Context, alias string) context.Context {
function HasAlias (line 237) | func HasAlias(ctx context.Context) bool {
function GetAlias (line 242) | func GetAlias(ctx context.Context) string {
function WithGitInit (line 253) | func WithGitInit(ctx context.Context, bv bool) context.Context {
function HasGitInit (line 258) | func HasGitInit(ctx context.Context) bool {
function IsGitInit (line 263) | func IsGitInit(ctx context.Context) bool {
function WithForce (line 269) | func WithForce(ctx context.Context, bv bool) context.Context {
function HasForce (line 274) | func HasForce(ctx context.Context) bool {
function IsForce (line 279) | func IsForce(ctx context.Context) bool {
function AddToCommitMessageBody (line 284) | func AddToCommitMessageBody(ctx context.Context, sv string) context.Cont...
function HasCommitMessageBody (line 297) | func HasCommitMessageBody(ctx context.Context) bool {
function GetCommitMessageBody (line 307) | func GetCommitMessageBody(ctx context.Context) string {
function WithCommitMessage (line 318) | func WithCommitMessage(ctx context.Context, sv string) context.Context {
function HasCommitMessage (line 331) | func HasCommitMessage(ctx context.Context) bool {
function GetCommitMessage (line 338) | func GetCommitMessage(ctx context.Context) string {
function GetCommitMessageFull (line 348) | func GetCommitMessageFull(ctx context.Context) string {
function WithNoNetwork (line 359) | func WithNoNetwork(ctx context.Context, bv bool) context.Context {
function HasNoNetwork (line 364) | func HasNoNetwork(ctx context.Context) bool {
function IsNoNetwork (line 369) | func IsNoNetwork(ctx context.Context) bool {
function WithUsername (line 374) | func WithUsername(ctx context.Context, sv string) context.Context {
function GetUsername (line 379) | func GetUsername(ctx context.Context) string {
function WithEmail (line 389) | func WithEmail(ctx context.Context, sv string) context.Context {
function GetEmail (line 394) | func GetEmail(ctx context.Context) string {
function WithImportFunc (line 405) | func WithImportFunc(ctx context.Context, imf store.ImportCallback) conte...
function HasImportFunc (line 411) | func HasImportFunc(ctx context.Context) bool {
function GetImportFunc (line 419) | func GetImportFunc(ctx context.Context) store.ImportCallback {
type PasswordCallback (line 434) | type PasswordCallback
function WithPasswordCallback (line 437) | func WithPasswordCallback(ctx context.Context, cb PasswordCallback) cont...
function HasPasswordCallback (line 442) | func HasPasswordCallback(ctx context.Context) bool {
function GetPasswordCallback (line 450) | func GetPasswordCallback(ctx context.Context) PasswordCallback {
type PasswordPurgeCallback (line 462) | type PasswordPurgeCallback
function WithPasswordPurgeCallback (line 465) | func WithPasswordPurgeCallback(ctx context.Context, cb PasswordPurgeCall...
function HasPasswordPurgeCallback (line 470) | func HasPasswordPurgeCallback(ctx context.Context) bool {
function GetPasswordPurgeCallback (line 478) | func GetPasswordPurgeCallback(ctx context.Context) PasswordPurgeCallback {
function WithCommitTimestamp (line 490) | func WithCommitTimestamp(ctx context.Context, ts time.Time) context.Cont...
function HasCommitTimestamp (line 496) | func HasCommitTimestamp(ctx context.Context) bool {
function GetCommitTimestamp (line 504) | func GetCommitTimestamp(ctx context.Context) time.Time {
function WithHidden (line 514) | func WithHidden(ctx context.Context, hidden bool) context.Context {
function IsHidden (line 519) | func IsHidden(ctx context.Context) bool {
FILE: pkg/ctxutil/ctxutil_test.go
function TestTerminal (line 14) | func TestTerminal(t *testing.T) {
function TestInteractive (line 24) | func TestInteractive(t *testing.T) {
function TestStdin (line 34) | func TestStdin(t *testing.T) {
function TestGitCommit (line 44) | func TestGitCommit(t *testing.T) {
function TestAlwaysYes (line 54) | func TestAlwaysYes(t *testing.T) {
function TestProgressCallback (line 64) | func TestProgressCallback(t *testing.T) {
function TestAlias (line 77) | func TestAlias(t *testing.T) {
function TestGitInit (line 86) | func TestGitInit(t *testing.T) {
function TestForce (line 96) | func TestForce(t *testing.T) {
function TestCommitMessage (line 106) | func TestCommitMessage(t *testing.T) {
function TestCommitMessageBody (line 116) | func TestCommitMessageBody(t *testing.T) {
function TestComposite (line 135) | func TestComposite(t *testing.T) {
function TestGlobalFlags (line 182) | func TestGlobalFlags(t *testing.T) {
function TestImportFunc (line 201) | func TestImportFunc(t *testing.T) {
function TestHidden (line 216) | func TestHidden(t *testing.T) {
FILE: pkg/ctxutil/helper.go
function hasString (line 10) | func hasString(ctx context.Context, key contextKey) bool {
function hasBool (line 18) | func hasBool(ctx context.Context, key contextKey) bool {
function is (line 26) | func is(ctx context.Context, key contextKey, def bool) bool {
type HeadedText (line 36) | type HeadedText struct
method SetHead (line 42) | func (h *HeadedText) SetHead(s string) {
method GetHead (line 47) | func (h *HeadedText) GetHead() string {
method AddToBody (line 52) | func (h *HeadedText) AddToBody(s string) {
method ClearBody (line 64) | func (h *HeadedText) ClearBody() {
method GetBody (line 69) | func (h *HeadedText) GetBody() string {
method HasBody (line 78) | func (h *HeadedText) HasBody() bool {
method GetText (line 85) | func (h *HeadedText) GetText() string {
FILE: pkg/debug/debug.go
type v (line 35) | type v
method Log (line 220) | func (n v) Log(f string, args ...any) {
function V (line 39) | func V(n int) v {
function initDebug (line 48) | func initDebug() bool {
function initDebugLogger (line 83) | func initDebugLogger() {
function parseFilter (line 117) | func parseFilter(envname string, pad func(string) string) map[string]bool {
function padFunc (line 151) | func padFunc(s string) string {
function padFile (line 159) | func padFile(s string) string {
function initDebugTags (line 175) | func initDebugTags() {
function getPosition (line 180) | func getPosition(offset int) (fn, dir, file string, line int) { //nolint...
function checkFilter (line 194) | func checkFilter(filter map[string]bool, key string) bool {
function Log (line 228) | func Log(f string, args ...any) {
function LogN (line 237) | func LogN(offset int, f string, args ...any) {
function doNotLog (line 241) | func doNotLog(verbosity, offset int, f string, args ...any) {}
function doLog (line 243) | func doLog(verbosity, offset int, f string, args ...any) {
function IsEnabled (line 303) | func IsEnabled() bool {
FILE: pkg/debug/debug_test.go
function BenchmarkLogging (line 13) | func BenchmarkLogging(b *testing.B) {
function BenchmarkNoLogging (line 23) | func BenchmarkNoLogging(b *testing.B) {
type testSecret (line 34) | type testSecret
method SafeStr (line 36) | func (t testSecret) SafeStr() string {
type testShort (line 40) | type testShort
method Str (line 42) | func (t testShort) Str() string {
function TestDebug (line 46) | func TestDebug(t *testing.T) {
function TestDebugSecret (line 74) | func TestDebugSecret(t *testing.T) {
function TestDebugFilter (line 100) | func TestDebugFilter(t *testing.T) {
FILE: pkg/debug/version.go
function ModuleVersion (line 14) | func ModuleVersion(m string) semver.Version {
function paths (line 62) | func paths(mods []*rdebug.Module) []string {
FILE: pkg/debug/version_test.go
function TestModuleVersion (line 12) | func TestModuleVersion(t *testing.T) {
FILE: pkg/fsutil/fsutil.go
function CleanFilename (line 24) | func CleanFilename(in string) string {
function ExpandHomedir (line 29) | func ExpandHomedir(path string) string {
function CleanPath (line 44) | func CleanPath(path string) string {
function IsDir (line 66) | func IsDir(path string) bool {
function IsFile (line 83) | f
Condensed preview — 634 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,304K chars).
[
{
"path": ".codeclimate.yml",
"chars": 614,
"preview": "version: \"2\"\n\nchecks:\n argument-count:\n config:\n threshold: 4\n complex-logic:\n config:\n threshold: 4\n "
},
{
"path": ".codecov.yml",
"chars": 183,
"preview": "coverage:\n range: 40..90\n round: nearest\n precision: 2\n status:\n project:\n default: on\n patch:\n defa"
},
{
"path": ".errcheck.excl",
"chars": 36,
"preview": "fmt.Fprintf\nfmt.Fprintln\nfmt.Fprint\n"
},
{
"path": ".gemini/settings.json",
"chars": 39,
"preview": "{\n \"contextFileName\": \"AGENTS.md\"\n}\n"
},
{
"path": ".gitattributes",
"chars": 26,
"preview": "CHANGELOG.md merge=union\n\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 76,
"preview": "github: dominikschulz\npatreon: gopass \ncustom: \"https://paypal.me/doschulz\"\n"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 908,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve gopass\n---\n\n### Summary\n<!--\nPlease provide a clear and c"
},
{
"path": ".github/copilot-instructions.md",
"chars": 106,
"preview": "Refer to [AGENTS.md](../AGENTS.md) for detailed instructions on how to set up and use agents with gopass.\n"
},
{
"path": ".github/dependabot.yml",
"chars": 153,
"preview": "version: 2\nupdates:\n\n - package-ecosystem: \"github-actions\"\n directory: \"/\"\n schedule:\n interval: \"monthly\"\n"
},
{
"path": ".github/stale.yml",
"chars": 775,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 120\n# Number of days of inactivity before a"
},
{
"path": ".github/workflows/autorelease.yml",
"chars": 3665,
"preview": "# This is a basic workflow to help you get started with Actions\n\nname: release\n\n# Controls when the action will run. \non"
},
{
"path": ".github/workflows/build.yml",
"chars": 5014,
"preview": "name: Build gopass\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n\nconcurrency:\n"
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 3413,
"preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
},
{
"path": ".github/workflows/container.yml",
"chars": 1781,
"preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
},
{
"path": ".github/workflows/golangci-lint.yml",
"chars": 1732,
"preview": "name: golangci-lint\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n\nconcurrency:"
},
{
"path": ".github/workflows/grype.yml",
"chars": 1139,
"preview": "name: Scan gopass\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n\npermissions:\n "
},
{
"path": ".github/workflows/scorecard.yml",
"chars": 2980,
"preview": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by "
},
{
"path": ".gitignore",
"chars": 575,
"preview": "gopass\ngopass-*-amd64\ngopass-full\ndev.sh\n!pkg/gopass/\ncoverage.out\ncoverage-all.*\n.vscode/\n\n# Profiling\n*.out\n\n# Compile"
},
{
"path": ".golangci.yml",
"chars": 1792,
"preview": "version: \"2\"\noutput:\n sort-order:\n - linter\n - file\nlinters:\n enable:\n - asasalint\n - asciicheck\n - bid"
},
{
"path": ".goreleaser.yml",
"chars": 4686,
"preview": "# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\n# goreleaser.yml\n# Release automation\n#\n# Buil"
},
{
"path": ".license-lint.yml",
"chars": 610,
"preview": "unrestricted_licenses:\n - Apache-2.0\n - MIT\n - BSD-3-Clause\n - BSD-2-Clause\n - 0BSD\n - WTFPL\n - CC0-1.0\nreciproca"
},
{
"path": ".revive.toml",
"chars": 911,
"preview": "# Ignores files with \"GENERATED\" header, similar to golint\nignoreGeneratedHeader = false\n\n# Sets the default severity to"
},
{
"path": "AGENTS.md",
"chars": 7100,
"preview": "# Project Overview\n\ngopass is a command line application that allows users to managed their passwords and other secrets "
},
{
"path": "ARCHITECTURE.md",
"chars": 10460,
"preview": "# Architecture\n\nThis document describes the high-level architecture of gopass. If you want to\nget familiar with the code"
},
{
"path": "CHANGELOG.md",
"chars": 51075,
"preview": "# Changelog\n\n## 1.16.1 / 2025-12-13\n\n* chore(deps): bump actions/checkout from 5.0.0 to 6.0.0 (#3299)\n* chore(deps): bum"
},
{
"path": "CONTRIBUTING.md",
"chars": 2572,
"preview": "# Contributing\n\n`gopass` uses GitHub to manage reviews of pull requests.\n\n* If you are a new contributor see: [Steps to "
},
{
"path": "Dockerfile",
"chars": 1960,
"preview": "FROM docker.io/library/golang:1.25-alpine@sha256:b6ed3fd0452c0e9bcdef5597f29cc1418f61672e9d3a2f55bf02e7222c014abd AS bui"
},
{
"path": "GOVERNANCE.md",
"chars": 1033,
"preview": "# gopass project governance\n\n## Overview\n\nThe gopass project uses a governance model commonly described as Benevolent\nDi"
},
{
"path": "LICENSE",
"chars": 1077,
"preview": "The MIT License (MIT)\n\nCopyright 2017 JustWatch GmbH\n\nPermission is hereby granted, free of charge, to any person obtain"
},
{
"path": "Makefile",
"chars": 7369,
"preview": "FIRST_GOPATH := $(firstword $(subst :, ,$(GOPATH)))\nPKGS := $(shell go list ./... | gr"
},
{
"path": "README.md",
"chars": 7569,
"preview": "<p align=\"center\">\n <img src=\"docs/logo.png\" height=\"250\" alt=\"gopass Gopher by Vincent Leinweber, remixed from the R"
},
{
"path": "VERSION",
"chars": 7,
"preview": "1.16.1\n"
},
{
"path": "bash.completion",
"chars": 407,
"preview": "_gopass_bash_autocomplete() {\n local cur opts base\n COMPREPLY=()\n cur=\"${COMP_WORDS[COMP_CWORD]}\"\n # Use"
},
{
"path": "docs/backends/age.md",
"chars": 3978,
"preview": "# age crypto backend\n\nThe `age` backend is an experimental crypto backend based on [age](https://age-encryption.org). It"
},
{
"path": "docs/backends/cryptfs.md",
"chars": 386,
"preview": "# cryptfs storage backend\n\nThe `cryptfs` backend is an experimental storage backend **PREVIEW**. It hashes secret names "
},
{
"path": "docs/backends/fossilfs.md",
"chars": 198,
"preview": "# `fossilfs` storage backend\n\nThis is an **EXPERIMENTAL** storage backend that uses the Fossil SCM. It isn't well tested"
},
{
"path": "docs/backends/fs.md",
"chars": 143,
"preview": "# fs storage backend\n\nThe simplest storage backend, often used for testing.\nIt stores data directly in the filesystem wi"
},
{
"path": "docs/backends/gitfs.md",
"chars": 356,
"preview": "# `gitfs` storage backend\n\nThis is the default storage backend. It stores the encrypted data directly in the filesystem."
},
{
"path": "docs/backends/gpg.md",
"chars": 1829,
"preview": "# gpg crypto backend\n\nThe `gpgcli` backend is the default crypto backend based on the `gpg` CLI. It depends on the GPG i"
},
{
"path": "docs/backends/jjfs.md",
"chars": 191,
"preview": "# `jjfs` storage backend\n\nThis is an **EXPERIMENTAL** storage backend that uses the JJ / Git. It isn't well tested and o"
},
{
"path": "docs/backends.md",
"chars": 1806,
"preview": "# Backends\n\ngopass supports pluggable backends for Storage and Revision Control System (`storage`) and Encryption (`cryp"
},
{
"path": "docs/commands/audit.md",
"chars": 1241,
"preview": "# `audit` command\n\nThe `audit` command will decrypt all secrets and scan for weak passwords or other common flaws.\n\n## S"
},
{
"path": "docs/commands/cat.md",
"chars": 1250,
"preview": "# `cat` command\n\nThe `cat` command is used to pipe password in and out of STDIN and STDOUT\nrespectively. As it is intend"
},
{
"path": "docs/commands/clone.md",
"chars": 627,
"preview": "# `clone` command\n\nThe `clone` command allows cloning and setting up a new password store\nfrom a remote location, e.g. a"
},
{
"path": "docs/commands/config.md",
"chars": 400,
"preview": "# `config` command\n\nThe config command allows displaying and altering configuration options.\n\nNote: To manage mounts use"
},
{
"path": "docs/commands/convert.md",
"chars": 884,
"preview": "# `convert` command\n\nThe `convert` command exists to migrate stores between different backend\nimplementations.\n\nNote: Th"
},
{
"path": "docs/commands/create.md",
"chars": 4928,
"preview": "# `create` command\n\nThe `create` command creates a new secret using a set of built-in or custom templates.\nIt implements"
},
{
"path": "docs/commands/delete.md",
"chars": 777,
"preview": "# `delete` command\n\nThe `delete` command is used to remove a single secret or a whole subtree.\n\nNote: Recursive operatio"
},
{
"path": "docs/commands/edit.md",
"chars": 1344,
"preview": "# `edit` command\n\nThe `edit` command loads a new or existing secret into your `$EDITOR` (default: `vim`)\nand saves the r"
},
{
"path": "docs/commands/env.md",
"chars": 295,
"preview": "# `env` command\n\nThe `env` command runs a binary as a subprocess with a pre-populated environment.\nThe environment of th"
},
{
"path": "docs/commands/find.md",
"chars": 767,
"preview": "# `find` command\n\nThe `find` command will attempt to do a simple substring match on the names of all secrets.\nIf there i"
},
{
"path": "docs/commands/fsck.md",
"chars": 489,
"preview": "# `fsck` command\n\n`gopass` can check integrity of it's password stores with the `fsck` command.\nIt will ensure proper fi"
},
{
"path": "docs/commands/fscopy.md",
"chars": 948,
"preview": "# `fscopy` command\n\nThe `fscopy` command is used to copy a file from your filesystem into your\npassword store, while kee"
},
{
"path": "docs/commands/fsmove.md",
"chars": 1047,
"preview": "# `fsmove` command\n\nThe `fsmove` command is used to move a file from your filesystem into your\npassword store, erasing i"
},
{
"path": "docs/commands/generate.md",
"chars": 5317,
"preview": "# `generate` command\n\nThe `generate` command is used to generate a new password and store it into the password store.\n\nN"
},
{
"path": "docs/commands/gopass.md",
"chars": 1428,
"preview": "# `gopass` command\n\nCalling `gopass` without any command argument is a common entry point and\nhas two different modes.\n\n"
},
{
"path": "docs/commands/grep.md",
"chars": 408,
"preview": "# `grep` command\n\nThe `grep` command works like the Unix `grep` tool. It decrypts all secrets\nand performs a substring o"
},
{
"path": "docs/commands/history.md",
"chars": 224,
"preview": "# `history` command\n\nThe `gopass history` command will show all revisions of a given secret.\n\n## Synopsis\n\n```\n$ gopass "
},
{
"path": "docs/commands/init.md",
"chars": 1370,
"preview": "# `init` command\n\nThe `init` command is used to initialize a new password store.\nIf no recipients are specified a useabl"
},
{
"path": "docs/commands/insert.md",
"chars": 1807,
"preview": "# `insert` command\n\nThe `insert` command is used to manually set (insert, or change) a password in the store. It applies"
},
{
"path": "docs/commands/link.md",
"chars": 596,
"preview": "# `link` command\n\nThe `link` (or `ln`) command is used to create a symlink from one secret in a\nstore to a target in the"
},
{
"path": "docs/commands/list.md",
"chars": 3866,
"preview": "# `list` command\n\nThe `list` command is used to list all the entries in the password store or at a given prefix.\n\n## Syn"
},
{
"path": "docs/commands/mounts.md",
"chars": 1040,
"preview": "# `mounts` commands\n\nThe `mounts` commands allow managing mounted substores. This is one of the\ndistinctive core feature"
},
{
"path": "docs/commands/move.md",
"chars": 1701,
"preview": "# `move` command\n\nNote: The implementations for `copy` and `move` are exactly the same. The only difference is that `mov"
},
{
"path": "docs/commands/otp.md",
"chars": 2538,
"preview": "# `otp` command\n\nThe `otp` command generates TOTP tokens from an OTP URL (`otpauth://`).\nThe command tries to parse the "
},
{
"path": "docs/commands/process.md",
"chars": 2327,
"preview": "# `process` command\n\nThe `process` command extends the `gopass` templating to support user-supplied\ntemplate files that "
},
{
"path": "docs/commands/pwgen.md",
"chars": 896,
"preview": "# `pwgen` command\n\nThe `pwgen` command implements a subset of the features of the Unix/Linux\n`pwgen` command line tool. "
},
{
"path": "docs/commands/recipients.md",
"chars": 1526,
"preview": "# `recipients` commands\n\nThe set of `recipients` commands allow managing public keys that are able to\ndecrypt a given pa"
},
{
"path": "docs/commands/show.md",
"chars": 6713,
"preview": "# `show` command\n\nThe `show` command is the most important and most frequently used command.\nIt allows displaying and co"
},
{
"path": "docs/commands/sync.md",
"chars": 521,
"preview": "# `sync` command\n\nThe `sync` command is the preferred way to manually synchronize changes between\nyour local stores and "
},
{
"path": "docs/commands/templates.md",
"chars": 2803,
"preview": "# `templates` commands\n\nThe template support is one of the more unique `gopass` features. It allows\npassword stores to d"
},
{
"path": "docs/commands/update.md",
"chars": 444,
"preview": "# `update` command\n\nThe `update` command will attempt to auto-update `gopass` by downloading the\nlatest release from Git"
},
{
"path": "docs/components.dot",
"chars": 1141,
"preview": "digraph G {\n gopass [shape=box,style=filled,color=\".2 .2 .6\",peripheries=2];\n gopass -> action;\n action [label=\"inter"
},
{
"path": "docs/config.md",
"chars": 28286,
"preview": "# Configuration\n\n## Environment Variables\n\nSome configuration options are only available through setting environment var"
},
{
"path": "docs/entropy.md",
"chars": 1256,
"preview": "# Entropy\n\nGenerating cryptographic keys needs a lot of entropy. Especially `gnupg --gen-key`\ndepletes the kernel entrop"
},
{
"path": "docs/faq.md",
"chars": 5264,
"preview": "# FAQ\n\n## How does gopass relate to HashiCorp vault?\n\nWhile [Vault](https://www.vaultproject.io/) is for machines, gopas"
},
{
"path": "docs/features.md",
"chars": 25916,
"preview": "# Features\n\nThis document provides a broad overview over the features and use-cases\ngopass supports.\n\nSome examples are "
},
{
"path": "docs/hacking.md",
"chars": 3837,
"preview": "# Hacking on gopass\n\nNote: See [CONTRIBUTING.md](../CONTRIBUTING.md) for an overview.\n\nThis document provides an overvie"
},
{
"path": "docs/hooks.md",
"chars": 1604,
"preview": "# Gopass Hooks\n\n`gopass` exposes some hook-able events during it's invocation lifecycle. This allows users to inject add"
},
{
"path": "docs/releases.md",
"chars": 5093,
"preview": "## Releases\n\nNote: Only members who have at least `write` [access](https://github.com/gopasspw/gopass/settings/access) t"
},
{
"path": "docs/secrets.md",
"chars": 2268,
"preview": "# Secrets\n\n`gopass` supports different secret formats. This page documents the different formats.\nYou can read more abou"
},
{
"path": "docs/security.md",
"chars": 4405,
"preview": "# Security, Known Limitations, and Caveats\n\nThis project aims to provide a secure and dependable credential store that c"
},
{
"path": "docs/setup.md",
"chars": 17810,
"preview": "# Setup\n\n## Table of Contents\n\n1. [Pre-Installation Steps](#pre-installation-steps)\n2. [Installation Steps](#installatio"
},
{
"path": "docs/usecases/gpaste.md",
"chars": 1853,
"preview": "# Use case: GPaste Clipboard management system\n\n## Summary\n\nOn Linux one might want to use the [GPaste](https://github.c"
},
{
"path": "docs/usecases/multi-store.md",
"chars": 487,
"preview": "# Use case: Multiple Stores\n\n`gopass` aims to support up to 100 mounted substores without noticeable\nimpact on most oper"
},
{
"path": "docs/usecases/readonly-store.md",
"chars": 2009,
"preview": "# Use case: Readonly Store\n\n## Summary\n\nAllow a password store or a set of sub-stores to be configured in readonly mode "
},
{
"path": "docs/usecases/secure-otp/sign-in.puml",
"chars": 807,
"preview": "@startuml\ntitle Sign-In with local otp\n\nactor User\ndatabase \"Git-Passwordstore\"\ndatabase \"Local-Passwordstore\"\ndatabase "
},
{
"path": "docs/usecases/secure-otp/sign-up.puml",
"chars": 514,
"preview": "@startuml\ntitle Sign-Up with local otp\n\nactor User\ndatabase \"Git-Passwordstore\"\ndatabase \"Local-Passwordstore\"\ndatabase "
},
{
"path": "docs/usecases/secure-otp.md",
"chars": 3851,
"preview": "# Use case: Secure otp\n\n## Summary\nOTP is typically used to increase security of login process by using an additional fa"
},
{
"path": "fish.completion",
"chars": 44526,
"preview": "#!/usr/bin/env fish\nset PROG 'gopass'\n\nfunction __fish_gopass_needs_command\n set -l cmd (commandline -opc)\n if [ (coun"
},
{
"path": "go.mod",
"chars": 4389,
"preview": "module github.com/gopasspw/gopass\n\ngo 1.25\n\nrequire (\n\tfilippo.io/age v1.2.1\n\tgithub.com/ProtonMail/go-crypto v1.3.0\n\tgi"
},
{
"path": "go.sum",
"chars": 25296,
"preview": "al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=\nal.essio.dev/pkg/shellescape v1.6.0/"
},
{
"path": "gopass.1",
"chars": 19276,
"preview": "\n.TH GOPASS \"1\" \"December 2025\" \"gopass (github.com/gopasspw/gopass) 1.16.1\" \"User Commands\"\n.SH NAME\ngopass - The stand"
},
{
"path": "helpers/changelog/main.go",
"chars": 1054,
"preview": "// Copyright 2021 The gopass Authors. All rights reserved.\n// Use of this source code is governed by the MIT license,\n//"
},
{
"path": "helpers/changelog/main_test.go",
"chars": 1055,
"preview": "//go:build linux\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestMain(t *testing.T) {\n\t// Creat"
},
{
"path": "helpers/gitutils/gitutils.go",
"chars": 6295,
"preview": "package gitutils\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretch"
},
{
"path": "helpers/man/main.go",
"chars": 5219,
"preview": "// Copyright 2021 The gopass Authors. All rights reserved.\n// Use of this source code is governed by the MIT license,\n//"
},
{
"path": "helpers/man/main_test.go",
"chars": 1445,
"preview": "//go:build linux\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/asser"
},
{
"path": "helpers/modinfo/main.go",
"chars": 624,
"preview": "// modinfo a small helper to print the build info and module versions.\n//\n// Test builds don't have build info, so this "
},
{
"path": "helpers/msipkg/main.go",
"chars": 3676,
"preview": "package main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"text/template\"\n\n\t\"githu"
},
{
"path": "helpers/postrel/main.go",
"chars": 13622,
"preview": "// Copyright 2021 The gopass Authors. All rights reserved.\n// Use of this source code is governed by the MIT license,\n//"
},
{
"path": "helpers/postrel/main_test.go",
"chars": 1864,
"preview": "//go:build linux || darwin\n\npackage main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/helpe"
},
{
"path": "helpers/proxy/Dockerfile.debian",
"chars": 412,
"preview": "FROM debian:bookworm\n\nRUN apt update && apt install -y \\\n sudo \\\n curl \\\n iproute2 \\\n iputils-ping \\\n vim"
},
{
"path": "helpers/proxy/README-3111.md",
"chars": 350,
"preview": "# Debugging Issue 3111\n\n- Run the proxy on the host: `go run helpers/proxy/main.go`\n - Turn off the firewall / open the"
},
{
"path": "helpers/proxy/apt.debughttp",
"chars": 127,
"preview": "Debug::Acquire::http \"true\";\nDebug::Acquire::https \"true\";\nDebug::pkgAcquire \"true\";\nAcquire::http::Proxy \"http://HOST:8"
},
{
"path": "helpers/proxy/gopass.sources",
"chars": 184,
"preview": "Types: deb\nURIs: https://packages.gopass.pw/repos/gopass\nSuites: stable\nArchitectures: all amd64 arm64 armhf\nComponents:"
},
{
"path": "helpers/proxy/main.go",
"chars": 6054,
"preview": "package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/http/httputil\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n)\n\nvar (\n\tlisten "
},
{
"path": "helpers/release/main.go",
"chars": 12376,
"preview": "// Copyright 2021 The gopass Authors. All rights reserved.\n// Use of this source code is governed by the MIT license,\n//"
},
{
"path": "helpers/release/main_test.go",
"chars": 1968,
"preview": "//go:build linux\n\npackage main\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"github.com/gopasspw/gopass/he"
},
{
"path": "internal/action/action.go",
"chars": 1354,
"preview": "package action\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"github.com/gopasspw/gopass/intern"
},
{
"path": "internal/action/action_test.go",
"chars": 2215,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/blang/semver/v4\"\n"
},
{
"path": "internal/action/aliases.go",
"chars": 619,
"preview": "package action\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/out\"\n\t\"github.com/gopasspw/gopass/pkg"
},
{
"path": "internal/action/aliases_test.go",
"chars": 755,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/audit.go",
"chars": 3438,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github."
},
{
"path": "internal/action/audit_test.go",
"chars": 1563,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/binary.go",
"chars": 10691,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"pa"
},
{
"path": "internal/action/binary_test.go",
"chars": 6773,
"preview": "package action\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/"
},
{
"path": "internal/action/clihelper.go",
"chars": 914,
"preview": "package action\n\nimport (\n\t\"strings\"\n\n\t\"github.com/urfave/cli/v2\"\n)\n\ntype argList []string\n\nfunc (a argList) Get(n int) s"
},
{
"path": "internal/action/clihelper_test.go",
"chars": 1974,
"preview": "package action\n\nimport (\n\t\"flag\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require"
},
{
"path": "internal/action/clone.go",
"chars": 8984,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/acti"
},
{
"path": "internal/action/clone_test.go",
"chars": 4526,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/blang/semver/v4\""
},
{
"path": "internal/action/commands.go",
"chars": 36153,
"preview": "package action\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/backend\"\n\t\"github.com/gopasspw/gopass/pkg/debug\"\n"
},
{
"path": "internal/action/commands_test.go",
"chars": 1249,
"preview": "package action\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/gopass/pkg/ctxu"
},
{
"path": "internal/action/completion.go",
"chars": 2965,
"preview": "package action\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\n\tfishcomp \"github.com/gopasspw/gopass/internal/completi"
},
{
"path": "internal/action/completion_test.go",
"chars": 2581,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/config.go",
"chars": 3721,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"slices\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/go"
},
{
"path": "internal/action/config_test.go",
"chars": 3453,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.co"
},
{
"path": "internal/action/context.go",
"chars": 4112,
"preview": "package action\n\nimport \"context\"\n\ntype contextKey int\n\nconst (\n\tctxKeyClip contextKey = iota\n\tctxKeyPasswordOnly\n\tctxKey"
},
{
"path": "internal/action/context_test.go",
"chars": 1454,
"preview": "package action\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/stretchr/testify/assert\""
},
{
"path": "internal/action/convert.go",
"chars": 2800,
"preview": "package action\n\nimport (\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/internal/backen"
},
{
"path": "internal/action/convert_test.go",
"chars": 1439,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/conf"
},
{
"path": "internal/action/copy.go",
"chars": 2351,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exi"
},
{
"path": "internal/action/copy_test.go",
"chars": 6081,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/back"
},
{
"path": "internal/action/create.go",
"chars": 2095,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gop"
},
{
"path": "internal/action/create_test.go",
"chars": 908,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/clipboard\"\n\t\"github.com/gopasspw/gopass/intern"
},
{
"path": "internal/action/delete.go",
"chars": 3994,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/go"
},
{
"path": "internal/action/delete_test.go",
"chars": 2098,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/doc.go",
"chars": 110,
"preview": "// Package action implements all the handlers that are available as subcommands\n// for gopass.\npackage action\n"
},
{
"path": "internal/action/edit.go",
"chars": 4701,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"gith"
},
{
"path": "internal/action/edit_test.go",
"chars": 1593,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/env.go",
"chars": 1964,
"preview": "package action\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n"
},
{
"path": "internal/action/env_test.go",
"chars": 3949,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"gi"
},
{
"path": "internal/action/exit/errors.go",
"chars": 1756,
"preview": "package exit\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/pkg/debug\"\n\t\"github.com/urfave/cli/v2\"\n)\n\nconst (\n\t// OK mea"
},
{
"path": "internal/action/exit/errors_test.go",
"chars": 415,
"preview": "package exit\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/out\"\n\t\"github.com/stretch"
},
{
"path": "internal/action/find.go",
"chars": 4329,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/ex"
},
{
"path": "internal/action/find_test.go",
"chars": 4072,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\""
},
{
"path": "internal/action/fsck.go",
"chars": 2167,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github."
},
{
"path": "internal/action/fsck_test.go",
"chars": 3944,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/in"
},
{
"path": "internal/action/generate.go",
"chars": 15331,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"path\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/gopas"
},
{
"path": "internal/action/generate_test.go",
"chars": 12391,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/fatih/co"
},
{
"path": "internal/action/git.go",
"chars": 815,
"preview": "package action\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/go"
},
{
"path": "internal/action/grep.go",
"chars": 1475,
"preview": "package action\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/action/ex"
},
{
"path": "internal/action/grep_test.go",
"chars": 1382,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/history.go",
"chars": 1205,
"preview": "package action\n\nimport (\n\t\"time\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/intern"
},
{
"path": "internal/action/history_test.go",
"chars": 1843,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"github.com/gopasspw/gopass/internal/"
},
{
"path": "internal/action/init.go",
"chars": 6633,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gop"
},
{
"path": "internal/action/init_test.go",
"chars": 2676,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/inte"
},
{
"path": "internal/action/insert.go",
"chars": 7702,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n"
},
{
"path": "internal/action/insert_test.go",
"chars": 5405,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/conf"
},
{
"path": "internal/action/link.go",
"chars": 442,
"preview": "package action\n\nimport (\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/pkg/ctxutil\"\n\t\""
},
{
"path": "internal/action/link_test.go",
"chars": 1748,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/conf"
},
{
"path": "internal/action/list.go",
"chars": 3749,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"githu"
},
{
"path": "internal/action/list_test.go",
"chars": 5395,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/conf"
},
{
"path": "internal/action/merge.go",
"chars": 3172,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github."
},
{
"path": "internal/action/merge_test.go",
"chars": 1590,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/conf"
},
{
"path": "internal/action/mount.go",
"chars": 4318,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/blang/semver/v4\"\n"
},
{
"path": "internal/action/mount_test.go",
"chars": 1985,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"git"
},
{
"path": "internal/action/move.go",
"chars": 1107,
"preview": "package action\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/pkg/ctx"
},
{
"path": "internal/action/move_test.go",
"chars": 845,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/otp.go",
"chars": 6926,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/gopasspw/gopass/internal/action/ex"
},
{
"path": "internal/action/otp_test.go",
"chars": 2107,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gokyle/twofactor\"\n\t\"github.com/gopassp"
},
{
"path": "internal/action/process.go",
"chars": 848,
"preview": "package action\n\nimport (\n\t\"os\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/internal"
},
{
"path": "internal/action/process_test.go",
"chars": 1488,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"git"
},
{
"path": "internal/action/pwgen/commands.go",
"chars": 2402,
"preview": "package pwgen\n\nimport (\n\t\"github.com/urfave/cli/v2\"\n)\n\n// GetCommands returns the pwgen subcommand.\nfunc GetCommands() ["
},
{
"path": "internal/action/pwgen/commands_test.go",
"chars": 868,
"preview": "package pwgen\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/tests/gptest\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"g"
},
{
"path": "internal/action/pwgen/pwgen.go",
"chars": 3020,
"preview": "// Package pwgen implements the subcommands to operate the stand alone password generator.\n// The reason why it's not pa"
},
{
"path": "internal/action/pwgen/pwgen_test.go",
"chars": 731,
"preview": "package pwgen\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/g"
},
{
"path": "internal/action/rcs.go",
"chars": 5171,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/inter"
},
{
"path": "internal/action/rcs_test.go",
"chars": 1312,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/recipients.go",
"chars": 8954,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gop"
},
{
"path": "internal/action/recipients_test.go",
"chars": 4921,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gopass/internal/back"
},
{
"path": "internal/action/reminder.go",
"chars": 1274,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/gopass/in"
},
{
"path": "internal/action/reorg.go",
"chars": 4342,
"preview": "package action\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/ex"
},
{
"path": "internal/action/reorg_test.go",
"chars": 1327,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/out\"\n\t\"github.com/gopasspw/gop"
},
{
"path": "internal/action/repl.go",
"chars": 5337,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/ergochat/readline\"\n\t\"github.com/gopasspw/gopass/inte"
},
{
"path": "internal/action/repl_test.go",
"chars": 3074,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/ergochat/readline\"\n\t\"github.com/fatih/color\"\n\t\"github.c"
},
{
"path": "internal/action/setup.go",
"chars": 13374,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gop"
},
{
"path": "internal/action/setup_test.go",
"chars": 3667,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/backend\"\n\t\"gi"
},
{
"path": "internal/action/show.go",
"chars": 10702,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/inter"
},
{
"path": "internal/action/show_test.go",
"chars": 14050,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/clipboard\"\n\t\""
},
{
"path": "internal/action/sync.go",
"chars": 7312,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/go"
},
{
"path": "internal/action/sync_test.go",
"chars": 952,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/gopasspw/gopass/internal/config\"\n\t\"github.com/gopasspw/"
},
{
"path": "internal/action/templates.go",
"chars": 4157,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"git"
},
{
"path": "internal/action/templates_test.go",
"chars": 2018,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t_ \"github.com/gopasspw/gopass/internal/ba"
},
{
"path": "internal/action/unclip.go",
"chars": 814,
"preview": "package action\n\nimport (\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/"
},
{
"path": "internal/action/unclip_test.go",
"chars": 839,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t_ \"github.com/gopasspw/gopass/internal/backend/crypto\"\n\t_ \"github.c"
},
{
"path": "internal/action/update.go",
"chars": 766,
"preview": "package action\n\nimport (\n\t\"github.com/gopasspw/gopass/internal/action/exit\"\n\t\"github.com/gopasspw/gopass/internal/out\"\n\t"
},
{
"path": "internal/action/update_test.go",
"chars": 2686,
"preview": "package action\n\nimport (\n\t\"archive/tar\"\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"runtim"
},
{
"path": "internal/action/version.go",
"chars": 2601,
"preview": "package action\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/gopasspw/gop"
},
{
"path": "internal/action/version_test.go",
"chars": 993,
"preview": "package action\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"testing\"\n\n\t_ \"github.com/gopasspw/gopass/internal/backend/crypto\"\n\t_ \"github.c"
}
]
// ... and 434 more files (download for full content)
About this extraction
This page contains the full source code of the gopasspw/gopass GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 634 files (19.8 MB), approximately 546.9k tokens, and a symbol index with 2608 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.