Index | Thread | Search

From:
Chris Billington <cbillington@emulti.net>
Subject:
Re: [WIP]/help wanted: browserpass-native messaging host for pass/password-store
To:
Stuart Henderson <stu@spacehopper.org>
Cc:
ports@openbsd.org
Date:
Tue, 8 Jul 2025 12:21:16 +0800

Download raw body.

Thread
On Mon, 7 Jul 2025 16:32:16 +0100
Stuart Henderson <stu@spacehopper.org> wrote:

> On 2025/07/07 23:16, emulti@disroot.org wrote:
> > 
> > On 2025/07/07 15:30, emulti@disroot.org wrote:
> > >> 
> > >> A browser plugin 'browserpass' exists for Firefox/Chromium that
> > >> interfaces with the 'pass' password manager (password-store
> > >> package). In my testing it is light and fast, and improvement on
> > >> the likes of keepassxc-browser.
> > >> 
> > >> It requires a 'native messaging' binary written in Go, that
> > >> supports pledge() on OpenBSD.
> > >> 
> > >> Upstream: https://github.com/browserpass/browserpass-native/
> > >> 
> > >> Installing manually was a bit of a pain, requiring patches to the
> > >> provided Makefile to get around incompatibilities between sed
> > >> and GNU sed, install and GNU install. 
> > >> 
> > >> I tried to use the MODULES= lang/go infrastructure in
> > >> lang/go/go.port.mk, but no distribution file can be found:
> > >> 
> > >> ===>>  Checking files for browserpass-native-3.1.0
> > >> >> Fetch
> > >> >> https://proxy.golang.org/github.com/browserpass/browserpass-native/@v/v3.1.0.zip
> > >> ftp: Error retrieving
> > >> https://proxy.golang.org/github.com/browserpass/browserpass-native/@v/v3.1.0.zip:
> > >> 404 Not Found ... 
> > >> 
> > >> I expected go to then head off and retrieve the distfile from
> > >> github, as but it just cycles through the standard
> > >> ftp.openbsd.org etcetera. So I fell back to using GH_ACCOUNT and
> > >> friends.
> > >> 
> > >> I then tried building the port using this Makefile:
> > >> 
> > >> COMMENT=	Native Messaging host for the Browserpass browser
> > >> plugin ONLY_FOR_ARCHS = amd64
> > >> 
> > >> DISTNAME=	browserpass-native-3.1.0
> > >> CATEGORIES=	security
> > >> EXTRACT_SUFX=	.zip
> > >> HOMEPAGE=
> > >> https://github.com/browserpass/browserpass-native
> > >> MAINTAINER=	Chris Billington <emulti@disroot.org>>
> > >> 
> > >> # ISC License
> > >> PERMIT_PACKAGE=	Yes
> > >> 
> > >> # uses pledge()
> > >> WANTLIB += c pthread
> > >> 
> > >> GH_ACCOUNT =            browserpass
> > >> GH_PROJECT =            browserpass-native
> > >> GH_TAGNAME =            3.1.0
> > >> 
> > >> #MODULES=	lang/go
> > >> #MODGO_MODNAME = github.com/browserpass/browserpass-native
> > >> #MODGO_VERSION = v3.1.0
> > >> 
> > >> RUN_DEPENDS=	
> > >>                 
> > >> USE_GMAKE=	Yes
> > >> 
> > >> #WRKDIST=        $
> > >> #{WRKDIR}/github.com/browserpass/browserpass-native@$
> > >> #{MODGO_VERSION}
> > >> 
> > >> .include <bsd.port.mk>>
> > >> 
> > >> Tarball of the WIP port is also attached.
> > >> 
> > >> 'make build' gives the following (ports tree is owned by
> > >> myuser/wsrc):
> > >> 
> > >> $ make build
> > >> ===>  Generating configure for browserpass-native-3.1.0
> > >> ===>  Configuring for browserpass-native-3.1.0
> > >> ===>  Building for browserpass-native-3.1.0
> > >> env GOOS=openbsd GOARCH=amd64 go build -o browserpass-openbsd64
> > >> failed to initialize build cache
> > >> at /browserpass-native-3.1.0_writes_to_HOME/.cache/go-build:
> > >> mkdir /browserpass-native-3.1.0_writes_to_HOME: permission denied
> > >> gmake: *** [Makefile:48: browserpass-openbsd64] Error 1 ***
> > >> Error 2 in . (/usr/ports/infrastructure/mk/bsd.port.mk:3069
> > >> '/usr/ports/pobj/browserpass-native-3.1.0/.build_done':
> > >> @cd /usr/ports/pobj/...) *** Error 2
> > >> in /usr/ports/security/browserpass-native
> > >> (/usr/ports/infrastructure/mk/bsd.port.mk:2712 'build':
> > >> @lock=browserpass-native-3.1.0...)
> > >> 
> > >> Running 'doas make build' works, but the cache is put in 
> > >> /browserpass-native-3.1.0_writes_to_HOME/ which I'm sure can't be
> > >> right.
> > 
> > > The distfile doesn't contain the other go modules used by
> > > browserpass-native - "go build" as run by the upstream makefile
> > > tries to download them, they need to be listed in the port
> > > makefile so this can be handled by ports instead. (Ports aren't
> > > allowed to download during build anyway - recommended that you
> > > build ports as the _pbuild user which is done automatically if
> > > you set PORTS_PRIVSEP=Yes in mk.conf and that user is blocked
> > > from network access by the default pf.conf).
> > >
> > > As you saw, the normal ports infrastructure for handling go ports
> > > doesn't work for browserpass-native with the v3 tagged version. I
> > > think this is because something upstream isn't quite how go wants
> > > it to be setup -
> > > https://pkg.go.dev/github.com/browserpass/browserpass-native
> > > doesn't show it either.
> > 
> > > You can generate a first cut at a port for the (much newer)
> > > non-tagged version that does show up there quite easily -
> > > "portgen go github.com/browserpass/browserpass-native". Though
> > > that's not very helpful if you want the tagged version..
> > >
> > > (If things were setup how go wants them, I'd expect "portgen go
> > > github.com/browserpass/browserpass-native/v3" to generate a port
> > > for the tagged version, but that just fails at the moment).
> > 
> > Thanks Stuart. After setting up PRIVSEP I tried out portgen- very
> > neat indeed!
> > 
> > I made the attached port with portgen from the non-tagged version on
> > pkg.go.dev. It builds and installs fine, but the 'browser-files'
> > firefox-host.json/chromium-host.json files that are supposed to be
> > installed to /usr/local/lib don't seem to be installed. They
> > exist in the distfile but not the package as built. Picking them out
> > manually and copying them to the appropriate browser location, the
> > package works fine. Is it necessary to add some kind of post-install
> > step to extract them from the port Makefile, or somehow tag them for
> > packaging?
> 
> yes, post-install then regen plist. I don't think it is worth trying
> to use upstream's Makefile. to insert the binary path into the json
> files you could do something like
> 
> .for i in chromium-host.json firefox-host.json
> 	sed 's|"path": ".*"|"path": "$
> {TRUEPREFIX}/bin/browserpass-native"|' \ < ${WRKSRC}/browser-files/$i
> > ${PREFIX}/wherever/$i .endfor
> 
> > tar.gz of the port files (still from mystuff/go) is attached.
> 
> : COMMENT =       Native Messaging host for the Browserpass browser
> plugin
> 
> please lower-case most of that; this would be alright:
> 
> COMMENT =       native messaging host for the Browserpass browser
> plugin
> 
> : MODGO_VERSION = v0.0.0-20250425203345-8419b15841c9
> : DISTNAME =      browserpass-native-${MODGO_VERSION}
> : PKGNAME =       browserpass-native-20250425203345
> 
> I suggest this so we don't need to use EPOCH if there's a later tagged
> version that works properly with infrastructure
> 
> PKGNAME =       browserpass-native-0.20250425203345
> 
> (or just browserpass-native-0.20250425 would be fine too I think)
> 
> : CATEGORIES =    go
> 
> that's just a placeholder, please replace with the actual category
> that you want
> 
> : Read ${LOCALBASE}/share/doc/pkg-readmes/browserpass-native for
> : instructions on how to enable specific
> browsers to use the application, and add unveil() configuration to
> allow access to it.
> 
> DESCR wouldn't normally refer to the pkg-readme (pkg_add already tells
> the user to read it).
> 
> > -- 
> > Chris <emulti@disroot.org>
> 
> 

Have implemented your suggested changes and added the post-install
actions.

For the Category, I am suggesting 'security' as that is where keepassxc
and password-store live. Is that OK?

I have chosen to put the firefox-host.json and chromium-host.json files
in ${LOCALBASE}/share/examples/browserpass-native/ rather than
cluttering up ../lib

When they are copied to the user's browser native-messaging directories,
I found the {firefox,chromium}-hosts.json file needs to be
com.github.browserpass.native.json in both cases, probably because
it is some kind of standard.

I hope this port is a useful alternative to heavier stuff like
keepassxc/keepassxc-browser. The pass ecosystem seems quite active, and
this messaging application has pledge support.

Port files attached for your comments.

-- 
Chris Billington