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>
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-clientv6 via laConfigurationcachee) - userInfo refetched apres l'echange — on ne fait pas confiance aux claims ID token seuls pour
email - Cookies temporaires
oidc_state/oidc_pkceclear 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
enforceSsocote workspace (actuellement le bouton apparait des queOIDC_ENABLED=true, sans condition supplementaire)
TODO rebrand complet (futur)
- Logo SVG / favicon DocAdenice (actuellement reutilise
/icons/favicon-32x32.pngupstream) - 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
appNameau lieu du hardcode et router viagetAppName() - Strategie : renommer le package npm
docmost->docadenicequand on aura un build pipeline custom complet (impacte trop d'imports actuellement)