The gpg_verify 1.0 PortGroup was added one year ago. I count 5 ports which are 
using it (4 of which were setup by the author of the PortGroup soon after it 
was introduced). However there are many more ports which could be using it. It 
would be nice if one day the MacPorts guide encouraged using this PortGroup. 
But I think there are some issues with this PortGroup's design that hinder its 
proliferation. Would it be worth improving?

I tried adding gpg_verify to gnupg2 recently. I eventually got it working, but 
I wasn't happy enough with the result to be convinced I should submit the 
result in a PR, especially since someone else maintained the port. I found 
gpg_verify much more tedious to add than compared to other PortGroups. I think 
the main reason is that it exposes what I consider "implementation details" the 
PortGroup should instead handle itself. One example is creating the separate 
post-checksum phase; I'm not aware when else a port would want to do PGP 
verification, so this is something that I think could be done in the PortGroup. 
Another is passing the complete distfile name to 
gpg_verify.verify_gpg_signature, when passing it without prepending 
${distpath}/ should be sufficient (I think `global distpath` would work, as 
done in the cargo_fetch 1.0 PortGroup). I also wonder if fetching the signature 
file could be handled by the PortGroup rather than requiring the portfile to 
add it to its distfiles and checksums.

Some other minor issues: The PGP verification step should print some 
acknowledgement when it is run with `port -v` and `port -d`; currently it only 
prints when there's an error (and without a precise reason specified). And 
rather than using a temporary .gnupg directory for each port, maybe a single 
permanent .gnupg directory somewhere in ${prefix}/var/macports should be used, 
so that keys don't have to be imported from scratch for each port build. I 
would also prefer the phrasing "PGP verification" rather than "GPG 
verification": PGP is the desired protocol, whereas GPG is just a common 
implementation of it (and it shouldn't matter whether it's the one used).

I really do think the PortGroup would be easier to use if all ports had to do 
is put the fingerprint(s) in the Portfile, rather than put the entire pubkey in 
the ports tree for each Portfile which might use it. If this means having to 
fetch the pubkeys, the issue with doing so (as the PortGroup mentions) is the 
intermittency of existing keyservers. I suggested using the high-availability 
keyserver keys.openpgp.org, but that was deemed too new for MacPorts to rely 
on. One year later, it is still around, is somewhat widely used—e.g. as the 
default keyserver in PGP suites—and claims 99.9998% uptime so far:

freenode #hagrid 2020-08-23 10:21 UTC <Valodim[m]> since recording uptime with 
uptimerobot on 2019-07-09, we had one downtime of roughly one minute, which was 
2019-11-11 23:24

I believe it would be good enough for MacPorts' purposes of retrieving a key 
for a given fingerprint. The problem with using it now is that GnuPG refuses to 
allow importing keys without owner information, which keys.openpgp.org requires 
key owners' permission to distribute: https://dev.gnupg.org/T4393. I have tried 
several keys for open source projects, none of which whose owner's info is 
distributed by keys.openpgp.org. MacPorts might be stuck with storing pubkeys, 
but maybe there is a better way of doing so.

I imagine there could be a much simpler interface for this using this 
PortGroup, making it more appealing to add it to ports. One possible idea:

gpg_verify.use_gpg_verification yes
gpg_verify.fingerprint hex_fingerprint_1 [hex_fingerprint2 …]
gpg_verify.signature_ext (sig|asc)

The PortGroup would handle fetching the .sig or .asc file for the distfile(s), 
and import the key using the fingerprint (if not already imported).

(Maybe the first line is redundant—using the PortGroup or its options at all 
would be what enables PGP verification.)

If custom signature filenames or URLs are frequently needed, then there might 
instead be options like `gpg_verify.signature_name sigfile` (fetching 
${master_sites}sigfile), or `gpg_verify.signature_url url` (fetching a complete 
URL to a signature file).

Maybe other package managers have ideas on how to handle PGP verification of 
upstream distfiles.

Christopher A. Chavez

Reply via email to