^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  1) """Synthetic two-customer document portal. No real data or credentials."""
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  2) import os
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  3) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  4) DOCUMENTS = {
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  5)     "alice-1": {"owner": "alice", "body": "SYNTHETIC_ALICE_DOCUMENT"},
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  6)     "bob-1": {"owner": "bob", "body": "SYNTHETIC_BOB_DOCUMENT"},
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  7) }
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  8) DEMO_TOKENS = {"demo-alice-token": "alice", "demo-bob-token": "bob"}
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100  9) SIGNING_KEY = os.getenv("DEMO_SIGNING_KEY", "demo-insecure-fallback")
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 10) DEBUG = os.getenv("DEMO_DEBUG", "true").lower() == "true"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 11) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 12) def authenticate(token):
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 13)     return DEMO_TOKENS.get(token)
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 14) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 15) def load_by_id(document_id):
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 16)     return DOCUMENTS.get(document_id)
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 17) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 18) def read_document(user, document_id):
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 19)     if not user:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 20)         return 401, "login required"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 21)     doc = load_by_id(document_id)
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 22)     if doc is None:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 23)         return 404, "not found"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 24)     return 200, doc["body"]
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 25) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 26) def export_document(user, document_id):
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 27)     if not user:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 28)         return 401, "login required"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 29)     doc = load_by_id(document_id)
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 30)     if doc is None:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 31)         return 404, "not found"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 32)     return 200, "EXPORT:" + doc["body"]
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 33) 
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 34) def read_guarded_document(user, document_id):
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 35)     if not user:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 36)         return 401, "login required"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 37)     doc = load_by_id(document_id)
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 38)     if doc is None:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 39)         return 404, "not found"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 40)     if doc["owner"] != user:
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 41)         return 403, "forbidden"
^435c047 (Whitepaper Test 2026-10-29 16:25:45 +0100 42)     return 200, doc["body"]
