masks-server 0.11.0 → 0.12.0
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.
- checksums.yaml +4 -4
- data/app/controllers/masks/server/account_controller.rb +3 -0
- data/app/controllers/masks/server/app_passwords_controller.rb +41 -0
- data/app/controllers/masks/server/authorize_controller.rb +33 -2
- data/app/controllers/masks/server/forward_auth_controller.rb +104 -12
- data/app/controllers/masks/server/logins_controller.rb +4 -3
- data/app/controllers/masks/server/organization_access_controller.rb +39 -0
- data/app/graphql/masks/server/manage/mutations/base_mutation.rb +7 -0
- data/app/graphql/masks/server/manage/mutations/create_group.rb +6 -4
- data/app/graphql/masks/server/manage/mutations/decline_access.rb +27 -0
- data/app/graphql/masks/server/manage/mutations/grant_access.rb +29 -0
- data/app/graphql/masks/server/manage/mutations/group_source.rb +34 -0
- data/app/graphql/masks/server/manage/mutations/issue_ldap_credential.rb +5 -2
- data/app/graphql/masks/server/manage/mutations/refresh_group.rb +21 -0
- data/app/graphql/masks/server/manage/mutations/remove_group_member.rb +2 -0
- data/app/graphql/masks/server/manage/mutations/run_health_checks.rb +19 -0
- data/app/graphql/masks/server/manage/mutations/update_client.rb +6 -0
- data/app/graphql/masks/server/manage/mutations/update_group.rb +7 -4
- data/app/graphql/masks/server/manage/mutations/update_tenant.rb +14 -1
- data/app/graphql/masks/server/manage/types/access_request_type.rb +21 -0
- data/app/graphql/masks/server/manage/types/actor_type.rb +6 -0
- data/app/graphql/masks/server/manage/types/client_type.rb +12 -0
- data/app/graphql/masks/server/manage/types/group_condition_input.rb +16 -0
- data/app/graphql/masks/server/manage/types/group_condition_type.rb +29 -0
- data/app/graphql/masks/server/manage/types/group_member_type.rb +16 -0
- data/app/graphql/masks/server/manage/types/group_type.rb +17 -1
- data/app/graphql/masks/server/manage/types/health_check_type.rb +18 -0
- data/app/graphql/masks/server/manage/types/ldap_credential_type.rb +1 -0
- data/app/graphql/masks/server/manage/types/mutation_type.rb +4 -0
- data/app/graphql/masks/server/manage/types/query_type.rb +24 -0
- data/app/graphql/masks/server/manage/types/release_type.rb +16 -0
- data/app/graphql/masks/server/manage/types/tenant_type.rb +6 -1
- data/app/helpers/masks/server/account_helper.rb +4 -0
- data/app/jobs/masks/server/cleanup_job.rb +1 -0
- data/app/jobs/masks/server/health_check_job.rb +21 -0
- data/app/jobs/masks/server/refresh_groups_job.rb +18 -0
- data/app/jobs/masks/server/release_check_job.rb +21 -0
- data/app/ldap/masks/server/ldap/connection.rb +3 -2
- data/app/ldap/masks/server/ldap/gate.rb +31 -4
- data/app/logins/masks/server/login_states/second_factor.rb +1 -1
- data/app/mailers/masks/server/actor_mailer.rb +31 -0
- data/app/models/masks/server/access_request.rb +103 -0
- data/app/models/masks/server/actor.rb +6 -0
- data/app/models/masks/server/app_password.rb +91 -0
- data/app/models/masks/server/app_passwords.rb +82 -0
- data/app/models/masks/server/client.rb +15 -0
- data/app/models/masks/server/connection.rb +7 -0
- data/app/models/masks/server/declared.rb +10 -2
- data/app/models/masks/server/email_verification.rb +2 -2
- data/app/models/masks/server/event.rb +11 -1
- data/app/models/masks/server/federation/protocol.rb +1 -1
- data/app/models/masks/server/federation/saml.rb +1 -1
- data/app/models/masks/server/forward_auth_rules.rb +162 -0
- data/app/models/masks/server/group.rb +207 -4
- data/app/models/masks/server/group_member.rb +7 -0
- data/app/models/masks/server/group_rule.rb +63 -0
- data/app/models/masks/server/health.rb +243 -0
- data/app/models/masks/server/health_check.rb +27 -0
- data/app/models/masks/server/invitation.rb +2 -2
- data/app/models/masks/server/ldap_credential.rb +2 -2
- data/app/models/masks/server/login.rb +28 -2
- data/app/models/masks/server/mail_previews.rb +5 -0
- data/app/models/masks/server/mail_template.rb +2 -0
- data/app/models/masks/server/membership.rb +10 -3
- data/app/models/masks/server/notifications.rb +3 -1
- data/app/models/masks/server/password_reset.rb +2 -2
- data/app/models/masks/server/provider.rb +1 -0
- data/app/models/masks/server/queue.rb +60 -0
- data/app/models/masks/server/release.rb +74 -0
- data/app/models/masks/server/session.rb +8 -0
- data/app/models/masks/server/tenant.rb +39 -2
- data/app/models/masks/server/token.rb +2 -1
- data/app/views/masks/server/account/_app_passwords.html.erb +83 -0
- data/app/views/masks/server/account/_organizations.html.erb +33 -0
- data/app/views/masks/server/account/index.html.erb +5 -0
- data/app/views/masks/server/actor_mailer/access_declined.html.erb +5 -0
- data/app/views/masks/server/actor_mailer/access_declined.text.erb +5 -0
- data/app/views/masks/server/actor_mailer/access_granted.html.erb +7 -0
- data/app/views/masks/server/actor_mailer/access_granted.text.erb +7 -0
- data/app/views/masks/server/authorize/error.html.erb +25 -0
- data/config/locales/de/access_requests.yml +43 -0
- data/config/locales/de/account/app_passwords.yml +42 -0
- data/config/locales/de/events.yml +5 -0
- data/config/locales/de/flashes.yml +1 -0
- data/config/locales/de/group_sources.yml +5 -0
- data/config/locales/de/manage/access_requests.yml +12 -0
- data/config/locales/de/manage/app_passwords.yml +16 -0
- data/config/locales/de/manage/forward_auth_rules.yml +29 -0
- data/config/locales/de/manage/group_sources.yml +44 -0
- data/config/locales/de/manage/health.yml +78 -0
- data/config/locales/de/manage/links.yml +20 -0
- data/config/locales/en/access_requests.yml +43 -0
- data/config/locales/en/account/app_passwords.yml +42 -0
- data/config/locales/en/events.yml +5 -0
- data/config/locales/en/flashes.yml +1 -0
- data/config/locales/en/group_sources.yml +5 -0
- data/config/locales/en/manage/access_requests.yml +12 -0
- data/config/locales/en/manage/app_passwords.yml +16 -0
- data/config/locales/en/manage/forward_auth_rules.yml +29 -0
- data/config/locales/en/manage/group_sources.yml +44 -0
- data/config/locales/en/manage/health.yml +78 -0
- data/config/locales/en/manage/links.yml +20 -0
- data/config/locales/es/access_requests.yml +43 -0
- data/config/locales/es/account/app_passwords.yml +42 -0
- data/config/locales/es/events.yml +5 -0
- data/config/locales/es/flashes.yml +1 -0
- data/config/locales/es/group_sources.yml +5 -0
- data/config/locales/es/manage/access_requests.yml +12 -0
- data/config/locales/es/manage/app_passwords.yml +16 -0
- data/config/locales/es/manage/forward_auth_rules.yml +29 -0
- data/config/locales/es/manage/group_sources.yml +44 -0
- data/config/locales/es/manage/health.yml +78 -0
- data/config/locales/es/manage/links.yml +20 -0
- data/config/locales/fr/access_requests.yml +43 -0
- data/config/locales/fr/account/app_passwords.yml +42 -0
- data/config/locales/fr/events.yml +5 -0
- data/config/locales/fr/flashes.yml +1 -0
- data/config/locales/fr/group_sources.yml +5 -0
- data/config/locales/fr/manage/access_requests.yml +12 -0
- data/config/locales/fr/manage/app_passwords.yml +16 -0
- data/config/locales/fr/manage/forward_auth_rules.yml +29 -0
- data/config/locales/fr/manage/group_sources.yml +44 -0
- data/config/locales/fr/manage/health.yml +78 -0
- data/config/locales/fr/manage/links.yml +20 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20261020100000_create_access_requests.rb +28 -0
- data/db/migrate/20261020110000_add_app_passwords_to_clients.rb +5 -0
- data/db/migrate/20261020120000_add_forward_auth_rules_to_clients.rb +6 -0
- data/db/migrate/20261020130000_add_sources_to_groups.rb +15 -0
- data/db/migrate/20261020140000_create_health_checks.rb +25 -0
- data/db/migrate/20261020150000_add_link_lifetimes_to_tenants.rb +8 -0
- data/db/migrate/20261021100000_add_pinned_origin_to_tenants.rb +5 -0
- data/lib/generators/masks/server/install/install_generator.rb +3 -2
- data/lib/masks/server/configuration.rb +2 -11
- data/lib/masks/server/schema_reference.rb +12 -0
- data/lib/masks/server/tenancy/middleware.rb +17 -6
- data/public/masks-assets/.vite/manifest.json +13 -13
- data/public/masks-assets/assets/{account-D46qDQCo.js → account-h7I6VUPR.js} +2 -2
- data/public/masks-assets/assets/{account-D46qDQCo.js.map → account-h7I6VUPR.js.map} +1 -1
- data/public/masks-assets/assets/{app-D7W0gAyT.css → app-BXOScMjL.css} +1 -1
- data/public/masks-assets/assets/{handshake-DIFZPSAK.js → handshake-YQpRNMIs.js} +2 -2
- data/public/masks-assets/assets/{handshake-DIFZPSAK.js.map → handshake-YQpRNMIs.js.map} +1 -1
- data/public/masks-assets/assets/initial-Cn-UuAsy.js +3 -0
- data/public/masks-assets/assets/{initial-C1GpCiEh.js.map → initial-Cn-UuAsy.js.map} +1 -1
- data/public/masks-assets/assets/{login-C_6igRZ3.js → login-C21_jb6L.js} +3 -3
- data/public/masks-assets/assets/{login-C_6igRZ3.js.map → login-C21_jb6L.js.map} +1 -1
- data/public/masks-assets/assets/{manage-D4MzaDvM.js → manage-DpVxe5sv.js} +80 -51
- data/public/masks-assets/assets/manage-DpVxe5sv.js.map +1 -0
- data/public/masks-assets/assets/passkey-5UYPVD3c.js +2 -0
- data/public/masks-assets/assets/{passkey-DIj_5LCY.js.map → passkey-5UYPVD3c.js.map} +1 -1
- data/version.txt +1 -1
- metadata +87 -14
- data/public/masks-assets/assets/initial-C1GpCiEh.js +0 -3
- data/public/masks-assets/assets/manage-D4MzaDvM.js.map +0 -1
- data/public/masks-assets/assets/passkey-DIj_5LCY.js +0 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
es:
|
|
2
|
+
manage:
|
|
3
|
+
forward_auth_rules:
|
|
4
|
+
title: "Reglas"
|
|
5
|
+
lede: "La primera regla que cubre una solicitud la decide. Una solicitud sin regla necesita una persona con sesión iniciada que pueda iniciar sesión."
|
|
6
|
+
empty: "No hay reglas. Cada solicitud necesita una persona con sesión iniciada que pueda iniciar sesión."
|
|
7
|
+
paths: "Rutas"
|
|
8
|
+
paths_hint: "Una por línea. * cubre un segmento y ** cualquier profundidad, así que /admin/** cubre /admin y todo lo que hay debajo. Vacío cubre todas las rutas."
|
|
9
|
+
methods: "Métodos"
|
|
10
|
+
methods_hint: "GET, POST y los demás. Vacío cubre todos los métodos."
|
|
11
|
+
networks: "Redes"
|
|
12
|
+
networks_hint: "Direcciones o rangos, como 192.168.0.0/16. Vacío cubre todas las direcciones."
|
|
13
|
+
groups: "Grupos"
|
|
14
|
+
groups_hint: "Claves de grupo, o roles como clave:rol. Vacío cubre a todos."
|
|
15
|
+
outcome: "Resultado"
|
|
16
|
+
outcomes:
|
|
17
|
+
open: "Abierto a todos, sin iniciar sesión"
|
|
18
|
+
one_factor: "Una persona con sesión iniciada, sin segundo factor"
|
|
19
|
+
two_factor: "Una persona con sesión iniciada, con su segundo factor"
|
|
20
|
+
token: "Una persona con sesión iniciada, o un script con un token de acceso"
|
|
21
|
+
deny: "Cerrado para todos"
|
|
22
|
+
rule: "Regla %{number}"
|
|
23
|
+
add: "Añadir regla"
|
|
24
|
+
remove: "Quitar"
|
|
25
|
+
up: "Subir"
|
|
26
|
+
down: "Bajar"
|
|
27
|
+
save: "Guardar reglas"
|
|
28
|
+
saved: "Reglas guardadas."
|
|
29
|
+
trust: "Una regla de red confía en la dirección que envía el proxy. Asegúrate de que el proxy establece X-Forwarded-For por sí mismo."
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
es:
|
|
2
|
+
manage:
|
|
3
|
+
group_sources:
|
|
4
|
+
source: "Se llena desde"
|
|
5
|
+
sources:
|
|
6
|
+
manual: "Personas añadidas a mano"
|
|
7
|
+
rule: "Una regla"
|
|
8
|
+
provider: "Un proveedor"
|
|
9
|
+
group: "Otros grupos"
|
|
10
|
+
ledes:
|
|
11
|
+
manual: "Un gestor añade y quita personas desde sus propias páginas."
|
|
12
|
+
rule: "Todas las personas que cumplen cada condición. Una dirección de correo cuenta cuando está verificada. Un campo del perfil cuenta solo cuando lo fija un directorio, porque las personas no pueden cambiarlo. Se comprueba al cambiar un perfil y cada hora."
|
|
13
|
+
provider: "Todas las personas cuyo último inicio de sesión con el proveedor incluyó el grupo."
|
|
14
|
+
group: "Todas las personas en alguno de los grupos o roles de organización superiores."
|
|
15
|
+
change: "Cambiar cómo se llena %{name}"
|
|
16
|
+
kinds:
|
|
17
|
+
email_domain: "La dirección de correo termina en"
|
|
18
|
+
profile: "El campo del perfil es igual a"
|
|
19
|
+
field: "Campo"
|
|
20
|
+
value: "Valor"
|
|
21
|
+
add_condition: "Añadir condición"
|
|
22
|
+
remove_condition: "Quitar condición"
|
|
23
|
+
provider: "Proveedor"
|
|
24
|
+
choose_provider: "Elige un proveedor"
|
|
25
|
+
no_providers: "Añade primero un proveedor."
|
|
26
|
+
upstream_group: "Nombre del grupo en el proveedor"
|
|
27
|
+
parent_labels: "Grupos superiores"
|
|
28
|
+
parent_labels_hint: "Claves de grupo o roles de organización como clave:rol, separados por comas."
|
|
29
|
+
save: "Guardar"
|
|
30
|
+
cancel: "Cancelar"
|
|
31
|
+
saved: "%{name} ahora se llena desde %{source}."
|
|
32
|
+
refresh: "Actualizar ahora"
|
|
33
|
+
refreshed: "%{name} se actualizó."
|
|
34
|
+
refreshed_at: "Actualizado %{when}."
|
|
35
|
+
never_refreshed: "Aún no se actualizó."
|
|
36
|
+
summary:
|
|
37
|
+
rule: "Se llena por regla"
|
|
38
|
+
provider: "Se llena desde %{provider}"
|
|
39
|
+
group: "Se llena desde %{parents}"
|
|
40
|
+
by_hand: "Añadido a mano, así que solo un gestor lo quita."
|
|
41
|
+
from:
|
|
42
|
+
rule: "En el grupo por su regla, así que la regla decide."
|
|
43
|
+
provider: "En el grupo por un inicio de sesión con el proveedor, así que el proveedor decide."
|
|
44
|
+
group: "En el grupo a través de un grupo superior, así que ese grupo decide."
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
es:
|
|
2
|
+
manage:
|
|
3
|
+
health:
|
|
4
|
+
title: "Estado"
|
|
5
|
+
lede: "Las comprobaciones se ejecutan cada 10 minutos. Cada una dice qué encontró y qué hacer."
|
|
6
|
+
check_now: "Comprobar ahora"
|
|
7
|
+
checking: "Comprobando"
|
|
8
|
+
checked: "Comprobado %{when}"
|
|
9
|
+
never: "Las comprobaciones aún no se han ejecutado. Se ejecutan cada 10 minutos cuando hay un worker en marcha."
|
|
10
|
+
failed: "Las comprobaciones no pudieron ejecutarse: %{failure}"
|
|
11
|
+
statuses:
|
|
12
|
+
ok: "Bien"
|
|
13
|
+
warning: "Merece un vistazo"
|
|
14
|
+
failing: "Fallando"
|
|
15
|
+
checks:
|
|
16
|
+
jobs:
|
|
17
|
+
title: "Tareas en segundo plano"
|
|
18
|
+
elsewhere: "Las tareas se ejecutan en otro servidor."
|
|
19
|
+
none: "Ninguna tarea falló en el último día."
|
|
20
|
+
failed:
|
|
21
|
+
one: "Un tipo de tarea falló en el último día: %{jobs}."
|
|
22
|
+
other: "%{count} tipos de tarea fallaron en el último día: %{jobs}."
|
|
23
|
+
advice: "Lee el error en el registro del servidor. Cada tarea vuelve a ejecutarse según su horario."
|
|
24
|
+
worker:
|
|
25
|
+
title: "Worker"
|
|
26
|
+
elsewhere: "Las tareas se ejecutan en otro servidor."
|
|
27
|
+
unchecked: "La comprobación del worker está desactivada."
|
|
28
|
+
reporting: "Hay un worker en marcha."
|
|
29
|
+
silent: "Ningún worker ha informado en los últimos %{minutes} minutos."
|
|
30
|
+
advice: "Inicia el proceso de tareas, o pon MASKS_JOBS_IN_WEB_SERVER en true para que el servidor web ejecute las tareas."
|
|
31
|
+
queue:
|
|
32
|
+
title: "Cola"
|
|
33
|
+
elsewhere: "Las tareas se ejecutan en otro servidor."
|
|
34
|
+
unchecked: "La comprobación de la cola está desactivada."
|
|
35
|
+
moving: "Las tareas empiezan a tiempo."
|
|
36
|
+
stuck: "Una tarea espera para empezar desde %{since}, más de %{minutes} minutos."
|
|
37
|
+
advice: "Añade un worker, o sube JOB_CONCURRENCY para que se ejecuten más tareas a la vez."
|
|
38
|
+
ldap:
|
|
39
|
+
title: "LDAP"
|
|
40
|
+
tls: "LDAP responde con TLS."
|
|
41
|
+
local: "LDAP responde solo en la propia máquina del servidor."
|
|
42
|
+
plain: "LDAP responde en el puerto %{port} sin TLS, así que las contraseñas cruzan la red en claro."
|
|
43
|
+
advice: "Define MASKS_LDAP_CERT y MASKS_LDAP_KEY, o quita MASKS_LDAP_PLAINTEXT."
|
|
44
|
+
metrics:
|
|
45
|
+
title: "Métricas"
|
|
46
|
+
"off": "La página de métricas está desactivada."
|
|
47
|
+
"on": "La página de métricas responde a una petición que lleva su token."
|
|
48
|
+
short: "El token de métricas tiene %{length} caracteres, así que se puede adivinar."
|
|
49
|
+
advice: "Define MASKS_METRICS_TOKEN con al menos %{needed} caracteres aleatorios."
|
|
50
|
+
mail:
|
|
51
|
+
title: "Correo"
|
|
52
|
+
none: "No hay ningún servicio de correo configurado."
|
|
53
|
+
answers: "El servidor de correo responde."
|
|
54
|
+
silent: "El servidor de correo no respondió: %{error}."
|
|
55
|
+
advice: "Revisa el servidor, el puerto y el ajuste TLS en la página Mensajes, y que el servidor permita conexiones desde aquí."
|
|
56
|
+
origin:
|
|
57
|
+
title: "Dirección pública"
|
|
58
|
+
unset: "No hay dirección pública definida, así que masks sigue la cabecera Host de cada petición."
|
|
59
|
+
matches: "Las peticiones llegan a la dirección pública de este inquilino."
|
|
60
|
+
mismatch: "Las peticiones llegan como %{seen}, pero la dirección de este inquilino es %{origin}."
|
|
61
|
+
advice: "Haz que el proxy envíe X-Forwarded-Proto y X-Forwarded-Host, y añádelo a MASKS_TRUSTED_PROXIES."
|
|
62
|
+
domains:
|
|
63
|
+
title: "Dominios"
|
|
64
|
+
none: "No hay ningún dominio reclamado."
|
|
65
|
+
proven: "Cada dominio reclamado conserva su registro TXT."
|
|
66
|
+
missing: "Falta el registro TXT de %{domains}. Una reclamación se libera una semana después de que desaparezca su registro."
|
|
67
|
+
advice: "Vuelve a poner el registro TXT en el nombre que muestra la página Dominios."
|
|
68
|
+
keys:
|
|
69
|
+
title: "Claves de firma"
|
|
70
|
+
missing: "Este inquilino no tiene ninguna clave de firma activa, así que no se puede firmar nada."
|
|
71
|
+
manual: "Las claves se rotan a mano. La clave activa tiene %{days} días."
|
|
72
|
+
fresh: "La clave activa tiene %{days} días y rota cada %{period} días."
|
|
73
|
+
stale: "La clave activa tiene %{days} días, más que su rotación de %{period} días."
|
|
74
|
+
advice: "Rota la clave en la página Configuración, o lee la tarea signing_keys en el registro del servidor."
|
|
75
|
+
release:
|
|
76
|
+
available: "La versión %{version} está disponible."
|
|
77
|
+
operator: "Esta versión necesita un paso de un operador. Lee sus notas antes de actualizar."
|
|
78
|
+
notes: "Notas de la versión"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
es:
|
|
2
|
+
manage:
|
|
3
|
+
links:
|
|
4
|
+
title: "Enlaces"
|
|
5
|
+
help: "Cuánto tiempo es válido cada enlace que masks envía por correo. Un enlace ya enviado conserva la validez con la que se envió. Una invitación a una organización cuenta desde la última vez que se envió."
|
|
6
|
+
invitation: "Invitación a una cuenta"
|
|
7
|
+
organization_invitation: "Invitación a una organización"
|
|
8
|
+
password_reset: "Restablecer la contraseña"
|
|
9
|
+
email_verification: "Confirmación del correo"
|
|
10
|
+
default: "%{length} (predeterminado)"
|
|
11
|
+
updated: "Validez del enlace guardada."
|
|
12
|
+
minutes:
|
|
13
|
+
one: "%{count} minuto"
|
|
14
|
+
other: "%{count} minutos"
|
|
15
|
+
hours:
|
|
16
|
+
one: "%{count} hora"
|
|
17
|
+
other: "%{count} horas"
|
|
18
|
+
days:
|
|
19
|
+
one: "%{count} día"
|
|
20
|
+
other: "%{count} días"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
authorize:
|
|
3
|
+
error:
|
|
4
|
+
asking: "Votre compte n’est dans aucun groupe autorisé à utiliser %{app}. Vous pouvez demander l’accès. Les personnes qui gèrent %{app} décident, et vous recevez un courriel dans tous les cas."
|
|
5
|
+
ask: "Demander l’accès"
|
|
6
|
+
asked: "Votre demande a été envoyée. Vous recevrez un courriel une fois qu’elle sera décidée."
|
|
7
|
+
waiting: "Votre demande pour utiliser %{app} est en attente. Vous recevrez un courriel une fois qu’elle sera décidée."
|
|
8
|
+
slow_down: "Vous avez demandé l’accès à cette application il y a moins d’une heure. Attendez la réponse."
|
|
9
|
+
back: "Retour à %{app}"
|
|
10
|
+
the_app: "l’application"
|
|
11
|
+
|
|
12
|
+
account:
|
|
13
|
+
index:
|
|
14
|
+
access:
|
|
15
|
+
heading: "Demandes d’accès"
|
|
16
|
+
lede: "Ces personnes ont été refusées par une application qui admet les membres de %{organization}. Approuver en fait des membres avec le rôle que vous choisissez."
|
|
17
|
+
asked: "A demandé à utiliser %{app} il y a %{age}"
|
|
18
|
+
role_of: "Rôle pour %{name}"
|
|
19
|
+
grant: "Approuver"
|
|
20
|
+
decline: "Refuser"
|
|
21
|
+
confirm_decline: "Refuser la demande de %{identifier} pour utiliser %{app} ? La personne reçoit un courriel et peut redemander dans une heure."
|
|
22
|
+
|
|
23
|
+
organization_access:
|
|
24
|
+
granted: "%{identifier} est maintenant %{role} de %{organization} et peut utiliser %{app}."
|
|
25
|
+
declined: "La demande de %{identifier} pour utiliser %{app} est refusée."
|
|
26
|
+
unknown: "Cette demande n’est pas en attente auprès de %{organization}."
|
|
27
|
+
|
|
28
|
+
actor_mailer:
|
|
29
|
+
access_granted:
|
|
30
|
+
subject: "Vous pouvez maintenant utiliser %{app}"
|
|
31
|
+
lede: "Votre demande pour utiliser %{app} sur %{tenant} a été approuvée. Reconnectez-vous à %{app} et vous serez admis."
|
|
32
|
+
action: "Ouvrir %{app}"
|
|
33
|
+
access_declined:
|
|
34
|
+
subject: "Votre demande pour utiliser %{app} a été refusée"
|
|
35
|
+
lede: "Une personne qui gère %{app} sur %{tenant} a refusé votre demande d’accès."
|
|
36
|
+
again: "Si vous pensez qu’il s’agit d’une erreur, demandez-lui directement. Vous pouvez redemander dans une heure."
|
|
37
|
+
|
|
38
|
+
events:
|
|
39
|
+
actions:
|
|
40
|
+
access:
|
|
41
|
+
requested: "A demandé l’accès à une application"
|
|
42
|
+
granted: "Accès à une application accordé"
|
|
43
|
+
declined: "Accès à une application refusé"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
account:
|
|
3
|
+
index:
|
|
4
|
+
app_passwords:
|
|
5
|
+
heading: "Mots de passe d’application"
|
|
6
|
+
entry: "Mots de passe d’application"
|
|
7
|
+
state:
|
|
8
|
+
none: "Aucun"
|
|
9
|
+
lede: "Un mot de passe d’application permet à une seule application, comme un serveur multimédia ou un NAS, de se connecter en votre nom sans votre second facteur. Il ne fonctionne que pour l’application pour laquelle il a été créé."
|
|
10
|
+
shown_once: "Voici le mot de passe d’application de %{name}. Il n’est affiché qu’une fois. Saisissez-le maintenant dans %{app}."
|
|
11
|
+
made_ago: "créé il y a %{age}"
|
|
12
|
+
used_ago: "utilisé pour la dernière fois il y a %{age}"
|
|
13
|
+
never_used: "jamais utilisé"
|
|
14
|
+
revoke: "Révoquer"
|
|
15
|
+
confirm_revoke: "Révoquer %{name} ? L’application ne peut plus se connecter avec lui dès maintenant."
|
|
16
|
+
name: "Nom"
|
|
17
|
+
name_placeholder: "Jellyfin sur la télé"
|
|
18
|
+
app: "Application"
|
|
19
|
+
make: "Créer un mot de passe d’application"
|
|
20
|
+
make_again: "Reconnectez-vous pour en créer un"
|
|
21
|
+
hint: "Votre propre mot de passe et vos clés d’accès restent inchangés. Révoquer un mot de passe d’application ne change rien d’autre."
|
|
22
|
+
none_offered: "Aucune application n’accepte encore de mot de passe d’application."
|
|
23
|
+
app_passwords:
|
|
24
|
+
again: "Reconnectez-vous pour créer un mot de passe d’application. Votre dernière connexion remonte à un moment."
|
|
25
|
+
unknown: "Ce compte n’a pas ce mot de passe d’application."
|
|
26
|
+
revoked: "%{name} est révoqué."
|
|
27
|
+
refused:
|
|
28
|
+
name: "Donnez au mot de passe d’application un nom de 64 caractères au plus."
|
|
29
|
+
app: "Cette application n’accepte pas les mots de passe d’application."
|
|
30
|
+
too_many: "Vous avez déjà %{most} mots de passe d’application. Révoquez-en un d’abord."
|
|
31
|
+
events:
|
|
32
|
+
actions:
|
|
33
|
+
app_password:
|
|
34
|
+
created: "Mot de passe d’application créé"
|
|
35
|
+
used: "Connexion avec un mot de passe d’application"
|
|
36
|
+
revoked: "Mot de passe d’application révoqué"
|
|
37
|
+
actor_mailer:
|
|
38
|
+
notification:
|
|
39
|
+
said:
|
|
40
|
+
app_password:
|
|
41
|
+
created: "Un mot de passe d’application a été créé sur votre compte %{tenant}. Il connecte une application sans votre second facteur."
|
|
42
|
+
revoked: "Un mot de passe d’application de votre compte %{tenant} a été révoqué."
|
|
@@ -159,6 +159,11 @@ fr:
|
|
|
159
159
|
updated: "Modèle d’e-mail modifié"
|
|
160
160
|
job:
|
|
161
161
|
failed: "Tâche de fond échouée pour ce locataire"
|
|
162
|
+
health:
|
|
163
|
+
failing: "Vérification d'état en échec"
|
|
164
|
+
recovered: "Vérification d'état rétablie"
|
|
165
|
+
release:
|
|
166
|
+
available: "Nouvelle version disponible"
|
|
162
167
|
stream:
|
|
163
168
|
created: "Flux d’événements ajouté"
|
|
164
169
|
updated: "Flux d’événements modifié"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
access_requests:
|
|
4
|
+
title: "Demandes d’accès"
|
|
5
|
+
lede: "Acteurs refusés par ce client qui ont demandé l’accès. Approuver les place dans l’un des groupes qu’il admet, et ils reçoivent un courriel dans tous les cas."
|
|
6
|
+
empty: "Personne n’attend d’accès."
|
|
7
|
+
asked: "Demandé %{day}"
|
|
8
|
+
as: "Groupe dans lequel les placer"
|
|
9
|
+
grant: "Approuver"
|
|
10
|
+
decline: "Refuser"
|
|
11
|
+
granted: "%{identifier} est maintenant dans %{label} et peut se connecter."
|
|
12
|
+
declined: "La demande de %{identifier} est refusée."
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
client:
|
|
4
|
+
sign_in:
|
|
5
|
+
app_passwords: "Accepter les mots de passe d’application"
|
|
6
|
+
app_passwords_help: "Les acteurs créent un mot de passe d’application pour ce client sur leur page de compte. Il les connecte par LDAP et forward auth sans second facteur, pour ce client seulement."
|
|
7
|
+
notices:
|
|
8
|
+
app_passwords_on: "Les acteurs peuvent maintenant créer un mot de passe d’application pour lui."
|
|
9
|
+
app_passwords_off: "Ses mots de passe d’application sont refusés dès maintenant."
|
|
10
|
+
ldap:
|
|
11
|
+
connect:
|
|
12
|
+
app: "Application"
|
|
13
|
+
no_app: "Aucune application"
|
|
14
|
+
app_help: "Choisissez le client sous lequel le service est enregistré. Les mots de passe d’application des acteurs pour ce client se lient alors sur une connexion qui s’est d’abord liée avec cet identifiant."
|
|
15
|
+
credentials:
|
|
16
|
+
app: "Accepte les mots de passe d’application de %{name}"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
forward_auth_rules:
|
|
4
|
+
title: "Règles"
|
|
5
|
+
lede: "La première règle qui couvre une requête la décide. Une requête sans règle demande une personne connectée qui peut se connecter."
|
|
6
|
+
empty: "Il n’y a aucune règle. Chaque requête demande une personne connectée qui peut se connecter."
|
|
7
|
+
paths: "Chemins"
|
|
8
|
+
paths_hint: "Un par ligne. * couvre un segment et ** toute profondeur, donc /admin/** couvre /admin et tout ce qui est dessous. Vide couvre tous les chemins."
|
|
9
|
+
methods: "Méthodes"
|
|
10
|
+
methods_hint: "GET, POST et les autres. Vide couvre toutes les méthodes."
|
|
11
|
+
networks: "Réseaux"
|
|
12
|
+
networks_hint: "Des adresses ou des plages, comme 192.168.0.0/16. Vide couvre toutes les adresses."
|
|
13
|
+
groups: "Groupes"
|
|
14
|
+
groups_hint: "Des clés de groupe, ou des rôles en clé:rôle. Vide couvre tout le monde."
|
|
15
|
+
outcome: "Résultat"
|
|
16
|
+
outcomes:
|
|
17
|
+
open: "Ouvert à tous, sans connexion"
|
|
18
|
+
one_factor: "Une personne connectée, sans deuxième facteur"
|
|
19
|
+
two_factor: "Une personne connectée, avec son deuxième facteur"
|
|
20
|
+
token: "Une personne connectée, ou un script avec un jeton d’accès"
|
|
21
|
+
deny: "Fermé à tout le monde"
|
|
22
|
+
rule: "Règle %{number}"
|
|
23
|
+
add: "Ajouter une règle"
|
|
24
|
+
remove: "Retirer"
|
|
25
|
+
up: "Monter"
|
|
26
|
+
down: "Descendre"
|
|
27
|
+
save: "Enregistrer les règles"
|
|
28
|
+
saved: "Règles enregistrées."
|
|
29
|
+
trust: "Une règle de réseau fait confiance à l’adresse envoyée par le proxy. Vérifiez que le proxy définit X-Forwarded-For lui-même."
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
group_sources:
|
|
4
|
+
source: "Se remplit depuis"
|
|
5
|
+
sources:
|
|
6
|
+
manual: "Des personnes ajoutées à la main"
|
|
7
|
+
rule: "Une règle"
|
|
8
|
+
provider: "Un fournisseur"
|
|
9
|
+
group: "D’autres groupes"
|
|
10
|
+
ledes:
|
|
11
|
+
manual: "Un gestionnaire ajoute et retire les personnes depuis leur propre page."
|
|
12
|
+
rule: "Toute personne qui remplit chaque condition. Une adresse e-mail compte une fois vérifiée. Un champ du profil compte seulement quand un annuaire le fixe, car les personnes ne peuvent pas le changer. Vérifié à chaque changement de profil et toutes les heures."
|
|
13
|
+
provider: "Toute personne dont la dernière connexion par le fournisseur listait le groupe."
|
|
14
|
+
group: "Toute personne dans l’un des groupes ou rôles d’organisation parents."
|
|
15
|
+
change: "Changer la façon dont %{name} se remplit"
|
|
16
|
+
kinds:
|
|
17
|
+
email_domain: "L’adresse e-mail se termine par"
|
|
18
|
+
profile: "Le champ du profil est égal à"
|
|
19
|
+
field: "Champ"
|
|
20
|
+
value: "Valeur"
|
|
21
|
+
add_condition: "Ajouter une condition"
|
|
22
|
+
remove_condition: "Retirer la condition"
|
|
23
|
+
provider: "Fournisseur"
|
|
24
|
+
choose_provider: "Choisir un fournisseur"
|
|
25
|
+
no_providers: "Ajoutez d’abord un fournisseur."
|
|
26
|
+
upstream_group: "Nom du groupe chez le fournisseur"
|
|
27
|
+
parent_labels: "Groupes parents"
|
|
28
|
+
parent_labels_hint: "Clés de groupe ou rôles d’organisation sous la forme clé:rôle, séparés par des virgules."
|
|
29
|
+
save: "Enregistrer"
|
|
30
|
+
cancel: "Annuler"
|
|
31
|
+
saved: "%{name} se remplit maintenant depuis %{source}."
|
|
32
|
+
refresh: "Actualiser maintenant"
|
|
33
|
+
refreshed: "%{name} est actualisé."
|
|
34
|
+
refreshed_at: "Actualisé %{when}."
|
|
35
|
+
never_refreshed: "Pas encore actualisé."
|
|
36
|
+
summary:
|
|
37
|
+
rule: "Se remplit par règle"
|
|
38
|
+
provider: "Se remplit depuis %{provider}"
|
|
39
|
+
group: "Se remplit depuis %{parents}"
|
|
40
|
+
by_hand: "Ajouté à la main, donc seul un gestionnaire le retire."
|
|
41
|
+
from:
|
|
42
|
+
rule: "Dans le groupe par sa règle, donc la règle décide."
|
|
43
|
+
provider: "Dans le groupe par une connexion chez le fournisseur, donc le fournisseur décide."
|
|
44
|
+
group: "Dans le groupe par un groupe parent, donc ce groupe décide."
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
health:
|
|
4
|
+
title: "État"
|
|
5
|
+
lede: "Les vérifications tournent toutes les 10 minutes. Chacune dit ce qu'elle a trouvé et quoi faire."
|
|
6
|
+
check_now: "Vérifier maintenant"
|
|
7
|
+
checking: "Vérification"
|
|
8
|
+
checked: "Vérifié %{when}"
|
|
9
|
+
never: "Les vérifications n'ont pas encore tourné. Elles tournent toutes les 10 minutes dès qu'un worker est lancé."
|
|
10
|
+
failed: "Les vérifications n'ont pas pu tourner : %{failure}"
|
|
11
|
+
statuses:
|
|
12
|
+
ok: "Bon"
|
|
13
|
+
warning: "À regarder"
|
|
14
|
+
failing: "En échec"
|
|
15
|
+
checks:
|
|
16
|
+
jobs:
|
|
17
|
+
title: "Tâches de fond"
|
|
18
|
+
elsewhere: "Les tâches tournent sur un autre serveur."
|
|
19
|
+
none: "Aucune tâche n'a échoué le dernier jour."
|
|
20
|
+
failed:
|
|
21
|
+
one: "Un type de tâche a échoué le dernier jour : %{jobs}."
|
|
22
|
+
other: "%{count} types de tâche ont échoué le dernier jour : %{jobs}."
|
|
23
|
+
advice: "Lisez l'erreur dans le journal du serveur. Chaque tâche retourne selon son horaire."
|
|
24
|
+
worker:
|
|
25
|
+
title: "Worker"
|
|
26
|
+
elsewhere: "Les tâches tournent sur un autre serveur."
|
|
27
|
+
unchecked: "La vérification du worker est désactivée."
|
|
28
|
+
reporting: "Un worker tourne."
|
|
29
|
+
silent: "Aucun worker ne s'est signalé depuis %{minutes} minutes."
|
|
30
|
+
advice: "Lancez le processus de tâches, ou mettez MASKS_JOBS_IN_WEB_SERVER à true pour que le serveur web exécute les tâches."
|
|
31
|
+
queue:
|
|
32
|
+
title: "File d'attente"
|
|
33
|
+
elsewhere: "Les tâches tournent sur un autre serveur."
|
|
34
|
+
unchecked: "La vérification de la file est désactivée."
|
|
35
|
+
moving: "Les tâches démarrent à l'heure."
|
|
36
|
+
stuck: "Une tâche attend de démarrer depuis %{since}, plus de %{minutes} minutes."
|
|
37
|
+
advice: "Ajoutez un worker, ou montez JOB_CONCURRENCY pour que plus de tâches tournent en même temps."
|
|
38
|
+
ldap:
|
|
39
|
+
title: "LDAP"
|
|
40
|
+
tls: "LDAP répond avec TLS."
|
|
41
|
+
local: "LDAP ne répond que sur la machine du serveur."
|
|
42
|
+
plain: "LDAP répond sur le port %{port} sans TLS, donc les mots de passe traversent le réseau en clair."
|
|
43
|
+
advice: "Définissez MASKS_LDAP_CERT et MASKS_LDAP_KEY, ou retirez MASKS_LDAP_PLAINTEXT."
|
|
44
|
+
metrics:
|
|
45
|
+
title: "Métriques"
|
|
46
|
+
"off": "La page des métriques est désactivée."
|
|
47
|
+
"on": "La page des métriques répond à une requête qui porte son jeton."
|
|
48
|
+
short: "Le jeton des métriques fait %{length} caractères, donc il peut être deviné."
|
|
49
|
+
advice: "Définissez MASKS_METRICS_TOKEN avec au moins %{needed} caractères aléatoires."
|
|
50
|
+
mail:
|
|
51
|
+
title: "Courriel"
|
|
52
|
+
none: "Aucun service de courriel n'est configuré."
|
|
53
|
+
answers: "Le serveur de courriel répond."
|
|
54
|
+
silent: "Le serveur de courriel n'a pas répondu : %{error}."
|
|
55
|
+
advice: "Vérifiez le serveur, le port et le réglage TLS sur la page Messages, et que le serveur accepte les connexions d'ici."
|
|
56
|
+
origin:
|
|
57
|
+
title: "Adresse publique"
|
|
58
|
+
unset: "Aucune adresse publique n'est définie, donc masks suit l'en-tête Host de chaque requête."
|
|
59
|
+
matches: "Les requêtes arrivent à l'adresse publique de ce locataire."
|
|
60
|
+
mismatch: "Les requêtes arrivent en %{seen}, mais l'adresse de ce locataire est %{origin}."
|
|
61
|
+
advice: "Faites envoyer X-Forwarded-Proto et X-Forwarded-Host par le proxy, et ajoutez-le à MASKS_TRUSTED_PROXIES."
|
|
62
|
+
domains:
|
|
63
|
+
title: "Domaines"
|
|
64
|
+
none: "Aucun domaine n'est revendiqué."
|
|
65
|
+
proven: "Chaque domaine revendiqué a toujours son enregistrement TXT."
|
|
66
|
+
missing: "L'enregistrement TXT manque pour %{domains}. Une revendication est libérée une semaine après la disparition de son enregistrement."
|
|
67
|
+
advice: "Remettez l'enregistrement TXT au nom indiqué sur la page Domaines."
|
|
68
|
+
keys:
|
|
69
|
+
title: "Clés de signature"
|
|
70
|
+
missing: "Ce locataire n'a aucune clé de signature active, donc rien ne peut être signé."
|
|
71
|
+
manual: "Les clés tournent à la main. La clé active a %{days} jours."
|
|
72
|
+
fresh: "La clé active a %{days} jours et tourne tous les %{period} jours."
|
|
73
|
+
stale: "La clé active a %{days} jours, au-delà de sa rotation de %{period} jours."
|
|
74
|
+
advice: "Faites tourner la clé sur la page Paramètres, ou lisez la tâche signing_keys dans le journal du serveur."
|
|
75
|
+
release:
|
|
76
|
+
available: "La version %{version} est disponible."
|
|
77
|
+
operator: "Cette version demande une étape d'un opérateur. Lisez ses notes avant de mettre à jour."
|
|
78
|
+
notes: "Notes de version"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
fr:
|
|
2
|
+
manage:
|
|
3
|
+
links:
|
|
4
|
+
title: "Liens"
|
|
5
|
+
help: "Durée de validité de chaque lien que masks envoie par e-mail. Un lien déjà envoyé garde la durée avec laquelle il a été envoyé. Une invitation dans une organisation compte depuis son dernier envoi."
|
|
6
|
+
invitation: "Invitation à un compte"
|
|
7
|
+
organization_invitation: "Invitation dans une organisation"
|
|
8
|
+
password_reset: "Réinitialisation du mot de passe"
|
|
9
|
+
email_verification: "Confirmation de l’e-mail"
|
|
10
|
+
default: "%{length} (par défaut)"
|
|
11
|
+
updated: "Durée du lien enregistrée."
|
|
12
|
+
minutes:
|
|
13
|
+
one: "%{count} minute"
|
|
14
|
+
other: "%{count} minutes"
|
|
15
|
+
hours:
|
|
16
|
+
one: "%{count} heure"
|
|
17
|
+
other: "%{count} heures"
|
|
18
|
+
days:
|
|
19
|
+
one: "%{count} jour"
|
|
20
|
+
other: "%{count} jours"
|
data/config/routes.rb
CHANGED
|
@@ -20,6 +20,7 @@ Masks::Server::Engine.routes.draw do
|
|
|
20
20
|
|
|
21
21
|
match "/authorize", to: "authorize#show", via: %i[get post], as: :authorize
|
|
22
22
|
get "/authorize/refused", to: "authorize#refused", as: :authorize_refused
|
|
23
|
+
post "/authorize/refused/access", to: "authorize#ask", as: :authorize_access_request
|
|
23
24
|
post "/par", to: "pushed_authorizations#create", as: :pushed_authorization
|
|
24
25
|
post "/device_authorization", to: "device_authorizations#create", as: :device_authorization
|
|
25
26
|
|
|
@@ -78,6 +79,8 @@ Masks::Server::Engine.routes.draw do
|
|
|
78
79
|
delete "/account/avatar", to: "avatars#destroy"
|
|
79
80
|
|
|
80
81
|
delete "/account/apps/:client_id", to: "apps#destroy", as: :account_app
|
|
82
|
+
post "/account/app_passwords", to: "app_passwords#create", as: :account_app_passwords
|
|
83
|
+
delete "/account/app_passwords/:id", to: "app_passwords#destroy", as: :account_app_password
|
|
81
84
|
post "/account/connections", to: "connections#create", as: :account_connections
|
|
82
85
|
delete "/account/connections/:id", to: "connections#detach", as: :account_connection
|
|
83
86
|
delete "/account/delegations/:id", to: "delegations#destroy", as: :account_delegation
|
|
@@ -89,6 +92,8 @@ Masks::Server::Engine.routes.draw do
|
|
|
89
92
|
post "/account/organizations/:key/members/:id/resend", to: "organization_members#resend",
|
|
90
93
|
as: :account_organization_member_resend
|
|
91
94
|
post "/account/organizations/:key/accept", to: "organization_members#accept", as: :account_organization_acceptance
|
|
95
|
+
post "/account/organizations/:key/access/:id", to: "organization_access#create", as: :account_organization_access
|
|
96
|
+
delete "/account/organizations/:key/access/:id", to: "organization_access#destroy"
|
|
92
97
|
end
|
|
93
98
|
|
|
94
99
|
scope constraints: { style: Regexp.union(Masks::Server::Avatars::STYLES), digest: /[0-9a-f]{16}/ } do
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class CreateAccessRequests < ActiveRecord::Migration[8.1]
|
|
2
|
+
include Masks::Server::TenantIsolation
|
|
3
|
+
|
|
4
|
+
def up
|
|
5
|
+
create_table :access_requests do |t|
|
|
6
|
+
t.references :tenant, null: false, foreign_key: { on_delete: :cascade }, index: false
|
|
7
|
+
t.references :actor, null: false, foreign_key: { on_delete: :cascade }, index: false
|
|
8
|
+
t.references :client, null: false, foreign_key: { on_delete: :cascade }, index: false
|
|
9
|
+
t.references :decided_by, foreign_key: { to_table: :actors, on_delete: :nullify }, index: false
|
|
10
|
+
t.string :label
|
|
11
|
+
t.datetime :granted_at
|
|
12
|
+
t.datetime :declined_at
|
|
13
|
+
t.timestamps
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
add_index :access_requests, %i[tenant_id actor_id client_id], unique: true,
|
|
17
|
+
where: "granted_at IS NULL AND declined_at IS NULL", name: "index_access_requests_on_open"
|
|
18
|
+
add_index :access_requests, %i[tenant_id client_id]
|
|
19
|
+
add_index :access_requests, :created_at
|
|
20
|
+
|
|
21
|
+
enable_row_level_security(:access_requests)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def down
|
|
25
|
+
disable_row_level_security(:access_requests)
|
|
26
|
+
drop_table :access_requests
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class AddSourcesToGroups < ActiveRecord::Migration[8.1]
|
|
2
|
+
def change
|
|
3
|
+
add_column :groups, :source, :string, null: false, default: "manual"
|
|
4
|
+
add_column :groups, :rule, :jsonb, null: false, default: []
|
|
5
|
+
add_reference :groups, :provider, foreign_key: { on_delete: :nullify }
|
|
6
|
+
add_column :groups, :upstream_group, :string
|
|
7
|
+
add_column :groups, :parent_labels, :jsonb, null: false, default: []
|
|
8
|
+
add_column :groups, :refreshed_at, :datetime
|
|
9
|
+
add_index :groups, %i[tenant_id source]
|
|
10
|
+
|
|
11
|
+
add_column :group_members, :sourced_by, :string
|
|
12
|
+
|
|
13
|
+
add_column :connections, :upstream_groups, :jsonb, null: false, default: []
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class CreateHealthChecks < ActiveRecord::Migration[8.1]
|
|
2
|
+
include Masks::Server::TenantIsolation
|
|
3
|
+
|
|
4
|
+
def up
|
|
5
|
+
create_table :health_checks do |t|
|
|
6
|
+
t.references :tenant, null: false, foreign_key: { on_delete: :cascade }, index: false
|
|
7
|
+
t.string :name, null: false
|
|
8
|
+
t.string :status, null: false
|
|
9
|
+
t.string :summary, null: false
|
|
10
|
+
t.jsonb :details, null: false, default: {}
|
|
11
|
+
t.datetime :checked_at, null: false
|
|
12
|
+
t.datetime :changed_at, null: false
|
|
13
|
+
t.timestamps
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
add_index :health_checks, %i[tenant_id name], unique: true
|
|
17
|
+
|
|
18
|
+
enable_row_level_security(:health_checks)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def down
|
|
22
|
+
disable_row_level_security(:health_checks)
|
|
23
|
+
drop_table :health_checks
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
class AddLinkLifetimesToTenants < ActiveRecord::Migration[8.1]
|
|
2
|
+
def change
|
|
3
|
+
add_column :tenants, :invitation_lifetime, :integer, null: false, default: 7 * 24 * 60 * 60
|
|
4
|
+
add_column :tenants, :organization_invitation_lifetime, :integer, null: false, default: 14 * 24 * 60 * 60
|
|
5
|
+
add_column :tenants, :password_reset_lifetime, :integer, null: false, default: 30 * 60
|
|
6
|
+
add_column :tenants, :email_verification_lifetime, :integer, null: false, default: 2 * 24 * 60 * 60
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -40,8 +40,9 @@ module Masks
|
|
|
40
40
|
|
|
41
41
|
engine? ? say_engine_database : say_server_database
|
|
42
42
|
|
|
43
|
-
say "In production,
|
|
44
|
-
say "emailed link
|
|
43
|
+
say "In production, masks keeps the address its setup screen was first opened at, and builds the"
|
|
44
|
+
say "issuer and every emailed link from it. To name the address yourself, set"
|
|
45
|
+
say "MASKS_PUBLIC_ORIGIN_TEMPLATE to #{origin_example}."
|
|
45
46
|
say ""
|
|
46
47
|
say "Then run bin/rails db:prepare and bin/rails masks:tenants, and open #{login_path} to set up"
|
|
47
48
|
say "the first account with the setup token masks prints."
|