@nodefony/security 10.0.0-beta.1 → 10.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.151.0 → _@oxc-project_runtime@0.153.0}/helpers/esm/decorateMetadata.js +1 -1
- package/dist/index.js +44 -10
- package/dist/nodefony/command/security-oauth-doctor.js +66 -0
- package/dist/nodefony/command/security-secrets.js +42 -25
- package/dist/nodefony/command/security-token.js +46 -15
- package/dist/nodefony/command/security-user-delete.js +5 -4
- package/dist/nodefony/command/security-user-password.js +4 -11
- package/dist/nodefony/config/config.js +80 -5
- package/dist/nodefony/contracts/index.js +1 -2
- package/dist/nodefony/errors/InsecureTransportError.js +24 -0
- package/dist/nodefony/errors/index.js +2 -1
- package/dist/nodefony/keycloak/keycloakAdmin.js +255 -0
- package/dist/nodefony/keycloak/keycloakRealm.js +260 -0
- package/dist/nodefony/keycloak/keycloakRealmInput.js +124 -0
- package/dist/nodefony/keycloak/scaffold.js +231 -0
- package/dist/nodefony/keycloak/security-keycloak-realm.js +128 -0
- package/dist/nodefony/scaffold/contribute.js +20 -0
- package/dist/nodefony/service/authFlow.js +111 -11
- package/dist/nodefony/service/firewall.js +111 -21
- package/dist/nodefony/service/keycloak.js +209 -0
- package/dist/nodefony/service/oauth2.js +379 -26
- package/dist/nodefony/service/securityHeaders.js +12 -1
- package/dist/nodefony/service/tokenService.js +57 -6
- package/dist/nodefony/service/totp.js +51 -6
- package/dist/nodefony/service/webAuthn.js +20 -2
- package/dist/nodefony/src/SecuredArea.js +14 -3
- package/dist/nodefony/src/admin/SecurityAdminApi.js +70 -40
- package/dist/nodefony/src/admin/adminAudit.js +0 -1
- package/dist/nodefony/src/admin/userRevocationCascade.js +79 -15
- package/dist/nodefony/src/authenticator/ExternalJwtAuthenticator.js +66 -6
- package/dist/nodefony/src/authenticator/FirewallRealtimeAuthenticator.js +38 -15
- package/dist/nodefony/src/authenticator/JwtAuthenticator.js +1 -0
- package/dist/nodefony/src/authenticator/UserPasswordAuthenticator.js +13 -3
- package/dist/nodefony/src/authenticator/authenticatorRegistry.js +9 -2
- package/dist/nodefony/src/authenticator/bearer.js +1 -2
- package/dist/nodefony/src/boot/publicRoutesNotice.js +27 -0
- package/dist/nodefony/src/entryPoint.js +39 -0
- package/dist/nodefony/src/oauth/clientCredentials.js +40 -0
- package/dist/nodefony/src/oauth/metadata.js +36 -9
- package/dist/nodefony/src/oauth/oauth2Client.js +60 -33
- package/dist/nodefony/src/oauth/oauthProviderRegistry.js +39 -6
- package/dist/nodefony/src/oauth/providerDiagnosis.js +283 -0
- package/dist/nodefony/src/oauth/providerRoles.js +79 -0
- package/dist/nodefony/src/oauth/providers/github.js +32 -6
- package/dist/nodefony/src/oauth/providers/oidc.js +82 -3
- package/dist/nodefony/src/openToSignup.js +47 -0
- package/dist/nodefony/src/sessionAuthentication.js +26 -0
- package/dist/nodefony/src/token/JwtKeystore.js +78 -46
- package/dist/nodefony/src/token/RemoteJwtVerifier.js +40 -13
- package/dist/nodefony/src/token/secretFile.js +59 -2
- package/dist/nodefony/src/transport/CredentialTransportPolicy.js +51 -0
- package/dist/types/index.d.ts +26 -6
- package/dist/types/nodefony/command/security-oauth-doctor.d.ts +23 -0
- package/dist/types/nodefony/command/security-secrets.d.ts +2 -0
- package/dist/types/nodefony/command/security-token.d.ts +9 -0
- package/dist/types/nodefony/command/security-user-delete.d.ts +4 -3
- package/dist/types/nodefony/command/security-user-password.d.ts +4 -4
- package/dist/types/nodefony/config/config.d.ts +63 -1
- package/dist/types/nodefony/contracts/IAuthenticator.d.ts +1 -1
- package/dist/types/nodefony/contracts/IFirewallDescription.d.ts +42 -1
- package/dist/types/nodefony/contracts/IOAuthProvider.d.ts +48 -0
- package/dist/types/nodefony/contracts/ISecuredArea.d.ts +22 -0
- package/dist/types/nodefony/contracts/ITotpSecret.d.ts +4 -1
- package/dist/types/nodefony/contracts/ITotpSecretStore.d.ts +7 -1
- package/dist/types/nodefony/contracts/IWebAuthnCredential.d.ts +4 -1
- package/dist/types/nodefony/contracts/IWebAuthnCredentialStore.d.ts +6 -0
- package/dist/types/nodefony/errors/InsecureTransportError.d.ts +20 -0
- package/dist/types/nodefony/errors/index.d.ts +1 -0
- package/dist/types/nodefony/keycloak/keycloakAdmin.d.ts +154 -0
- package/dist/types/nodefony/keycloak/keycloakRealm.d.ts +138 -0
- package/dist/types/nodefony/keycloak/keycloakRealmInput.d.ts +92 -0
- package/dist/types/nodefony/keycloak/scaffold.d.ts +98 -0
- package/dist/types/nodefony/keycloak/security-keycloak-realm.d.ts +43 -0
- package/dist/types/nodefony/scaffold/contribute.d.ts +15 -0
- package/dist/types/nodefony/service/authFlow.d.ts +35 -3
- package/dist/types/nodefony/service/firewall.d.ts +17 -3
- package/dist/types/nodefony/service/keycloak.d.ts +115 -0
- package/dist/types/nodefony/service/oauth2.d.ts +125 -9
- package/dist/types/nodefony/service/securityHeaders.d.ts +2 -1
- package/dist/types/nodefony/service/tokenService.d.ts +7 -1
- package/dist/types/nodefony/service/totp.d.ts +28 -4
- package/dist/types/nodefony/service/webAuthn.d.ts +23 -1
- package/dist/types/nodefony/src/SecuredArea.d.ts +4 -0
- package/dist/types/nodefony/src/admin/userRevocationCascade.d.ts +54 -12
- package/dist/types/nodefony/src/authenticator/ExternalJwtAuthenticator.d.ts +18 -0
- package/dist/types/nodefony/src/authenticator/FirewallRealtimeAuthenticator.d.ts +13 -0
- package/dist/types/nodefony/src/authenticator/UserPasswordAuthenticator.d.ts +11 -3
- package/dist/types/nodefony/src/boot/publicRoutesNotice.d.ts +16 -0
- package/dist/types/nodefony/src/entryPoint.d.ts +37 -0
- package/dist/types/nodefony/src/oauth/clientCredentials.d.ts +54 -0
- package/dist/types/nodefony/src/oauth/metadata.d.ts +24 -1
- package/dist/types/nodefony/src/oauth/oauth2Client.d.ts +50 -1
- package/dist/types/nodefony/src/oauth/oauthProviderRegistry.d.ts +46 -2
- package/dist/types/nodefony/src/oauth/providerDiagnosis.d.ts +117 -0
- package/dist/types/nodefony/src/oauth/providerRoles.d.ts +58 -0
- package/dist/types/nodefony/src/oauth/providers/oidc.d.ts +34 -1
- package/dist/types/nodefony/src/openToSignup.d.ts +36 -0
- package/dist/types/nodefony/src/sessionAuthentication.d.ts +14 -0
- package/dist/types/nodefony/src/token/JwtKeystore.d.ts +47 -5
- package/dist/types/nodefony/src/token/RemoteJwtVerifier.d.ts +29 -2
- package/dist/types/nodefony/src/token/secretFile.d.ts +22 -0
- package/dist/types/nodefony/src/transport/CredentialTransportPolicy.d.ts +47 -0
- package/docs/api-keys.md +18 -18
- package/docs/audit.md +24 -22
- package/docs/authenticators.md +62 -29
- package/docs/authorization.md +16 -16
- package/docs/cors.md +30 -30
- package/docs/csrf.md +35 -33
- package/docs/external-jwt.md +68 -5
- package/docs/firewall.md +78 -45
- package/docs/headers.md +35 -35
- package/docs/index.md +15 -7
- package/docs/keycloak.md +818 -0
- package/docs/lexique.md +15 -15
- package/docs/login-page.md +361 -0
- package/docs/oauth2.md +242 -125
- package/docs/obtenir-un-jeton.md +18 -11
- package/docs/tokens.md +138 -86
- package/docs/totp.md +113 -71
- package/docs/webauthn.md +115 -115
- package/docs/webhooks.md +21 -21
- package/keycloak/themes/nodefony/account/resources/css/nodefony.css +66 -0
- package/keycloak/themes/nodefony/account/resources/img/favicon.ico +0 -0
- package/keycloak/themes/nodefony/account/resources/img/logo.png +0 -0
- package/keycloak/themes/nodefony/account/theme.properties +14 -0
- package/keycloak/themes/nodefony/admin/resources/css/nodefony.css +66 -0
- package/keycloak/themes/nodefony/admin/resources/img/favicon.ico +0 -0
- package/keycloak/themes/nodefony/admin/resources/img/logo.png +0 -0
- package/keycloak/themes/nodefony/admin/theme.properties +12 -0
- package/keycloak/themes/nodefony/email/html/template.ftl +73 -0
- package/keycloak/themes/nodefony/email/messages/messages_en.properties +2 -0
- package/keycloak/themes/nodefony/email/messages/messages_fr.properties +3 -0
- package/keycloak/themes/nodefony/email/resources/img/logo.png +0 -0
- package/keycloak/themes/nodefony/email/theme.properties +8 -0
- package/keycloak/themes/nodefony/login/messages/messages_en.properties +22 -0
- package/keycloak/themes/nodefony/login/messages/messages_fr.properties +25 -0
- package/keycloak/themes/nodefony/login/resources/css/login.css +1141 -0
- package/keycloak/themes/nodefony/login/resources/css/nodefony.css +688 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/blueprint.css +70 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/console.css +57 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/dots.css +67 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/enterprise.css +84 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/horizon.css +158 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/ledger.css +224 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/minimal.css +63 -0
- package/keycloak/themes/nodefony/login/resources/css/skins/photo-card.css +72 -0
- package/keycloak/themes/nodefony/login/resources/img/favicon.ico +0 -0
- package/keycloak/themes/nodefony/login/resources/img/logo.png +0 -0
- package/keycloak/themes/nodefony/login/template.ftl +423 -0
- package/keycloak/themes/nodefony/login/theme.properties +17 -0
- package/keycloak/themes/nodefony/welcome/resources/css/nodefony.css +32 -0
- package/keycloak/themes/nodefony/welcome/resources/img/logo.png +0 -0
- package/keycloak/themes/nodefony/welcome/theme.properties +11 -0
- package/keycloak/themes/nodefony-blueprint/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-console/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-dots/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-enterprise/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-horizon/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-ledger/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-minimal/login/theme.properties +12 -0
- package/keycloak/themes/nodefony-photo-card/login/theme.properties +12 -0
- package/package.json +17 -15
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Consoles Keycloak (compte de l'utilisateur, administration) aux couleurs de
|
|
3
|
+
* Nodefony Studio.
|
|
4
|
+
*
|
|
5
|
+
* ⚠️ Ce fichier existe en DEUX exemplaires identiques, `account/` et `admin/` :
|
|
6
|
+
* Keycloak sert les ressources d'un type depuis son propre dossier, aucun
|
|
7
|
+
* type ne lit celles d'un autre. Un test du paquet les tient identiques.
|
|
8
|
+
*
|
|
9
|
+
* Seules des VARIABLES PatternFly 5 sont redéfinies : les consoles sont des
|
|
10
|
+
* applications React livrées par Keycloak (`keycloak.v3`, `keycloak.v2`), leur
|
|
11
|
+
* structure reste la leur et suit chaque mise à jour.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
:root {
|
|
15
|
+
/* Teintes `brand` de Studio (`@nodefony/studio/frontend/src/theme.ts`). */
|
|
16
|
+
--nf-brand-4: #4792cd;
|
|
17
|
+
--nf-brand-6: #0067ba;
|
|
18
|
+
--nf-brand-7: #00579c;
|
|
19
|
+
--nf-font:
|
|
20
|
+
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
21
|
+
Roboto, sans-serif;
|
|
22
|
+
|
|
23
|
+
--pf-v5-global--FontFamily--text: var(--nf-font);
|
|
24
|
+
--pf-v5-global--FontFamily--heading: var(--nf-font);
|
|
25
|
+
--pf-v5-global--primary-color--100: var(--nf-brand-6);
|
|
26
|
+
--pf-v5-global--primary-color--200: var(--nf-brand-7);
|
|
27
|
+
--pf-v5-global--link--Color: var(--nf-brand-6);
|
|
28
|
+
--pf-v5-global--link--Color--hover: var(--nf-brand-7);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Schéma SOMBRE — posé par le parent (`kcDarkModeClass`) selon le système.
|
|
32
|
+
brand-6 sur le fond sombre des consoles (#1b1d21) = 2,93:1, sous AA : les
|
|
33
|
+
textes de lien passent en brand-4 (≈ 5:1). Les boutons pleins gardent la
|
|
34
|
+
teinte sombre de PatternFly (blanc sur #0066cc = 5,57:1). */
|
|
35
|
+
:root.pf-v5-theme-dark {
|
|
36
|
+
--pf-v5-global--primary-color--100: var(--nf-brand-4);
|
|
37
|
+
--pf-v5-global--primary-color--200: #74b3e3;
|
|
38
|
+
--pf-v5-global--link--Color: var(--nf-brand-4);
|
|
39
|
+
--pf-v5-global--link--Color--hover: #74b3e3;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Logo : la marque est un pictogramme vertical, pas un bandeau horizontal.
|
|
43
|
+
Le nom est ajouté À CÔTÉ par la feuille : les consoles n'affichent qu'une
|
|
44
|
+
image (propriété `logo`), et réécrire leur `index.ftl` obligerait à le
|
|
45
|
+
resynchroniser à chaque version de Keycloak. Le texte généré entre dans le
|
|
46
|
+
nom accessible du lien. */
|
|
47
|
+
.pf-v5-c-masthead__brand {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: 0.625rem;
|
|
51
|
+
text-decoration: none;
|
|
52
|
+
}
|
|
53
|
+
.pf-v5-c-masthead .pf-v5-c-brand,
|
|
54
|
+
.pf-v5-c-masthead__brand img {
|
|
55
|
+
height: 36px;
|
|
56
|
+
width: auto;
|
|
57
|
+
}
|
|
58
|
+
.pf-v5-c-masthead__brand::after {
|
|
59
|
+
content: "Nodefony";
|
|
60
|
+
font-family: var(--nf-font);
|
|
61
|
+
font-size: 1.25rem;
|
|
62
|
+
font-weight: 600;
|
|
63
|
+
letter-spacing: 0.01em;
|
|
64
|
+
color: var(--pf-v5-global--Color--light-100, #fff);
|
|
65
|
+
white-space: nowrap;
|
|
66
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Console du compte de l'utilisateur (Keycloak) aux couleurs de Nodefony.
|
|
2
|
+
#
|
|
3
|
+
# HÉRITE de `keycloak.v3` : la console est une application React livrée par
|
|
4
|
+
# Keycloak. Seuls le logo, l'icône d'onglet et une feuille de VARIABLES sont
|
|
5
|
+
# posés ici — la console reste celle de Keycloak, juste à chaque mise à jour.
|
|
6
|
+
# Le mode sombre (`darkMode`, `kcDarkModeClass`) est hérité du parent.
|
|
7
|
+
parent=keycloak.v3
|
|
8
|
+
# Chemins depuis les ressources du thème (`resources/`), barre INITIALE
|
|
9
|
+
# comprise : la console d'administration les colle à leur URL sans séparateur.
|
|
10
|
+
logo=/img/logo.png
|
|
11
|
+
favIcon=/img/favicon.ico
|
|
12
|
+
favIconType=image/x-icon
|
|
13
|
+
title=Nodefony · Account
|
|
14
|
+
styles=css/nodefony.css
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Consoles Keycloak (compte de l'utilisateur, administration) aux couleurs de
|
|
3
|
+
* Nodefony Studio.
|
|
4
|
+
*
|
|
5
|
+
* ⚠️ Ce fichier existe en DEUX exemplaires identiques, `account/` et `admin/` :
|
|
6
|
+
* Keycloak sert les ressources d'un type depuis son propre dossier, aucun
|
|
7
|
+
* type ne lit celles d'un autre. Un test du paquet les tient identiques.
|
|
8
|
+
*
|
|
9
|
+
* Seules des VARIABLES PatternFly 5 sont redéfinies : les consoles sont des
|
|
10
|
+
* applications React livrées par Keycloak (`keycloak.v3`, `keycloak.v2`), leur
|
|
11
|
+
* structure reste la leur et suit chaque mise à jour.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
:root {
|
|
15
|
+
/* Teintes `brand` de Studio (`@nodefony/studio/frontend/src/theme.ts`). */
|
|
16
|
+
--nf-brand-4: #4792cd;
|
|
17
|
+
--nf-brand-6: #0067ba;
|
|
18
|
+
--nf-brand-7: #00579c;
|
|
19
|
+
--nf-font:
|
|
20
|
+
ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
21
|
+
Roboto, sans-serif;
|
|
22
|
+
|
|
23
|
+
--pf-v5-global--FontFamily--text: var(--nf-font);
|
|
24
|
+
--pf-v5-global--FontFamily--heading: var(--nf-font);
|
|
25
|
+
--pf-v5-global--primary-color--100: var(--nf-brand-6);
|
|
26
|
+
--pf-v5-global--primary-color--200: var(--nf-brand-7);
|
|
27
|
+
--pf-v5-global--link--Color: var(--nf-brand-6);
|
|
28
|
+
--pf-v5-global--link--Color--hover: var(--nf-brand-7);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Schéma SOMBRE — posé par le parent (`kcDarkModeClass`) selon le système.
|
|
32
|
+
brand-6 sur le fond sombre des consoles (#1b1d21) = 2,93:1, sous AA : les
|
|
33
|
+
textes de lien passent en brand-4 (≈ 5:1). Les boutons pleins gardent la
|
|
34
|
+
teinte sombre de PatternFly (blanc sur #0066cc = 5,57:1). */
|
|
35
|
+
:root.pf-v5-theme-dark {
|
|
36
|
+
--pf-v5-global--primary-color--100: var(--nf-brand-4);
|
|
37
|
+
--pf-v5-global--primary-color--200: #74b3e3;
|
|
38
|
+
--pf-v5-global--link--Color: var(--nf-brand-4);
|
|
39
|
+
--pf-v5-global--link--Color--hover: #74b3e3;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Logo : la marque est un pictogramme vertical, pas un bandeau horizontal.
|
|
43
|
+
Le nom est ajouté À CÔTÉ par la feuille : les consoles n'affichent qu'une
|
|
44
|
+
image (propriété `logo`), et réécrire leur `index.ftl` obligerait à le
|
|
45
|
+
resynchroniser à chaque version de Keycloak. Le texte généré entre dans le
|
|
46
|
+
nom accessible du lien. */
|
|
47
|
+
.pf-v5-c-masthead__brand {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: 0.625rem;
|
|
51
|
+
text-decoration: none;
|
|
52
|
+
}
|
|
53
|
+
.pf-v5-c-masthead .pf-v5-c-brand,
|
|
54
|
+
.pf-v5-c-masthead__brand img {
|
|
55
|
+
height: 36px;
|
|
56
|
+
width: auto;
|
|
57
|
+
}
|
|
58
|
+
.pf-v5-c-masthead__brand::after {
|
|
59
|
+
content: "Nodefony";
|
|
60
|
+
font-family: var(--nf-font);
|
|
61
|
+
font-size: 1.25rem;
|
|
62
|
+
font-weight: 600;
|
|
63
|
+
letter-spacing: 0.01em;
|
|
64
|
+
color: var(--pf-v5-global--Color--light-100, #fff);
|
|
65
|
+
white-space: nowrap;
|
|
66
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Console d'administration du realm (Keycloak) aux couleurs de Nodefony.
|
|
2
|
+
#
|
|
3
|
+
# HÉRITE de `keycloak.v2` (nom de la console d'administration actuelle) : même
|
|
4
|
+
# mécanique que le type `account` — logo, icône d'onglet, feuille de
|
|
5
|
+
# VARIABLES, rien de la console elle-même. Utile à l'opérateur du realm, pas à
|
|
6
|
+
# l'utilisateur final.
|
|
7
|
+
parent=keycloak.v2
|
|
8
|
+
logo=/img/logo.png
|
|
9
|
+
favIcon=/img/favicon.ico
|
|
10
|
+
favIconType=image/x-icon
|
|
11
|
+
title=Nodefony · Keycloak Administration
|
|
12
|
+
styles=css/nodefony.css
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<#--
|
|
2
|
+
Enveloppe HTML de TOUS les courriels Keycloak (vérification d'adresse, mot de
|
|
3
|
+
passe oublié, actions requises, événements) aux couleurs de Nodefony.
|
|
4
|
+
|
|
5
|
+
Seule l'enveloppe est remplacée : chaque courriel garde son gabarit et ses
|
|
6
|
+
textes Keycloak (`html/<courriel>.ftl`, messages traduits), donc juste à
|
|
7
|
+
chaque mise à jour. Le texte brut (`text/`) n'a pas d'enveloppe.
|
|
8
|
+
|
|
9
|
+
Écrit pour les clients de messagerie, pas pour un navigateur :
|
|
10
|
+
- mise en page par TABLEAU et styles EN LIGNE (beaucoup de clients retirent
|
|
11
|
+
`<style>` ou ignorent la grille et les variables CSS) ;
|
|
12
|
+
- image en URL ABSOLUE (`url.resourcesUrl`) : un client de messagerie ne
|
|
13
|
+
résout pas un chemin relatif ;
|
|
14
|
+
- le bloc `<style>` ne porte que le mode sombre, pour les clients qui le lisent.
|
|
15
|
+
-->
|
|
16
|
+
<#macro emailLayout>
|
|
17
|
+
<!DOCTYPE html>
|
|
18
|
+
<html lang="${locale.language}" dir="${(ltr)?then('ltr','rtl')}">
|
|
19
|
+
<head>
|
|
20
|
+
<meta charset="utf-8">
|
|
21
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
22
|
+
<meta name="color-scheme" content="light dark">
|
|
23
|
+
<meta name="supported-color-schemes" content="light dark">
|
|
24
|
+
<title>${realmName!""}</title>
|
|
25
|
+
<style>
|
|
26
|
+
.nf-content a { color: #0067ba; }
|
|
27
|
+
@media (prefers-color-scheme: dark) {
|
|
28
|
+
.nf-page { background: #1a1b1e !important; }
|
|
29
|
+
.nf-card, .nf-head { background: #242424 !important; border-color: #424242 !important; }
|
|
30
|
+
.nf-head { border-bottom-color: #4792cd !important; }
|
|
31
|
+
.nf-brand { color: #ffffff !important; }
|
|
32
|
+
.nf-content { color: #c9c9c9 !important; }
|
|
33
|
+
.nf-content a { color: #74b3e3 !important; }
|
|
34
|
+
.nf-footer { color: #8f8f8f !important; }
|
|
35
|
+
}
|
|
36
|
+
</style>
|
|
37
|
+
</head>
|
|
38
|
+
<#-- Le fond se pose AUSSI sur le corps : sans lui, une boîte en sombre peint
|
|
39
|
+
sous l'enveloppe le fond par défaut de son moteur, d'une autre teinte. -->
|
|
40
|
+
<body class="nf-page" style="margin:0;padding:0;background:#f1f3f5;">
|
|
41
|
+
<table role="presentation" class="nf-page" width="100%" cellpadding="0" cellspacing="0" border="0" style="background:#f1f3f5;">
|
|
42
|
+
<tr>
|
|
43
|
+
<td align="center" style="padding:32px 16px;">
|
|
44
|
+
<table role="presentation" class="nf-card" width="100%" cellpadding="0" cellspacing="0" border="0" style="max-width:560px;background:#ffffff;border:1px solid #dee2e6;border-radius:8px;">
|
|
45
|
+
<tr>
|
|
46
|
+
<td class="nf-head" style="background:#ffffff;border-bottom:3px solid #0067ba;border-radius:8px 8px 0 0;padding:20px 32px;">
|
|
47
|
+
<table role="presentation" cellpadding="0" cellspacing="0" border="0">
|
|
48
|
+
<tr>
|
|
49
|
+
<td style="vertical-align:middle;padding-right:12px;">
|
|
50
|
+
<img src="${url.resourcesUrl}/img/logo.png" width="25" height="40" alt="" style="display:block;border:0;">
|
|
51
|
+
</td>
|
|
52
|
+
<td class="nf-brand" style="vertical-align:middle;font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;font-size:18px;font-weight:600;color:#212529;">
|
|
53
|
+
${realmName!"Nodefony"}
|
|
54
|
+
</td>
|
|
55
|
+
</tr>
|
|
56
|
+
</table>
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
<tr>
|
|
60
|
+
<td class="nf-content" style="padding:28px 32px;font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;font-size:15px;line-height:1.6;color:#343a40;">
|
|
61
|
+
<#nested>
|
|
62
|
+
</td>
|
|
63
|
+
</tr>
|
|
64
|
+
</table>
|
|
65
|
+
<p class="nf-footer" style="max-width:560px;margin:16px auto 0;font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;font-size:12px;line-height:1.5;color:#5c636a;">
|
|
66
|
+
${msg("nfEmailFooter", realmName!"")}
|
|
67
|
+
</p>
|
|
68
|
+
</td>
|
|
69
|
+
</tr>
|
|
70
|
+
</table>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|
|
73
|
+
</#macro>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Textes de marque des courriels Nodefony (les autres viennent de Keycloak).
|
|
2
|
+
# ⚠️ MessageFormat (Java) : une apostrophe s'écrit DOUBLÉE (`l''adresse`).
|
|
3
|
+
nfEmailFooter=Message automatique du domaine {0}, envoyé par son serveur d''identité. Si vous n''êtes pas à l''origine de cette demande, ignorez-le.
|
|
Binary file
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Courriels Keycloak aux couleurs de Nodefony.
|
|
2
|
+
#
|
|
3
|
+
# HÉRITE de `keycloak` : seule l'enveloppe HTML (`html/template.ftl`) et un
|
|
4
|
+
# texte de pied sont posés ici. Chaque courriel — vérification d'adresse, mot
|
|
5
|
+
# de passe oublié, actions requises, événements — garde son gabarit et ses
|
|
6
|
+
# textes traduits par Keycloak.
|
|
7
|
+
parent=keycloak
|
|
8
|
+
locales=fr,en
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Brand texts of the Nodefony theme (everything else comes from Keycloak).
|
|
2
|
+
loginAccountTitle=Sign in
|
|
3
|
+
nfSubtitle=Access your applications with your {0} account.
|
|
4
|
+
nfBrandName=Nodefony
|
|
5
|
+
nfSsoBadge=Single Sign-On · SSO
|
|
6
|
+
nfSsoFooter=One account for every application of {0}.
|
|
7
|
+
nfProvidedBy=Keycloak identity server
|
|
8
|
+
nfBackTo=Back to {0}
|
|
9
|
+
nfBackHint=Choose another sign-in method
|
|
10
|
+
nfRealmPill=Single Sign-On · realm {0}
|
|
11
|
+
nfLoginTo=Sign in to {0}
|
|
12
|
+
nfCapsTitle=With your {0} account
|
|
13
|
+
nfCapSso=One sign-in for every application of the realm.
|
|
14
|
+
nfCapFederation=Sign-in through an external identity provider.
|
|
15
|
+
nfCapReset=Forgot password: self-service reset.
|
|
16
|
+
nfCapRegister=Self-service account creation.
|
|
17
|
+
nfCapManaged=Accounts managed by the realm administrator.
|
|
18
|
+
nfCapRemember=Session can be remembered on this device.
|
|
19
|
+
nfRealmFooter=Realm “{0}” · Keycloak
|
|
20
|
+
nfThemeCredit=Nodefony theme
|
|
21
|
+
nfMetaDescription=Single sign-on to the {0} realm.
|
|
22
|
+
languages=Language
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Textes de marque du thème Nodefony (les autres viennent de Keycloak).
|
|
2
|
+
# ⚠️ Keycloak lit ces textes par MessageFormat (Java) : une apostrophe s'écrit
|
|
3
|
+
# DOUBLÉE (`d''identité`), sinon elle disparaît et coupe le texte qui suit.
|
|
4
|
+
loginAccountTitle=Connexion
|
|
5
|
+
nfSubtitle=Accédez à vos applications avec votre compte {0}.
|
|
6
|
+
nfBrandName=Nodefony
|
|
7
|
+
nfSsoBadge=Authentification unique · SSO
|
|
8
|
+
nfSsoFooter=Un seul compte pour toutes les applications de {0}.
|
|
9
|
+
nfProvidedBy=Serveur d''identité Keycloak
|
|
10
|
+
nfBackTo=Retour à {0}
|
|
11
|
+
nfBackHint=Choisir une autre méthode de connexion
|
|
12
|
+
nfRealmPill=Single Sign-On · domaine {0}
|
|
13
|
+
nfLoginTo=Connexion à {0}
|
|
14
|
+
nfCapsTitle=Avec votre compte {0}
|
|
15
|
+
nfCapSso=Une seule connexion pour toutes les applications du domaine.
|
|
16
|
+
nfCapFederation=Connexion possible par un fournisseur d''identité externe.
|
|
17
|
+
nfCapReset=Mot de passe oublié : réinitialisation en libre-service.
|
|
18
|
+
nfCapRegister=Création de compte en libre-service.
|
|
19
|
+
nfCapManaged=Comptes gérés par l''administrateur du domaine.
|
|
20
|
+
nfCapRemember=Session mémorisable sur cet appareil.
|
|
21
|
+
nfRealmFooter=Domaine « {0} » · Keycloak
|
|
22
|
+
nfThemeCredit=Thème Nodefony
|
|
23
|
+
nfMetaDescription=Connexion par authentification unique au domaine {0}.
|
|
24
|
+
# Absent des textes français de Keycloak : le sélecteur de langue s'annonçait « languages ».
|
|
25
|
+
languages=Langue
|