Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/actions/build-portal/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Construction et contrôle du portail
description: >-
Étapes communes au déploiement et à la vérification des pull requests : construction stricte du
site, contrôle d'accessibilité des pages, export des PDF et validation PDF/UA-1. Le site construit
reste dans ./site pour les étapes suivantes du workflow appelant.

runs:
using: composite
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip

- name: Install dependencies
shell: bash
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt -r requirements-pdf.txt
sudo apt-get update
sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 poppler-utils

- name: Build documentation
shell: bash
run: mkdocs build --strict

# Accessibilité des pages HTML (WCAG 2 AA, moteur axe) : Chrome du runner, sans téléchargement
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22"

- name: Check accessibility (pa11y, axe)
shell: bash
env:
PUPPETEER_SKIP_DOWNLOAD: "true"
CHROME: /usr/bin/google-chrome
run: |
npm install --no-save --no-audit --no-fund pa11y@9
node scripts/check_a11y.js site

- name: Export PDF
shell: bash
run: python scripts/export_pdf.py

- name: Cache veraPDF
uses: actions/cache@v4
with:
path: ~/.cache/verapdf
key: verapdf-1.30.2

- name: Validate PDF/UA-1
shell: bash
run: bash scripts/check_pdf_ua.sh
45 changes: 3 additions & 42 deletions .github/workflows/check-pr.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Vérification des pull requests (build, accessibilité et PDF)

# Mêmes étapes de construction que le déploiement, sans déploiement ni secret :
# Mêmes étapes de construction que le déploiement (.github/actions/build-portal), sans déploiement ni secret :
# le site et les PDF du portail (livre blanc, statuts, règlement intérieur, charte) sont validés
# avant fusion, et les PDF joints en artefact pour relecture.

Expand All @@ -24,47 +24,8 @@ jobs:
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt -r requirements-pdf.txt
sudo apt-get update
sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 poppler-utils

- name: Build documentation
run: mkdocs build --strict

# Accessibilité des pages HTML (WCAG 2 AA, moteur axe) : Chrome du runner, sans téléchargement
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22"

- name: Check accessibility (pa11y, axe)
env:
PUPPETEER_SKIP_DOWNLOAD: "true"
CHROME: /usr/bin/google-chrome
run: |
npm install --no-save --no-audit --no-fund pa11y@9
node scripts/check_a11y.js site

- name: Export PDF
run: python scripts/export_pdf.py

- name: Cache veraPDF
uses: actions/cache@v4
with:
path: ~/.cache/verapdf
key: verapdf-1.30.2

- name: Validate PDF/UA-1
run: bash scripts/check_pdf_ua.sh
- name: Build and check the portal
uses: ./.github/actions/build-portal

# Polices embarquées : Inter pour le texte ; toute autre police signale un glyphe absent d'Inter
- name: List embedded fonts
Expand Down
31 changes: 5 additions & 26 deletions .github/workflows/deploy-o2switch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,12 @@ jobs:
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt -r requirements-pdf.txt
sudo apt-get update
sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 lftp

- name: Build documentation
run: mkdocs build --strict

- name: Export whitepaper PDF
run: python scripts/export_pdf.py

- name: Cache veraPDF
uses: actions/cache@v4
with:
path: ~/.cache/verapdf
key: verapdf-1.30.2
# Construction stricte, accessibilité, PDF et PDF/UA-1 : mêmes contrôles que les pull requests
- name: Build and check the portal
uses: ./.github/actions/build-portal

- name: Validate PDF/UA-1
run: bash scripts/check_pdf_ua.sh
- name: Install lftp
run: sudo apt-get install -y lftp

- name: Add Apache configuration
run: cp deploy/o2switch/htaccess site/.htaccess
Expand Down
48 changes: 48 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Release (PDF et brouillon Zenodo)

# À la publication d'une release GitHub (étiquette vX.Y, numéro de version du livre blanc) :
# - reconstruit et contrôle le portail à cette étiquette, puis joint à la release les cinq PDF
# (livre blanc FR et EN, projet de statuts, règlement intérieur, charte d'éthique) ;
# - si le secret ZENODO_TOKEN existe, dépose le livre blanc sur Zenodo en brouillon
# (scripts/zenodo_draft.py) : le DOI n'est attribué qu'à la publication manuelle depuis Zenodo.
# Ne pas activer en plus l'intégration GitHub de Zenodo, qui créerait un second dépôt par release.

on:
release:
types: [published]

permissions:
contents: write

jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name }}
persist-credentials: false

- name: Build and check the portal
uses: ./.github/actions/build-portal

- name: Attach PDF to the release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.event.release.tag_name }}
run: gh release upload "$TAG" $(find site -name 'otspi-*.pdf' | sort) --clobber --repo "$GITHUB_REPOSITORY"

- name: Zenodo draft (white paper)
env:
ZENODO_TOKEN: ${{ secrets.ZENODO_TOKEN }}
ZENODO_URL: ${{ vars.ZENODO_URL }}
ZENODO_DEPOSITION_ID: ${{ vars.ZENODO_DEPOSITION_ID }}
TAG: ${{ github.event.release.tag_name }}
run: |
if [ -z "$ZENODO_TOKEN" ]; then
echo "Secret ZENODO_TOKEN absent : pas de dépôt Zenodo." | tee -a "$GITHUB_STEP_SUMMARY"
exit 0
fi
python scripts/zenodo_draft.py --version "${TAG#v}" \
site/livre-blanc/otspi-livre-blanc.pdf site/white-paper/otspi-white-paper.pdf
86 changes: 62 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,38 +42,76 @@ La gouvernance d'OTSPI applique une séparation stricte des devoirs conformémen
## 📁 Panoplie Documentaire Complète

```
├── docs/
│ ├── index.md # Page d'accueil du portail web about.otspi.org
│ ├── CNAME # Configuration du domaine personnalisé (about.otspi.org)
├── docs/ # Contenu du portail about.otspi.org
│ ├── index.md # Page d'accueil (bandeau dans overrides/home.html)
│ ├── livre-blanc/ # Livre blanc (FR, fait foi) et historique des versions
│ ├── white-paper/ # Traduction anglaise du livre blanc
│ ├── statuts/
│ │ └── statuts-association.md # Statuts constitutifs adoptés (OTSPI, Lyon, 20 septembre 2026)
│ │ └── statuts-association.md # Projet de statuts, soumis à l'AG constitutive (non encore adopté)
│ ├── reglement-interieur/
│ │ └── reglement-interieur.md # RI complet : cursus Officiers, MFA FIPS/ANSSI, Key Custodians, dépenses
│ ├── administratif/
│ │ ├── pv-ag-constitutive-modele.md # PV d'AG Constitutive (élections, mandats fiscaux L.80 CB, RC Pro)
│ │ ├── rescrit-fiscal-mecenat.md # Demande formelle de rescrit fiscal DGFIP (Méthode 4P)
│ │ └── declaration-prefecture.md # Guide des formalités préfecture (RNA, JOAFE, SIRET)
│ ├── cadrage/
│ │ ├── index.md # Présentation du socle d'audit initial TSP / PKI
│ │ ├── cp-cps-cadre.md # Cadre général CP/CPS conforme RFC 3647 & ETSI EN 319 411
│ │ ├── pssi.md # PSSI (ISO 27001 & ETSI EN 319 401, RSSI, incidents)
│ │ └── termination-plan.md # Plan de fin d'activité (archivage 10-30 ans, séquestre financier)
│ │ └── reglement-interieur.md # RI : cursus Officiers, MFA FIPS/ANSSI, Key Custodians, dépenses
│ ├── gouvernance/
│ ├── charte-ethique.md # Charte d'éthique, de déontologie et de gestion désintéressée
│ │ └── comite-technique.md # Articulation CPC (PMA), TSC (ingénierie logicielle) & RFCs
│ │ ├── charte-ethique.md # Charte d'éthique, de déontologie et de transparence publique
│ │ └── comite-technique.md # Articulation CPC (PMA), TSC (ingénierie logicielle) et RFC
│ ├── administratif/ # PV d'AG constitutive (modèle), rescrit fiscal, guide préfecture…
│ ├── cadrage/ # Socle d'audit TSP / PKI : CP/CPS, PSSI, fin d'activité, OID, devis
│ ├── adhesion/
│ │ └── bulletin-adhesion.md # Formulaires d'adhésion (sympathisants, titulaires, bienfaiteurs)
│ └── reunions/
│ └── index.md # Registre public des réunions et procès-verbaux (caviardage RGPD)
├── mkdocs.yml # Configuration Material for MkDocs (about.otspi.org)
├── .github/workflows/
│ └── deploy-o2switch.yml # Déploiement automatique chez o2switch (FTPS)
├── LICENSE # Licence Creative Commons Attribution 4.0 International
└── README.md # Documentation générale du dépôt
│ │ └── bulletin-adhesion.md # Formulaires d'adhésion (sympathisants, titulaires, bienfaiteurs)
│ ├── reunions/ # Registre des réunions, transparence des hébergements (FR / EN)
│ ├── assets/ # Logos, police Inter (OFL), image de partage
│ ├── stylesheets/ # Charte du portail (extra.css), impression et PDF (print.css)
│ └── javascripts/ # Accessibilité, mesure d'audience sans cookie
├── overrides/ # Gabarits Material : accueil, 404, métadonnées de partage
├── hooks/page_lang.py # Langue de la balise <html> selon la page
├── scripts/ # Outils : voir ci-dessous
├── data/qtsp-count.json # Décompte des QTSP cité par le livre blanc (annexe C)
├── deploy/o2switch/ # Configuration Apache (.htaccess) et notes de déploiement
├── .github/workflows/ # Déploiement, vérification des PR, contrôles périodiques
├── mkdocs.yml # Configuration Material for MkDocs
└── LICENSE # Creative Commons Attribution 4.0 International
```

---

## 🛠️ Outils et contribution

Le portail est construit avec [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). Toute pull request vers `main` est vérifiée par `.github/workflows/check-pr.yml` (construction stricte, accessibilité, PDF) ; la fusion déclenche le déploiement (`deploy-o2switch.yml`), qui repasse les mêmes contrôles. Les deux workflows partagent l'action `.github/actions/build-portal`.

**Construire et prévisualiser le site**

```sh
pip install -r requirements.txt
mkdocs serve # http://127.0.0.1:8000, rechargé à chaque modification
mkdocs build --strict # échoue sur tout lien ou ancre interne cassé
```

**Scripts** (`scripts/`)

| Script | Rôle | Prérequis |
|---|---|---|
| `export_pdf.py` | PDF balisés du livre blanc (FR, EN), du projet de statuts, du règlement intérieur et de la charte, dans `site/` | `pip install -r requirements-pdf.txt` (WeasyPrint, Pango) |
| `check_pdf_ua.sh` | Validation PDF/UA-1 de ces PDF avec veraPDF (téléchargé et vérifié au premier lancement) | Java |
| `check_a11y.js` | Accessibilité WCAG 2 AA (pa11y, moteur axe) de toutes les pages du site construit | Node.js, `npm install --no-save pa11y@9`, Chrome |
| `build_diagrams.py` | Régénère les schémas SVG du livre blanc et l'organigramme de l'accueil | — |
| `build_og_image.py` | Régénère l'image de partage par défaut (`docs/assets/og/og-portail.png`) | Chrome |
| `zenodo_draft.py` | Brouillon Zenodo du livre blanc à la publication d'une release (`release.yml`) ; le DOI n'est attribué qu'à la publication manuelle sur Zenodo | secret `ZENODO_TOKEN` |
| `count_qtsp.py` | Décompte des QTSP des listes de confiance de l'EEE (`data/qtsp-count.json`) | — |
| `check_links.py` | Liens externes cassés (contrôle mensuel) | — |
| `check_sites.sh` | Codes HTTP, redirections et certificats des sites OTSPI (contrôle quotidien) | curl, openssl |

Chaîne complète, comme en CI :

```sh
mkdocs build --strict
python scripts/export_pdf.py
bash scripts/check_pdf_ua.sh
npm install --no-save pa11y@9 && node scripts/check_a11y.js site
```

Les schémas et l'image de partage sont générés puis versionnés : après modification de leur source, relancer le script correspondant et commiter le résultat.

---

## 📬 Contact

- **Contact unique (Adhésions, Questions générales, Sécurité)** : `contact@otspi.org`
Expand Down
2 changes: 1 addition & 1 deletion deploy/o2switch/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Ce dossier décrit l'hébergement du portail `about.otspi.org` chez o2switch (so
## Ce qui est en place

- `htaccess` : redirection HTTPS, domaine canonique, page 404, en-têtes de sécurité, compression et durées de cache. Il est copié à la racine du site au déploiement.
- `.github/workflows/deploy-o2switch.yml` : construit le site, exporte et valide les PDF (PDF/UA-1), ajoute le `.htaccess`, puis envoie tout en FTPS (TLS obligatoire, certificat vérifié).
- `.github/workflows/deploy-o2switch.yml` : construit et contrôle le site avec l'action commune `.github/actions/build-portal` (construction stricte, accessibilité, export et validation PDF/UA-1 des PDF, mêmes contrôles que les pull requests), ajoute le `.htaccess`, puis envoie tout en FTPS (TLS obligatoire, certificat vérifié).
- Un compte FTP dédié, cantonné au seul répertoire du site. Il est renseigné dans les secrets `O2_FTP_USERNAME` et `O2_FTP_PASSWORD` du dépôt ; l'hôte est dans la variable `O2_FTP_HOST`.

## Bascule (faite le 26 septembre 2026)
Expand Down
67 changes: 67 additions & 0 deletions docs/participer/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
title: "Participer à OTSPI"
description: "Comment contribuer à OTSPI pendant sa constitution : consultation sur le livre blanc, manifeste, partenariats, code, documents de gouvernance et signalement de vulnérabilités."
---

# Participer

OTSPI est **en cours de constitution** : l'association n'est pas encore déclarée et ne recueille pas d'adhésions. Il est pourtant déjà possible de contribuer au projet, publiquement et sans inscription préalable.

<div class="grid cards otspi-docs" markdown>

- :material-comment-text-multiple-outline:{ .lg .middle } __Commenter le livre blanc__

---

Le livre blanc est en consultation publique : remarques, objections et propositions sont reçues sur GitHub Discussions, où elles restent lisibles par tous.

[:octicons-arrow-right-24: Donner votre avis](https://github.com/otspi/organisation/discussions/new?category=ideas)
[:octicons-arrow-right-24: Lire le livre blanc](../livre-blanc/index.md)

- :material-draw-pen:{ .lg .middle } __Signer le manifeste__

---

Le Manifeste pour une identité numérique libre et ouverte rassemble celles et ceux qui soutiennent des services de confiance conçus comme un commun numérique.

[:octicons-arrow-right-24: Lire et signer le manifeste](https://www.otspi.org/manifeste.html)

- :material-handshake-outline:{ .lg .middle } __Devenir partenaire__

---

Hébergeurs, auditeurs, laboratoires, collectivités, financeurs : les besoins et les postes de dépense sont décrits dans le livre blanc.

[:octicons-arrow-right-24: Proposer un partenariat](mailto:contact@otspi.org?subject=Partenariat%20OTSPI)
[:octicons-arrow-right-24: Postes de dépense (livre blanc, § 5.5)](../livre-blanc/index.md#55-structure-de-couts-et-garanties)

- :material-code-braces:{ .lg .middle } __Contribuer au code__

---

Le moteur de services de confiance et le démonstrateur sont publiés sous licence libre (EUPL 1.2) ; un pilote d'horodatage RFC 3161 fonctionne déjà, en environnement d'essai non qualifié.

[:octicons-arrow-right-24: Moteur (Rust)](https://github.com/otspi/open-eidas)
[:octicons-arrow-right-24: Démonstrateur](https://github.com/otspi/demo)
[:octicons-arrow-right-24: Essayer le pilote](https://demo.open-eidas.eu/)

- :material-file-document-edit-outline:{ .lg .middle } __Améliorer les documents__

---

Statuts, règlement intérieur, charte et socle de conformité sont versionnés sur GitHub : chaque page du portail propose un lien d'édition, et toute modification passe par une proposition publique.

[:octicons-arrow-right-24: Dépôt des documents](https://github.com/otspi/organisation)
[:octicons-arrow-right-24: Historique du projet de statuts](../statuts/historique.md)

- :material-shield-alert-outline:{ .lg .middle } __Signaler une vulnérabilité__

---

Les signalements de sécurité suivent une divulgation coordonnée : écrire à `contact@otspi.org` avec `[Sécurité]` en objet, ou passer par les avis de sécurité privés de GitHub.

[:octicons-arrow-right-24: Avis de sécurité privés](https://github.com/otspi/organisation/security/advisories)

</div>

L'actualité du projet est publiée sur le [site de l'association](https://www.otspi.org/actualites.html), avec un flux Atom.
Loading
Loading