#!/bin/bash set -o pipefail exec &>>/var/log/gpg-verify.log if [ $# -ne 4 ]; then exit 2 fi username="$1" nonce="$2" key="$3" sig="$4" cd /opt/autopeer NOTIFY_TO="$(python3 -c 'import config; print(config.NOTIFY_TO)')" echo "[autopeer $(hostname -f)] pgp: $username $key" | socat stdio "$NOTIFY_TO" keyring="$(mktemp)" curl -sL "$key" | gpg -o - --dearmor >"$keyring" || exit 7 gpgv_out="$(gpgv --status-fd 1 --keyring "$keyring" <(echo "$sig" | sed 's/-----BEGIN PGP SIGNATURE-----/&\n\n/') <(echo "$nonce"))" #[GNUPG:] VALIDSIG 1449565B711BABA3BC5347AE66B26E9D823D8647 2026-05-18 1779109475 0 4 0 22 10 00 1449565B711BABA3BC5347AE66B26E9D823D8647 echo "keyring: $keyring" echo "$gpgv_out" if ! echo "$gpgv_out" | grep -qP '^\[GNUPG:\] VALIDSIG '; then exit 3 fi verified_key="$(echo "$gpgv_out" | grep -P '^\[GNUPG:\] VALIDSIG ' | cut -d' ' -f12)" if [ -z "$verified_key" ]; then exit 4 fi if [ "$username" = "new" ]; then if new_user="$(grep -l -s -r -P '^\s*auth:\s*pgp-fingerprint\s+\Q'"$verified_key"'\E(\s|$)' /opt/autopeer/dn42-registry/data/mntner/ | perl -ne 's@^.*/@@; s@-MNT$@@; print lc;' | head -1)"; then echo "making $new_user"; exit 0 if getent passwd "$new_user" &>/dev/null; then exit 0 else echo "[autopeer $(hostname -f)] New user being created: $new_user from $key $verified_key" | socat stdio "$NOTIFY_TO" /usr/sbin/adduser --disabled-password --quiet --comment "created at $(date +%s) by $verified_key" --ingroup autopeer "$new_user" /usr/sbin/adduser "$new_user" bird ( umask 0077; touch "/var/log/autopeer/$new_user".{tim,io}; ) chown "$new_user" "/var/log/autopeer/$new_user".{tim,io} exit 0 fi else exit 5 fi else if grep -q -s -P '^\s*auth:\s*pgp-fingerprint\s+\Q'"$verified_key"'\E(\s|$)' /opt/autopeer/dn42-registry/data/mntner/"$(echo "$username" | perl -ne 's@$@-MNT@; print uc;')"; then exit 0 else exit 6 fi fi exit 1