AcadeDoc/ACADENICE_PATCHES.md
Corentin 07d0b66fda feat(auth): Bloc 4b — OIDC client Authentik via openid-client (active par OIDC_ENABLED env)
Ajoute un flow d'authentification OIDC via Authentik (ou tout IdP conforme),
desactive par defaut. Le code est dormant tant que OIDC_ENABLED=true n'est
pas pose.

Server :
- apps/server/src/core/auth/oidc/oidc.module.ts (nouveau)
- apps/server/src/core/auth/oidc/oidc.service.ts (discovery + PKCE + callback + JIT provisioning)
- apps/server/src/core/auth/oidc/oidc.controller.ts (routes /api/auth/oidc/{login,callback,status})
- apps/server/src/core/auth/oidc/oidc.service.spec.ts (8 tests Jest, openid-client mocke)
- apps/server/src/integrations/environment/environment.service.ts : +9 getters OIDC
- apps/server/src/core/core.module.ts : +OidcModule dans imports

Client :
- apps/client/src/features/auth/queries/oidc-query.ts (hook useOidcStatus)
- apps/client/src/features/auth/components/oidc-login-button.tsx (bouton conditionnel)
- apps/client/src/features/auth/components/login-form.tsx : +OidcLoginButton

Securite :
- PKCE S256 obligatoire
- State CSRF en cookie httpOnly signe (5 min)
- Verification JWKS auto via openid-client v6
- Refetch userInfo apres echange du code
- JIT provisioning strict par defaut (OIDC_AUTO_PROVISION=false)

Lib : openid-client v6.8.2 (deja en deps), import lazy.

Documente dans ACADENICE_PATCHES.md (Patch 002) et .env.example.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 21:26:53 +02:00

8.7 KiB

Acadenice Patches

Liste des patches custom appliques sur le fork Acadenice de Docmost. Ce document est maintenu manuellement pour faciliter le rebase upstream.

Repo upstream : github.com/docmost/docmost Branche fork : acadenice/main

Conventions

  • Chaque patch est commit isole avec scope feat(rebrand) / feat(custom) / etc.
  • Les modifications in-line de fichiers upstream sont documentees ici avec rationale.
  • Les nouveaux fichiers (extensions Tiptap custom, hooks, etc.) vont dans des emplacements dedies pour minimiser les conflits de rebase.

Patch 001 — Rebrand minimal "Docmost" -> "DocAdenice"

Date : 2026-05-07 Scope : strings UI visibles utilisateur uniquement Rationale : nom temporaire pour les beta-testeurs en attendant le vrai rebranding (logo SVG + design system + manifest PWA). Conserve les identifiants techniques pour ne rien casser et faciliter le rebase upstream.

Fichiers modifies

Fichier Avant Apres
apps/client/index.html <title>Docmost</title> <title>DocAdenice</title>
apps/client/index.html apple-mobile-web-app-title content="Docmost" content="DocAdenice"
apps/client/src/lib/config.ts getAppName() return "Docmost" return "DocAdenice"
apps/client/src/components/layouts/global/app-header.tsx brand aria-label, alt, texte Docmost DocAdenice
apps/client/src/features/auth/components/auth-layout.tsx brand alt, texte Docmost DocAdenice
apps/client/src/components/ui/error-404.tsx titre 404 - Docmost - DocAdenice
apps/client/src/features/home/components/home-ai-prompt.tsx fallback workspace name "Docmost" "DocAdenice"
apps/server/src/integrations/transactional/emails/invitation-email.tsx "You have been invited to Docmost." "...DocAdenice."
apps/server/src/integrations/transactional/partials/partials.tsx footer © Docmost © DocAdenice
apps/server/src/core/workspace/services/workspace-invitation.service.ts sujet ... has accepted your Docmost invite ... DocAdenice invite
apps/server/src/core/workspace/services/workspace-invitation.service.ts sujet ... invited you to Docmost ... DocAdenice
apps/server/src/integrations/environment/environment.service.ts MAIL_FROM_NAME default 'Docmost' 'DocAdenice'
README.md header initial Docmost bloc "DocAdenice" ajoute au-dessus

KEEP volontairement (non modifies)

Element Raison
package.json name: "docmost" nom du package npm interne, casserait les imports/scripts Nx
@docmost/editor-ext workspace package identifiant pnpm workspace
docker-compose.yml service docmost identifiant technique
apps/server/src/core/auth/token.module.ts JWT issuer 'Docmost' changer invaliderait les tokens existants
apps/server/src/core/workspace/workspace.constants.ts 'docmost' dans DISALLOWED_HOSTNAMES blacklist hostnames reserves, technique
apps/server/src/common/helpers/types/export-metadata.types.ts source: 'docmost' format export pour interop avec Docmost officiel
apps/server/src/integrations/export/export.service.ts filename docmost-metadata.json format export, interop
apps/server/src/integrations/import/services/file-import-task.service.ts (vars docmostMetadata, prefix docmost-import, fonction readDocmostMetadata) identifiants techniques + lecture du format export Docmost
apps/server/src/integrations/import/utils/import.utils.ts readDocmostMetadata API publique du module import
apps/server/src/integrations/security/version.service.ts URL github.com/docmost/docmost/releases check de version vs upstream officiel
apps/server/src/integrations/telemetry/telemetry.service.ts endpoint tel.docmost.com telemetry upstream (a desactiver dans une iteration future via env var)
apps/client/src/components/settings/settings-sidebar.tsx help@docmost.com email support upstream officiel, on n'usurpe pas
apps/client/src/components/settings/app-version.tsx URL releases check de version upstream
apps/client/src/ee/** (license, AI, MCP, API keys, share-branding "Powered by Docmost") code Enterprise Edition propriete Docmost — copy commerciale, ne pas masquer
apps/client/src/ee/components/posthog-user.tsx source: "docmost-app" identifiant analytics upstream
apps/server/src/integrations/environment/environment.validation.ts URL clickhouse exemple message d'erreur dev-facing technique
apps/server/src/core/workspace/services/workspace.service.ts @deleted.docmost.com placeholder technique pour soft-delete

Patch 002 — Bloc 4b : OIDC client (Authentik) via openid-client

Date : 2026-05-07 Scope : nouveau flow d'authentification SSO via Authentik (ou tout IdP OIDC), desactive par defaut Rationale : preparer l'integration SSO pour le hub Acadenice. Le code est dormant tant que OIDC_ENABLED=true n'est pas pose, donc zero impact sur les deploiements actuels. Les fichiers sont isoles dans un sous-dossier dedie pour faciliter le rebase upstream.

Lib utilisee

openid-client v6.8.2 — deja en dependance dans apps/server/package.json. API fonctionnelle (pas un client object-oriented), import lazy au boot pour eviter l'overhead quand OIDC est off.

Fichiers crees

Fichier Role
apps/server/src/core/auth/oidc/oidc.module.ts Module Nest dedie, importe par CoreModule
apps/server/src/core/auth/oidc/oidc.service.ts Discovery, PKCE, callback handler, JIT provisioning
apps/server/src/core/auth/oidc/oidc.controller.ts Routes /api/auth/oidc/login, /callback, /status
apps/server/src/core/auth/oidc/oidc.service.spec.ts 8 tests unitaires (Jest) avec openid-client mocke
apps/client/src/features/auth/queries/oidc-query.ts Hook useOidcStatus() (React Query)
apps/client/src/features/auth/components/oidc-login-button.tsx Bouton SSO conditionnel sur le formulaire login

Fichiers modifies (touches minimales)

Fichier Modification
apps/server/src/integrations/environment/environment.service.ts +9 getters OIDC (isOidcEnabled, getOidcIssuer, ...) appendus en fin de classe
apps/server/src/core/core.module.ts +1 import + 1 ligne dans imports[] pour OidcModule
apps/client/src/features/auth/components/login-form.tsx +2 lignes : import + <OidcLoginButton /> au-dessus de <SsoLogin />
.env.example bloc OIDC commente ajoute en fin de fichier

Securite

  • PKCE S256 (verifier + challenge generes par openid-client)
  • State CSRF stocke en cookie httpOnly signe (5 min TTL)
  • ID token verifie par signature JWKS (gere par openid-client v6 via la Configuration cachee)
  • userInfo refetched apres l'echange — on ne fait pas confiance aux claims ID token seuls pour email
  • Cookies temporaires oidc_state / oidc_pkce clear immediatement apres consommation

Variables d'env

Var Defaut Role
OIDC_ENABLED false master switch
OIDC_ISSUER (vide) URL discovery (ex https://auth.example.com/application/o/docadenice/)
OIDC_CLIENT_ID (vide) requis
OIDC_CLIENT_SECRET (vide) requis
OIDC_REDIRECT_URI ${APP_URL}/api/auth/oidc/callback derive auto si non set
OIDC_SCOPES openid email profile groups
OIDC_PROVIDER_NAME SSO label affiche sur le bouton
OIDC_AUTO_PROVISION false si true : cree le user a la volee si email inconnu
OIDC_DEFAULT_WORKSPACE_ID (vide) requis si multi-workspace + auto-provision

TODO Bloc 4b suivants

  • Mapping groupes Authentik vers roles Docmost (OWNER / ADMIN / MEMBER)
  • Logout federe (RP-initiated logout vers Authentik)
  • Tests E2E avec un vrai container Authentik (Testcontainers)
  • Bouton login OIDC integre au flow enforceSso cote workspace (actuellement le bouton apparait des que OIDC_ENABLED=true, sans condition supplementaire)

TODO rebrand complet (futur)

  • Logo SVG / favicon DocAdenice (actuellement reutilise /icons/favicon-32x32.png upstream)
  • Manifest PWA (apps/client/public/manifest.json) : name, short_name, icons
  • apps/client/public/icons/ : pack d'icones Acadenice (16, 32, 192, 512, apple-touch)
  • Palette couleur design system (theme Mantine custom)
  • Eventuellement disable telemetry upstream par defaut (env var ou patch)
  • Decider du sort de l'EE branding ("Powered by Docmost" sur les pages partagees publiques)
  • Crowdin / i18n : ajouter une cle appName au lieu du hardcode et router via getAppName()
  • Strategie : renommer le package npm docmost -> docadenice quand on aura un build pipeline custom complet (impacte trop d'imports actuellement)