# 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` | `Docmost` | `DocAdenice` | | `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 + `` au-dessus de `` | | `.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)