From 681ddbb75f83409b72b3087bb1440ec961d0f321 Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Wed, 11 Sep 2019 22:59:19 +0200 Subject: [PATCH 1/9] Append Debian release note (#1858) --- debian/NEWS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/debian/NEWS b/debian/NEWS index c63e939db..824d8aecf 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,11 @@ +lemonldap-ng (2.0.5-1) UNRELEASED; urgency=medium + + FastCGI / uWsgi servers require llng-lmlog.conf and llng-lua-headers.conf. + Those configuration files are now provided by lemonldap-ng-handler package + and installed in /etc/nginx/snippets directory. + + -- maudoux Wed, 11 Sep 2019 22:47:57 +0200 + lemonldap-ng (2.0.5-1) unstable; urgency=medium This version adds some improvements in cryptographic functions. To take From db591a789f7e3114b8751dcff8f24e2e0dda6674 Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Wed, 11 Sep 2019 22:59:36 +0200 Subject: [PATCH 2/9] Typo --- .../lib/Lemonldap/NG/Handler/Main/Run.pm | 2 +- .../lib/Lemonldap/NG/Handler/Server/Nginx.pm | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm index 764279cda..a0c7ef390 100644 --- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm @@ -423,7 +423,7 @@ sub fetchId { $value = $class->tsv->{cipher}->decrypt($value); unless ( $value =~ s/^(.*)? (.*)$/$1/ and $2 eq $vhost ) { $class->userLogger->error( - "Bad CDA cookie: available for $2 instead od $vhost"); + "Bad CDA cookie: available for $2 instead of $vhost"); return undef; } } diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Server/Nginx.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Server/Nginx.pm index df25c4f1f..7cfe5a893 100644 --- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Server/Nginx.pm +++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Server/Nginx.pm @@ -54,13 +54,14 @@ sub _run { # auth_request_set $headervalue1 $upstream_http_headervalue1; # #proxy_set_header $headername1 $headervalue1; # # OR -# #fastcgi_param $fheadername1 $headervalue1; +# #fastcgi_param $headername1 $headervalue1; # -# LLNG::Handler::Server::Main add also a header called Lm-Remote-User set to -# whatToTrace value that can be used in Nginx virtualhost configuration to -# insert user id in logs +# LLNG::Handler::Server::Main add also headers called Lm-Remote-User set to +# whatToTrace value and Lm-Remote-Custom that can be used in Nginx virtualhosts configuration to +# insert user id and a custom value in logs # -# auth_request_set $llremoteuser $upstream_http_lm_remote_user +# auth_request_set $lmremote_user $upstream_http_lm_remote_user +# auth_request_set $lmremote_custom $upstream_http_lm_remote_custom # #@param $req Lemonldap::NG::Common::PSGI::Request sub handler { From 847d12a116a80a1c4a79c64882d88008ad622b59 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 11 Sep 2019 23:46:36 +0200 Subject: [PATCH 3/9] Fix d/NEWS --- debian/NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/NEWS b/debian/NEWS index 824d8aecf..22b8fb4bb 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,4 +1,4 @@ -lemonldap-ng (2.0.5-1) UNRELEASED; urgency=medium +lemonldap-ng (2.0.6-1) unstable; urgency=medium FastCGI / uWsgi servers require llng-lmlog.conf and llng-lua-headers.conf. Those configuration files are now provided by lemonldap-ng-handler package From 2ddfa357b696e6b1f10d2e451927193b7f4a1881 Mon Sep 17 00:00:00 2001 From: Xavier Date: Thu, 12 Sep 2019 06:35:21 +0200 Subject: [PATCH 4/9] Update es tranlation. Thanks to Jawira ! --- .../site/htdocs/static/languages/es.json | 138 +++++++++--------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/es.json b/lemonldap-ng-portal/site/htdocs/static/languages/es.json index 457f33c25..5932d78b2 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/es.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/es.json @@ -1,8 +1,8 @@ { "PE0":"Usuario autentificado", -"PE1":"Su sesión ha expirado. Vuelva a autenticarse", +"PE1":"Su sesión ha caducado. Vuelva a autenticarse de nuevo", "PE2":"Introduzca su identificante o contraseña", -"PE3":"Cuenta o contraseña LDAP de la aplicación incorrecta", +"PE3":"Error en la cuenta o contraseña LDAP de la aplicación", "PE4":"Usuario no reconocido", "PE5":"Contraseña o identificador incorrecto", "PE6":"Conexión fallida al servidor LDAP", @@ -22,7 +22,7 @@ "PE30":"Contraseña muy reciente", "PE31":"Contraseña utilizada muy recientemente", "PE32":" autenticaciones restantes, cambie de contraseña", -"PE33":"Faltan %d días, %d horas, %d minutos y %d segundos para que su contraseña expire.", +"PE33":"Faltan %d días, %d horas, %d minutos y %d segundos para que su contraseña caduque.", "PE34":"Las contraseñas no coinciden", "PE35":"La contraseña se ha modificado", "PE36":"Tiene un mensaje nuevo", @@ -72,7 +72,7 @@ "PE80":"Esta dirección ya está siendo utilizada", "PE81":"Intento de autenticación inválido", "PE82":"Tiempo de espera de autenticación exedido", -"PE83":"La verificación U2F ha fallado. Reintente o contacte su administrador", +"PE83":"La verificación U2F ha fallado. Reintente o póngase en contacto con su administrador", "PE84":"Usted no está autorizado a acceder a este servidor", "PE85":"El sitio remoto pide una nueva sesión (y el plugin UpgradeSession no está cargado). Desconéctese y reintente", "PE86":"Su cuenta está bloqueada. Espere 30s antes de autenticarse de nuevo", @@ -83,7 +83,7 @@ "PE91":"Acceso no autorizado al servicio OID", "PE92":"Acceso no autorizado al servicio GET", "PE93":"Acceso no concedido al servicio de SUPLANTACIÓN", -"PE94":"A required attribute is not available", +"PE94":"Un atributo obligatorio no está presente", "2fRegRequired":"Este servicio necesita la autenticación de dos factores. Registre un dispositivo ahora, luego reingrese al portal.", "accept":"Aceptar", "accessDenied":"No está autorizado a acceder a esta aplicación", @@ -97,9 +97,9 @@ "askToUpgrade":"Esta aplicación requiere de un nivel de autenticación más alto. ¿Desea reautenticar?", "attributes":"ATRIBUTOS", "authPortal":"Portal de autenticación", -"authRemaining":"%s authentications remaining, change your password!", +"authRemaining":"%s autenticaciones restantes, ¡cambie su contraseña!", "autoAccept":"Aceptar automáticamente en 30 segundos ", -"back2CasUrl":"The application you just logged out of has provided a link it would like you to follow", +"back2CasUrl":"La aplicación de la cual se acaba de desconectar le ha enviado un enlace y le gustaría que lo siguiese", "back2Portal":"Volver al portal", "badCode":"Código incorrecto", "badName":"Nombre incorrecto", @@ -109,10 +109,10 @@ "changePwd":"Cambie su contraseña", "checkLastLogins":"Verificar mis últimos accesos", "checkUser":"Verificar el perfil SSO del usuario ", -"checkUserMerged":"Check user SSO profile. Some Real and Spoofed SSO groups are merged!", -"checkUserComputeSession":"Computed session data!", +"checkUserMerged":"Verifique el perfil SSO del usuario. ¡Algunos grupos SSO (reales y suplantados) están fusionados!", +"checkUserComputeSession":"¡Datos de sesión calculados!", "choose2f":"Seleccione su segundo factor", -"chooseApp":"Choose an application your are allowed to access to", +"chooseApp":"Elija una aplicación a la cual se le está permitido acceder", "clickHere":"Por favor haga clic aquí", "clickOnYubikey":"Haga clic en su Yubikey", "closeSSO":"Cierre su sesión SSO", @@ -129,13 +129,13 @@ "enterCred":"Por favor ingrese sus credenciales", "enterExt2fCode":"Un código le ha sido enviado. Por favor ingréselo ", "enterMail2fCode":"Un código le ha sido enviado a dirección de e-mail. Por favor ingréselo", -"enterOpenIDLogin":"Please enter your OpenID login", +"enterOpenIDLogin":"Por favor ingrese su usuario OpenID", "enterRadius2fCode":"Por favor ingrese su código OTP", "enterRest2fCode":"Por favor ingrese su código OTP", "enterTotpCode":"Ingrese el código TOTP", "enterYubikey":"Por favor utilice su Yubikey", "errorMsg":"Mensaje de Error", -"expired2Fremoved":"%s expired 2F devices have been removed!", +"expired2Fremoved":"¡%s dispositivos 2F caducados han sido suprimidos!", "ext2f":"Código de verificación", "fillTheForm":"Llene el formulario", "firstName":"Nombre", @@ -146,7 +146,7 @@ "goToPortal":"Ir al portal", "gplSoft":"Software libre cubierto bajo licencia GPL", "groups_sso":"GRUPOS SSO", -"headers":"HEADERS", +"headers":"ENCABEZADOS", "id":"Id", "contextSwitching_ON":"Suplantar otro usuario", "contextSwitching_OFF":"Parar suplantación", @@ -159,17 +159,17 @@ "lastName":"Apellido(s)", "linkValidUntil":"Este mensaje contiene un enlace para reiniciar su contraseña, este enlace es válido hasta", "loginHistory":"Historial de conexión", -"login":"Conexión", +"login":"Usuario", "logout":"Desconexión ", "logoutConfirm":"¿Desea desconectarse?", -"logoutFromOtherApp":"Logout from other applications ...", +"logoutFromOtherApp":"Desconectarse de otras aplicaciones...", "logoutFromSP":"Desconectando proveedor de servicios...", "macros":"MACROS", "mail":"E-mail", "mail2f":"Código de e-mail", "mailSent2":"Un mensaje ha sido enviado a su dirección de e-mail", "maintenanceMode":"Aplicación en mantenimiento, por favor intente conectarse luego", -"maxNumberof2FDevicesReached":"Maximum number of 2F devices reached!", +"maxNumberof2FDevicesReached":"¡El límite de dispositivos 2F ha sido alcanzado!", "missingCode":"Código faltante", "name":"Nombre", "newMessages":"Nuevo(s) mensaje(s)", @@ -177,33 +177,33 @@ "newPwdSentTo":"Una confirmación ha sido enviada a su dirección de e-mail.", "noHistory":"Esta es su primera conexión, bienvenido.", "notAuthorized":"Usted no está autorizado a hacer esto", -"notFound":"Not found: you try to access to an unavailable page", +"notFound":"No encontrado: página no disponible", "noTOTPFound":"TOTP no encontrado", "noU2FKeyFound":"Llave U2F no encontrada", -"oidcConsent":"The application %s would like to know:", -"oidcConsents":"OIDC consents", -"oidcConsentsFull":"OpenID Connect consents", -"oneExpired2Fremoved":"An expired 2F device has been removed!", -"openidAp":"Do you agree to provide the following parameters?", +"oidcConsent":"La aplicación %s quisiera saber:", +"oidcConsents":"Permisos OIDC", +"oidcConsentsFull":"Permisos OpenID Connect", +"oneExpired2Fremoved":"¡Un dispositivo 2F caducado ha sido suprimido!", +"openidAp":"¿Está de acuerdo en proporcionar los siguientes parámetros?", "openIdExample":"por ejemplo:http://myopenid.org/juan", -"openidExchange":"Do you want to authenticate yourself on %s ?", -"openidPA":"Data usage policy is available at", -"openidRpns":"Parameter %s requested for federation isn't available", +"openidExchange":"¿Desea autenticarse en %s?", +"openidPA":"La política de uso de datos está disponible en", +"openidRpns":"El parámetro %s solicitado por la agrupación no está disponible", "openSessionSpace":"Este espacio le permite abrir una sesión SSO. Esto le ayudará a acceder de manera segura a todas las aplicaciones autorizadas por su perfil.", "openSSOSession":"Abra su sesión SSO", "otherSessions":"Otras sesiones activas", "password":"Contraseña", -"passwordPolicy":"Please respect the following policy:", -"passwordPolicyMinSize":"Minimal size:", -"passwordPolicyMinLower":"Minimal lower characters:", -"passwordPolicyMinUpper":"Minimal upper characters:", -"passwordPolicyMinDigit":"Minimal digit characters:", +"passwordPolicy":"Por favor respete la siguiente política de seguridad:", +"passwordPolicyMinSize":"Tamaño mínimo:", +"passwordPolicyMinLower":"Minúsculas, como mínimo:", +"passwordPolicyMinUpper":"Mayúsculas, como mínimo:", +"passwordPolicyMinDigit":"Dígitos, como mínimo:", "ppGrace":"autenticaciones restantes, ¡cambie su contraseña!.", -"proxyError":"Bad gateway: unable to join remote server", +"proxyError":"Puerta de enlace no válida: servidor remoto inalcanzable", "pwdChange":"Cambio de contraseña", "pwd":"Contraseña", -"pwdResetAlreadyIssued":"A password reset request was already issued on ", -"pwdWillExpire":"%s days, %s hours, %s minutes and %s seconds before password expiration, change it!", +"pwdResetAlreadyIssued":"Ya fue expedida una solicitud de reinicio de contraseña", +"pwdWillExpire":"Faltan %s días, %s horas, %s minutos y %s segundos para que su contraseña caduque.", "radius2f":"Radius", "redirectedFrom":"Ha sido redirigido desde", "redirectedIn":"Usted será redirigido en 30 segundos", @@ -212,53 +212,53 @@ "refreshrights":"Actualizar mis derechos", "refuse":"Rechazar", "register":"Registrar", -"registerRequestAlreadyIssued":"A register request for this account was already issued on ", +"registerRequestAlreadyIssued":"Ya fue expedida una solicitud de registro para esta cuenta", "rememberChoice":"Recordar mi elección", -"removeOtherSessions":"Remove other sessions", -"resendConfirmMail":"Resend confirmation mail?", -"resentConfirm":"Do you want the confirmation mail to be resent?", +"removeOtherSessions":"Suprimir las otras sesiones", +"resendConfirmMail":"¿Reenviar e-mail de confirmación?", +"resentConfirm":"¿Desea que el e-mail de confirmación sea reenviado?", "resetPwd":"Reiniciar mi contraseña", "rest2f":"Código de verificación", "rightsReloadNeedsLogout":"La recarga de derechos necesita desconectarse y conectarse de nuevo", -"scope":"Scope", +"scope":"Alcance", "search":"Buscar", "selectIdP":"Seleccione su proveedor de identidad", "service":"Servicio", "sendPwd":"Enviarme un enlace", -"serverError":"Error occurs on the server", +"serverError":"Ocurrió un error en el servidor", "serviceProvidedBy":"Servicio proveído por", -"sessionsDeleted":"The following sessions have been closed", -"sfaManager":"2ndFA Manager", -"spoofId":"Spoofed Id", -"SSOSessionInactive":"SSO session inactive", -"stayConnected":"Stay connected on this device", -"submit":"Submit", -"switchContext":"Switch context", -"totp2f":"OTP App", -"totpExistingKey":"A TOTP secret already exists", -"touchU2fDevice":"Please touch the flashing U2F device now.", -"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.", -"type":"Type", -"u2f":"U2F Key", -"u2fFailed":"U2F verification failed. Retry or contact your administrator", -"u2fPermission":"You may be prompted to allow the site permission to access your security keys. After granting permission, the device will start to blink.", -"u2fWelcome":"U2F device management", -"unableToGetKey":"Unable to access to your key. Retry or contact your administrator", +"sessionsDeleted":"Las siguientes sesiones han sido cerradas", +"sfaManager":"Administrador 2ndFA", +"spoofId":"Identificador suplantado", +"SSOSessionInactive":"Sesión SSO inactiva", +"stayConnected":"Seguir conectado en este dispositivo", +"submit":"Enviar", +"switchContext":"Cambiar contexto", +"totp2f":"Aplicación OTP", +"totpExistingKey":"Un secreto TOTP ya existe", +"touchU2fDevice":"Por favor toque el dispositivo U2F centelleante ahora.", +"touchU2fDeviceOrEnterTotp":"Por favor toque el dispositivo U2F centelleante o ingrese el código TOTP.", +"type":"Tipo", +"u2f":"Llave U2F", +"u2fFailed":"La verificación U2F ha fallado. Reintente o póngase en contacto con su administrador", +"u2fPermission":"Es posible que se le pida su autorización para acceder a sus llaves de seguridad. Después de autorizar el acceso, el dispositivo comenzará a centellear.", +"u2fWelcome":"Administración de dispositivos U2F", +"unableToGetKey":"Imposible acceder a su llave. Reintente o póngase en contacto con su administrador", "unknownAction":"Acción desconocida", -"unregister":"Unregister", -"updateCdc":"Update Common Domain Cookie", -"upgradeSession":"Upgrade session", +"unregister":"Suprimir", +"updateCdc":"Actualizar el cookie de dominio común", +"upgradeSession":"Actualizar la sesión", "user":"Usuario", -"useYubikey":"use your Yubikey", -"utotp2f":"TOTP-or-U2F", +"useYubikey":"utilice su Yubikey", +"utotp2f":"TOTP-o-U2F", "value":"Valor", "verify":"Verificar", "VHnotFound":"Virtual Host no encontrado", "wait":"Esperar", -"waitingmessage":"Authentication in progress, please wait", +"waitingmessage":"Autenticación en progreso, espere por favor", "warning":"Precaución", -"welcomeOnPortal":"Welcome on your secured authentication portal.", -"yesResendMail":"Yes, resend the mail", +"welcomeOnPortal":"Bienvenido a su portal de autenticación.", +"yesResendMail":"Sí, reenviar el e-mail", "yourAddress":"Su dirección", "yourApps":"Sus aplicaciones", "yourEmail":"Su e-mail", @@ -266,11 +266,11 @@ "yourIdentityIs":"Su identidad es", "yourKeyIsRegistered":"Su llave está registrada", "yourKeyIsAlreadyRegistered":"¡Su llave YA FUE registrada!", -"yourKeyIsUnregistered":"Your key has been unregistered", +"yourKeyIsUnregistered":"Su llave ha sido suprimida", "yourKeyIsVerified":"Su llave está verificada", -"yourNewTotpKey":"Your new TOTP key, please test it and enter the code", -"yourPhone":"Your phone number", -"yourProfile":"Your profile", -"yourTotpKey":"Your TOTP key", +"yourNewTotpKey":"Su nueva llave TOTP, por favor pruébela e ingrese el código", +"yourPhone":"Su número telefónico", +"yourProfile":"Su perfil", +"yourTotpKey":"Su llave TOTP", "yubikey2f":"Yubikey" } \ No newline at end of file From c75a74da5a677beb701154f87069f936eaf96b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Thu, 12 Sep 2019 17:54:43 +0200 Subject: [PATCH 5/9] Display password form if password is refused (#1930) --- .../NG/Portal/Plugins/MailPasswordReset.pm | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm index c436b8f79..659d195cc 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm @@ -24,6 +24,10 @@ use Lemonldap::NG::Portal::Main::Constants qw( PE_PASSWORDFORMEMPTY PE_PASSWORD_MISMATCH PE_PASSWORD_OK + PE_PP_INSUFFICIENT_PASSWORD_QUALITY + PE_PP_PASSWORD_TOO_SHORT + PE_PP_PASSWORD_TOO_YOUNG + PE_PP_PASSWORD_IN_HISTORY PE_TOKENEXPIRED PE_USERNOTFOUND ); @@ -441,7 +445,10 @@ sub changePwd { my $cpq = $self->Lemonldap::NG::Portal::Password::Base::checkPasswordQuality( $req->data->{newpassword} ); - return $cpq unless ( $cpq == PE_OK ); + unless ( $cpq == PE_OK ) { + $self->ott->setToken( $req, $req->sessionInfo ); + return $cpq; + } # Modify the password TODO: change this # Populate $req->{user} for logging purpose @@ -455,7 +462,10 @@ sub changePwd { $self->conf->{portalRequireOldPassword} = $tmp; # Mail token can be used only one time, delete the session if all is ok - return $result unless ( $result == PE_PASSWORD_OK or $result == PE_OK ); + unless ( $result == PE_PASSWORD_OK or $result == PE_OK ) { + $self->ott->setToken( $req, $req->sessionInfo ); + return $result; + } # Send mail containing the new password $req->data->{mailAddress} ||= @@ -605,9 +615,15 @@ sub display { $tplPrm{DISPLAY_PASSWORD_FORM} = 1; } - # Display password change form again if passwords mismatch + # Display password change form again + # - if passwords mismatch + # - if password quality check fail elsif ($req->error == PE_PASSWORDFORMEMPTY - || $req->error == PE_PASSWORD_MISMATCH ) + || $req->error == PE_PASSWORD_MISMATCH + || $req->error == PE_PP_INSUFFICIENT_PASSWORD_QUALITY + || $req->error == PE_PP_PASSWORD_TOO_SHORT + || $req->error == PE_PP_PASSWORD_TOO_YOUNG + || $req->error == PE_PP_PASSWORD_IN_HISTORY ) { $self->logger->debug('Display password form'); $tplPrm{DISPLAY_PASSWORD_FORM} = $req->sessionInfo->{pwdAllowed}; From 70d2856d71d3f116823ecdb220ea5c7188cde1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Thu, 12 Sep 2019 18:26:56 +0200 Subject: [PATCH 6/9] Option to display password generation box (#1928) --- .../lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm | 2 ++ lemonldap-ng-portal/site/templates/bootstrap/mail.tpl | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm index 659d195cc..c2efb6a12 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm @@ -555,6 +555,8 @@ sub display { PPOLICY_MINLOWER => $self->conf->{passwordPolicyMinLower}, PPOLICY_MINUPPER => $self->conf->{passwordPolicyMinUpper}, PPOLICY_MINDIGIT => $self->conf->{passwordPolicyMinDigit}, + DISPLAY_GENERATE_PASSWORD => + $self->conf->{portalDisplayGeneratePassword}, ); if ( $req->data->{mailToken} and diff --git a/lemonldap-ng-portal/site/templates/bootstrap/mail.tpl b/lemonldap-ng-portal/site/templates/bootstrap/mail.tpl index 5059fa31c..7d7635f09 100644 --- a/lemonldap-ng-portal/site/templates/bootstrap/mail.tpl +++ b/lemonldap-ng-portal/site/templates/bootstrap/mail.tpl @@ -145,6 +145,7 @@ +
@@ -155,6 +156,7 @@

+