#!/usr/bin/env python3 """Stopper buildet hvis et blogindlæg mangler et gyldigt `godkendt:`-stempel. PUBLISH_KEY= python3 scripts/verify-approvals.py """ import hmac import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from godkendelse import BLOG, assets_for, read_text, sign, stamp_of # noqa: E402 def main(): key = os.environ.get("PUBLISH_KEY") if not key: print("PUBLISH_KEY mangler; kan ikke verificere godkendelser.", file=sys.stderr) return 1 key = bytes.fromhex(key) bad = ok = 0 def fail(msg): nonlocal bad print(f"✗ {msg}", file=sys.stderr) bad += 1 for name in sorted(os.listdir(BLOG)): path = f"{BLOG}/{name}" if name == "_index.md": continue # Zola bygger enhver .md under content/blog, så intet må ligge uden for en bundle. if not os.path.isdir(path): fail(f"{path}: et indlæg skal ligge som {BLOG}//index.md") continue rel = f"{path}/index.md" if not os.path.isfile(rel): fail(f"{path}/: filer uden et godkendt indlæg") continue text = read_text(rel) stamp, draft = stamp_of(text) if draft: fail(f"{rel}: udkast (draft: true) må ikke ligge i det offentlige repo") continue if not stamp: fail(f"{rel}: mangler godkendelse") continue try: assets = assets_for(name) except ValueError as e: fail(str(e)) continue if not hmac.compare_digest(stamp, sign(key, rel, text, assets)): fail(f"{rel}: godkendelsen passer ikke til indholdet (ændret efter godkendelse?)") continue ok += 1 print(f"✓ {rel}" + (f" (+{len(assets)} billeder)" if assets else "")) if bad: print(f"\n{bad} indlæg er ikke godkendt. Intet bliver udgivet.", file=sys.stderr) return 1 print(f"\nAlle {ok} indlæg er godkendt.") return 0 if __name__ == "__main__": sys.exit(main())