908f7ea973
Participation privacy (decision_2026-10-29_participation-privacy-mechanism): a sign-up is a private Join naming the meeting point, addressed to nobody, handled by the backend on emission. Attendee lists hold member URNs hashed from (WebID, event, a secret kept in the participant's profile), so counts stay public and only contacts recognise anyone; the creator has no read right and is notified anonymously. Each person's participations collection, created by the backend at the first sign-up, is readable by their /contacts WAC group only, never world-readable. The member URN is sticky per (meeting point, participant) and every collection write is verified by reading back, so a refused write leaves the act unrecorded and retryable. The EventRef mechanism and its browser-side provisioning are gone. The backend now runs with WebACL on, as the reference apps do, on its own secure datasets festipod / settings-festipod instead of the pod provider's settings dataset; pod-notifications needs it. The compose header and the deployment leaf say how to reset a stack whose datasets predate this. The rights matrix covers the new mechanism live (148 hard lines), including a forged contact Accept between throwaway accounts: the stranger enters the contacts list (platform defect, reported upstream) but is refused the profile and the participations. Tests may attack as long as they never break the dev environment (rule_tests-never-break-the-dev-environment). Also lands the coherence-pass work that was still uncommitted: contacts as the Pod's social graph and invite links, image upload to the Pod, the meeting-point form, profile completion gate, and the doctrine for them. Superseded briefs and decisions are deleted rather than annotated.
97 lines
5.1 KiB
Bash
97 lines
5.1 KiB
Bash
# Festipod — variables d'environnement (exemple)
|
|
#
|
|
# Copier en `.env` et renseigner les valeurs.
|
|
# En dev (`bun run dev`) ET en prod (`bun run start`), l'app sert depuis src/ et
|
|
# lit ces variables au RUNTIME (via l'endpoint /festipod-config.json de src/index.ts).
|
|
#
|
|
# REQUIS POUR LES TESTS. La suite Cucumber tourne sous `node` (pas sous Bun), qui
|
|
# ne charge pas `.env` tout seul : le harness le lit explicitement et LÈVE UNE
|
|
# ERREUR NOMMÉE si le mot de passe ou le fichier manquent. Or `.env` ET `*.ngw`
|
|
# sont tous deux gitignorés — un clone frais n'a donc ni l'un ni l'autre et ne
|
|
# peut pas exécuter `@data`/`@e2e` tant que ces deux valeurs ne sont pas fournies.
|
|
|
|
# ── Portefeuille partagé (stopgap staging) ─────────────────────────────────
|
|
# Mot de passe du portefeuille partagé.
|
|
# VIDE => rien n'est passé à `configure({ sharedWallet })` => le SDK refuse de
|
|
# signer l'entrée et l'app affiche son panneau d'erreur au lieu de démarrer.
|
|
# REQUIS en staging (onboarding d'un appareil sans wallet) ET pour les tests.
|
|
FESTIPOD_SHARED_WALLET_PASSWORD=
|
|
|
|
# Chemin vers le fichier portefeuille partagé (.ngw), absolu ou relatif à la
|
|
# racine. Servi en téléchargement à /shared-wallet.ngw. C'est la forme du DEV
|
|
# LOCAL et du harness de TESTS : le fichier vit sur le disque de la machine.
|
|
FESTIPOD_SHARED_WALLET_FILE=/chemin/absolu/vers/festipod-wallet.ngw
|
|
|
|
# Contenu du portefeuille partagé (.ngw), encodé en base64 — deuxième source
|
|
# pour le même fichier. C'est la forme des DÉPLOIEMENTS (conteneur) : *.ngw est
|
|
# gitignoré, donc `COPY . .` n'en embarque aucun et rien n'en monte un ; le
|
|
# fichier n'étant pas un secret (l'app le sert à quiconque ouvre l'app), il
|
|
# voyage comme une variable de config. `FESTIPOD_SHARED_WALLET_FILE` est
|
|
# prioritaire quand les deux sont renseignées — voir le commentaire dans
|
|
# src/index.ts. Générer la valeur avec, p.ex., `base64 -w0 festipod-wallet.ngw`.
|
|
FESTIPOD_SHARED_WALLET_FILE_BASE64=
|
|
|
|
# ── Seed automatique (opt-in) ──────────────────────────────────────────────
|
|
# Non vide => l'app amorce des données de démo dans un wallet VIDE au 1er login.
|
|
# OFF par défaut : laisser vide en usage normal.
|
|
FESTIPOD_AUTO_SEED=
|
|
|
|
# ── Serveur ────────────────────────────────────────────────────────────────
|
|
# Port HTTP du serveur (4000 : l'app est servie sur l'origine :4000 de la pile locale).
|
|
PORT=4000
|
|
|
|
# NODE_ENV=production bascule `bun run start` (pas de HMR). En dev, laisser vide.
|
|
NODE_ENV=
|
|
|
|
# ── Backend ActivityPods ───────────────────────────────────────────────────
|
|
# URL publique du backend Festipod (écoute sur le port 3003).
|
|
SEMAPPS_HOME_URL=http://localhost:3003
|
|
|
|
# URL publique du frontend (utilisée par le backend pour les OIDC redirects, etc.)
|
|
SEMAPPS_FRONT_URL=http://localhost:4000
|
|
|
|
# Endpoint SPARQL du Fuseki auquel se connecte le backend.
|
|
SEMAPPS_SPARQL_ENDPOINT=http://localhost:3030/
|
|
|
|
# Dataset Jena/Fuseki principal utilisé par le backend.
|
|
SEMAPPS_MAIN_DATASET=festipod
|
|
|
|
# Identifiants Jena/Fuseki.
|
|
SEMAPPS_JENA_USER=admin
|
|
SEMAPPS_JENA_PASSWORD=admin
|
|
|
|
# Redis : cache (db 3) et file des jobs (db 4).
|
|
SEMAPPS_REDIS_CACHE_URL=redis://localhost:6390/3
|
|
SEMAPPS_QUEUE_SERVICE_URL=redis://localhost:6390/4
|
|
|
|
# Dataset utilisé par le service auth.account.
|
|
SEMAPPS_AUTH_ACCOUNTS_DATASET_NAME=settings-festipod
|
|
|
|
# Dépôt de shapes/shapetrees utilisé pour déclarer les besoins d'accès.
|
|
SEMAPPS_SHAPE_REPOSITORY_URL=https://shapes.activitypods.org/
|
|
|
|
# Nom et description de l'application (backend).
|
|
SEMAPPS_APP_NAME=Festipod
|
|
SEMAPPS_APP_DESCRIPTION=Points de rencontre sur les événements publics
|
|
SEMAPPS_APP_LANG=en,fr
|
|
SEMAPPS_PORT=3003
|
|
|
|
# ── Frontend / Backend coupling ────────────────────────────────────────────
|
|
# URL du backend telle que vue par le navigateur.
|
|
VITE_BACKEND_URL=http://localhost:3003
|
|
|
|
# Client ID OAuth/Solid du backend (laisser vide pour dériver `${VITE_BACKEND_URL}/as/actor/app`).
|
|
# Le client_id DOIT être l'URI de l'acteur app : le pod enregistre l'app sous cette URI et
|
|
# ne sert l'en-tête `Link: rel="interop:registeredAgent"` (découverte de l'enregistrement
|
|
# par le auth provider) que si le client_id égalise l'acteur.
|
|
VITE_BACKEND_CLIENT_ID=
|
|
|
|
# Pod provider ActivityPods par défaut (optionnel). Vide → l'écran de login demande une URL.
|
|
VITE_POD_PROVIDER_URL=http://localhost:3000
|
|
|
|
# ── Outillage dev (facultatif) ─────────────────────────────────────────────
|
|
# Override du chemin local du polyfill @ng-eventually/sdk pour `pnpm run
|
|
# overlay:polyfill` (overlay local réactif). Défaut = ../nextgraph/ng-eventually-js/packages/sdk.
|
|
NG_EVENTUALLY_LOCAL=
|
|
|