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
15 changes: 15 additions & 0 deletions docs/statuts/historique.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Historique du projet de statuts

**Ce qui a changé dans le projet, et quand**

Les statuts d'OTSPI sont un **projet**, soumis au vote de l'assemblée générale constitutive, qui n'a pas encore eu lieu. Cette page retrace les modifications de fond apportées au projet depuis sa première rédaction ; le [dépôt du portail](https://github.com/otspi/organisation/commits/main/docs/statuts/statuts-association.md) conserve l'historique complet, ligne à ligne.

| Date | Modification |
|---|---|
| 6 septembre 2026 | Premier projet, sous le nom « Open eIDAS » : association d'intérêt général à but non lucratif, consacrée à des infrastructures de confiance numérique ouvertes. Le même jour : conformité aux critères de l'intérêt général (articles 200 et 238 bis du CGI) et aux principes des associations reconnues d'utilité publique ; bénévolat strict des dirigeants, avec la possibilité d'employer un personnel technique rémunéré sans rôle dans la gouvernance ; contribution au prix coûtant pour les usages massifs, recettes intégralement réinvesties. |
| 20 septembre 2026 | Refonte sous le nom « Open Trusted Service Provider Initiative » (OTSPI), avec le règlement intérieur et les documents de gouvernance. Création du statut de membre bienfaiteur, sans droit de vote. |
| 21 septembre 2026 | Déchéance d'un membre titulaire portée de deux à trois absences consécutives à l'assemblée générale ordinaire (article 5 ter). |
| 25 septembre 2026 | Texte présenté comme un projet non encore adopté ; la date de signature est laissée à compléter le jour de l'assemblée générale constitutive. Ajout de la vacance initiale du CPC (article 8 bis, alinéa 5 bis) : tant que le comité n'est pas constitué, ses compétences exclusives ne peuvent être exercées par aucun autre organe. |
| 27 septembre 2026 | Mise en forme, sans modification du texte : listes rétablies. Version PDF balisée, téléchargeable depuis la page du projet de statuts. |

Le [règlement intérieur](../reglement-interieur/reglement-interieur.md) et la [charte d'éthique](../gouvernance/charte-ethique.md) suivent le projet de statuts ; leurs modifications sont consultables dans le même dépôt.
11 changes: 10 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ edit_uri: edit/main/docs/

copyright: Copyright &copy; 2026 OTSPI — Contenu sous licence Creative Commons Attribution 4.0 International (CC-BY-4.0).

# Liens internes : un lien vers une ancre absente (titre renommé, par exemple) fait échouer
# le build strict, comme un lien vers une page absente.
validation:
anchors: warn

hooks:
- hooks/page_lang.py

Expand Down Expand Up @@ -68,8 +73,11 @@ extra_css:
- stylesheets/print.css

plugins:
# Recherche en français et en anglais (livre blanc et page des hébergements existent dans les deux langues)
- search:
lang: fr
lang:
- fr
- en

markdown_extensions:
- admonition
Expand Down Expand Up @@ -118,6 +126,7 @@ nav:
- Historique des versions: livre-blanc/historique.md
- Statuts et gouvernance:
- Projet de statuts: statuts/statuts-association.md
- Historique du projet de statuts: statuts/historique.md
- Charte d'éthique: gouvernance/charte-ethique.md
- Organisation technique et CPC: gouvernance/comite-technique.md
- Règlement intérieur:
Expand Down
Loading
Loading