Samme indhold, URL'er og udseende, bygget af en enkelt zola-binær og Tailwind standalone-CLI uden Node. Kanonisk domæne er asger.weirsoe.dk. Blogindlæg ligger som page bundles med frontmatter Zola forstår, så de gamle stempler er ugyldige, indtil scripts/omstempl.py er kørt med PUBLISH_KEY. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.1 KiB
Python
Executable File
66 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Stopper buildet hvis et blogindlæg mangler et gyldigt `godkendt:`-stempel.
|
|
|
|
PUBLISH_KEY=<hex> 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}/<slug>/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())
|