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.
135 lines
8.8 KiB
Markdown
135 lines
8.8 KiB
Markdown
# 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)
|