Keychain 6.0.4 no longer exports the legacy org.openintents.openpgp.api.OpenPgpService action, so the OpenPgpServiceConnection from openpgp-api.jar bound nothing and every encrypt/decrypt died with a NullPointerException in OpenPgpApi.executeApi. Bind our own ServiceConnection against org.openintents.openpgp.IOpenPgpService (falling back to the legacy action for older Keychain releases), and queue API calls until the service is actually connected instead of racing the async bind. Also fix the //go:generate recipe: it built one jar containing both PgpConnect and Permissions, which collides with Permissions.jar when gogio dexes every *.jar in the repo root. |
||
|---|---|---|
| cmd | ||
| scripts | ||
| .gitignore | ||
| go.mod | ||
| go.sum | ||
| impl_android.go | ||
| impl_darwin.go | ||
| impl_linux.go | ||
| impl_shared.go | ||
| jni_android.c | ||
| jni_android.go | ||
| jni_android.h | ||
| main.go | ||
| openpgp-api.jar | ||
| Permissions.jar | ||
| Permissions.java | ||
| PgpConnect.jar | ||
| PgpConnect.java | ||
| README.md | ||
passgo
This repository includes Go code to interact with pass, the Unix password
manager. Library code is provided to open a password store, list
saved passwords, and decrypt specified passwords. The library provides
a simple passphrase input function, or, if gpg-agent is running (on MacOS),
it will connect automatically to request your GPG passphrase. On Android,
passgo connects to OpenKeychain. MacOS and Android users can also ask passgo
to copy a password directly to the clipboard.
store := passgo.Store{}
// directory defaults to ~/.password-store, or set it manually here:
// store.Dir = "/home/me/.pw-store"
err := passgo.GetStore(&store)
if err != nil { ... }
passlist := store.List()
for _,x := range passlist {
if x.Pathname == "myPass" {
p, err := store.Decrypt(x.Pathname)
if err == nil {
passgo.Clip(p) // put on the clipboard
} else {
log.Fatal("Cannot decrypt ", x.Pathname)
}
}
}
/// or just do:
p, err := store.Decrypt("myPass")
...
Also included is a simple GUI front-end using Gio
that works on MacOS and Android. See cmd/passgo-gui.
Building the Android APK
Use scripts/build.sh — do not build by hand:
./scripts/build.sh phone # build + install on the phone
./scripts/build.sh phone --no-install
./scripts/build.sh emu # emulator build (amd64)
It outputs cmd/passgo-gui/passgo-gui.apk (APKs are git-ignored and
regenerated by the script). The script, in order:
gogio -target android -targetsdk 34(from~/go/bin; packages the Go code plus the*.jarJNI classes found incmd/passgo-gui/),- apktool decode → inject
MANAGE_EXTERNAL_STORAGEinto the manifest (gogio's hardcoded permission table lacks it, and without it the system "All files access" toggle is grayed out on Android 11+) → apktool rebuild, - sign with the debug keystore (
~/.android/debug.keystore), adb install -r.
Prereqs: JDK, Go + gogio, Android SDK at ~/android-sdk
(platform-tools + build-tools 35.0.0). apktool v3.0.3 is auto-downloaded
to ~/android-sdk/tools/apktool.jar if missing. The script checks each
prereq and says what is missing. The phone is reached via adb over the
WireGuard address (see the global AGENTS.md).