AcadeDoc/ACADENICE_PATCHES.md
Corentin 06c46f7b9b fix(oidc): defaut OIDC_SCOPES align Authentik (sans 'groups')
Authentik n'expose pas un scope 'groups' standard — demander ce scope
inconnu peut faire echouer l'authorize selon la config provider. Les
groups arrivent dans le claim 'groups' du scope 'profile' par defaut.

Defaut passe de 'openid email profile groups' vers 'openid email profile'.
Update env.example + ACADENICE_PATCHES.md doc associee.
2026-05-07 21:28:40 +02:00

8.8 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 Authentik : groups claim arrive via le scope profile (pas un scope standard)
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)