All checks were successful
build-and-push / build (push) Successful in 5s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
42 lines
1.8 KiB
Bash
42 lines
1.8 KiB
Bash
#!/bin/sh
|
|
# Bouwt de WKD-boom (advanced method) uit keys/<domein>/<adres>.asc met gpg-wks-client.
|
|
# Gebruik: build-wkd.sh <keys-dir> <out-dir> → <out-dir>/<domein>/{policy,hu/<hash>}
|
|
# Faalt hard (build breekt) als een .asc geen publieke sleutel is, een privésleutel bevat, de
|
|
# bestandsnaam niet bij de map hoort, of de sleutel geen UID met precies dat adres heeft.
|
|
set -eu
|
|
KEYS=$1; OUT=$2
|
|
export GNUPGHOME=$(mktemp -d); chmod 700 "$GNUPGHOME"
|
|
mkdir -p "$OUT"
|
|
n=0
|
|
for domdir in "$KEYS"/*/; do
|
|
[ -d "$domdir" ] || continue
|
|
domain=$(basename "$domdir" | tr 'A-Z' 'a-z')
|
|
mkdir -p "$OUT/$domain/hu"
|
|
: > "$OUT/$domain/policy" # verplicht; leeg volstaat (spec §3.1)
|
|
for f in "$domdir"*.asc; do
|
|
[ -f "$f" ] || continue
|
|
addr=$(basename "$f" .asc)
|
|
case "$addr" in
|
|
*@"$domain") ;;
|
|
*) echo "FOUT: $f — bestandsnaam moet <local-part>@$domain.asc zijn" >&2; exit 1 ;;
|
|
esac
|
|
if grep -q 'PRIVATE KEY BLOCK' "$f"; then
|
|
echo "FOUT: $f bevat een PRIVÉSLEUTEL — nooit in deze repo" >&2; exit 1
|
|
fi
|
|
gpg --batch --quiet --import "$f"
|
|
# exact-match op het adres (<addr>), niet substring
|
|
fpr=$(gpg --batch --with-colons --list-keys "<$addr>" 2>/dev/null | awk -F: '/^fpr/{print $10; exit}')
|
|
if [ -z "$fpr" ]; then
|
|
echo "FOUT: $f — geen sleutel met een UID die exact <$addr> bevat" >&2; exit 1
|
|
fi
|
|
# --install-key: exporteert binair, filtert op deze UID, schrijft <domain>/hu/<hash> (+ policy)
|
|
gpg-wks-client --quiet --directory "$OUT" --install-key "$fpr" "$addr"
|
|
hash=$(gpg-wks-client --print-wkd-hash "$addr" | awk '{print $1}')
|
|
[ -s "$OUT/$domain/hu/$hash" ] || { echo "FOUT: $OUT/$domain/hu/$hash niet aangemaakt" >&2; exit 1; }
|
|
echo "OK $addr → $domain/hu/$hash ($fpr)"
|
|
n=$((n+1))
|
|
done
|
|
done
|
|
rm -rf "$GNUPGHOME"
|
|
echo "Klaar: $n sleutel(s)."
|
|
find "$OUT" -type f | sort
|