diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm index 4227a27cf..2173354b2 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm @@ -41,6 +41,7 @@ sub defaultValues { 'checkXSS' => 1, 'confirmFormMethod' => 'post', 'contextSwitchingIdRule' => 1, + 'contextSwitchingPrefix' => 'switching', 'contextSwitchingRule' => 0, 'contextSwitchingStopWithLogout' => 1, 'cookieName' => 'lemonldap', diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/JSON.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/JSON.pm index 3424b8cca..b1df8a22b 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/JSON.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/JSON.pm @@ -15,10 +15,13 @@ sub newNotification { eval { $self->logger->error("Unable to decode JSON file: $err") }; return 0; } + my @notifs; $json = [$json] unless ( ref($json) eq 'ARRAY' ); + foreach my $notif (@$json) { my @data; + $notif->{reference} =~ s/_/-/g; # Remove underscores (#2135) # Mandatory information foreach (qw(date uid reference)) { diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/XML.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/XML.pm index 557b6fd5e..3e0c30221 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/XML.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Notifications/XML.pm @@ -25,12 +25,15 @@ sub newNotification { eval { $self->logger->error("Unable to read XML file : $err") }; return 0; } + my @notifs; my ( $version, $encoding ) = ( $xml->version(), $xml->encoding() ); + foreach my $notif ( $xml->documentElement->getElementsByTagName('notification') ) { my @data = (); + $notif->{reference} =~ s/_/-/g; # Remove underscores (#2135) # Mandatory information foreach (qw(date uid reference)) { diff --git a/lemonldap-ng-manager/MANIFEST b/lemonldap-ng-manager/MANIFEST index b8209c036..d6b813cc8 100644 --- a/lemonldap-ng-manager/MANIFEST +++ b/lemonldap-ng-manager/MANIFEST @@ -37,6 +37,8 @@ README REST-API.md scripts/lmConfigEditor scripts/testConfBackend.pl +site/api/api.fcgi +site/api/api.psgi site/coffee/2ndfa.coffee site/coffee/diff.coffee site/coffee/filterFunctions.coffee @@ -46,8 +48,6 @@ site/coffee/notifications.coffee site/coffee/sessions.coffee site/coffee/viewDiff.coffee site/coffee/viewer.coffee -site/api/api.fcgi -site/api/api.psgi site/htdocs/manager.fcgi site/htdocs/manager.psgi site/htdocs/static/bwr/angular-animate/angular-animate.js diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm index 8b78ee2ad..bcab1736d 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm @@ -1007,6 +1007,10 @@ qr/(?:(?:https?):\/\/(?:(?:(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.] }, 'type' => 'text' }, + 'contextSwitchingPrefix' => { + 'default' => 'switching', + 'type' => 'text' + }, 'contextSwitchingRule' => { 'default' => 0, 'type' => 'boolOrExpr' diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm index 7cc2632d0..b4d805a8d 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm @@ -562,6 +562,12 @@ sub attributes { documentation => 'Stop context switching by logout', flags => 'p', }, + contextSwitchingPrefix => { + type => 'text', + default => 'switching', + documentation => 'Prefix to store real session Id', + flags => 'p', + }, decryptValueRule => { type => 'boolOrExpr', default => 0, diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Tests.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Tests.pm index d90f37648..f11fdc2d4 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Tests.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf/Tests.pm @@ -42,14 +42,8 @@ sub tests { # Check if portal URL is well formated portalURL => sub { - # Checking for ending slash - $conf->{portal} .= '/' - unless ( $conf->{portal} =~ qr#/$# ); - - # Deleting trailing ending slash - my $regex = qr#/+$#; - $conf->{portal} =~ s/$regex/\//; - + # Append or remove trailing ending slashes + $conf->{portal} =~ s%/*$%/%; return 1; }, @@ -779,7 +773,7 @@ sub tests { # Notification system required with removed SF notification sfRemovedNotification => sub { return 1 unless ( $conf->{sfRemovedMsgRule} ); - return ( -1, + return ( 1, 'Notification system must be enabled to display a notification if a SF is removed' ) if ( $conf->{sfRemovedUseNotif} and not $conf->{notification} ); return 1; diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Notifications.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Notifications.pm index a6f16df7f..89a2abb94 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Notifications.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Notifications.pm @@ -271,6 +271,8 @@ sub newNotification { return $self->sendError( $req, undef, 200 ); } + $json->{reference} =~ s/_/-/g; # Remove underscores (#2135) + foreach my $r (qw(uid reference xml)) { return $self->sendError( $req, "Missing $r", 200 ) unless ( $json->{$r} ); diff --git a/lemonldap-ng-manager/t/80-attributes.t b/lemonldap-ng-manager/t/80-attributes.t index b413726a7..4b9838b52 100644 --- a/lemonldap-ng-manager/t/80-attributes.t +++ b/lemonldap-ng-manager/t/80-attributes.t @@ -66,7 +66,7 @@ my @notManagedAttributes = ( # Other ini-only prms 'checkTime', 'status', 'soapProxyUrn', 'impersonationPrefix', 'pdataDomain', - 'mySessionAuthorizedRWKeys', + 'mySessionAuthorizedRWKeys', 'contextSwitchingPrefix' ); # Words used either as attribute name and node title diff --git a/lemonldap-ng-portal/MANIFEST b/lemonldap-ng-portal/MANIFEST index 8ffebee06..c3f2bd118 100644 --- a/lemonldap-ng-portal/MANIFEST +++ b/lemonldap-ng-portal/MANIFEST @@ -476,6 +476,7 @@ site/templates/common/script.tpl t/01-AuthDemo.t t/01-CSP-and-CORS-headers.t t/01-pdata.t +t/02-Password-Demo-Local-noPpolicy.t t/02-Password-Demo-Local-Ppolicy.t t/02-Password-Demo.t t/03-ConfTimeout.t @@ -641,6 +642,7 @@ t/67-CheckUser-with-Impersonation-and-Macros.t t/67-CheckUser-with-issuer-SAML-POST.t t/67-CheckUser-with-token.t t/67-CheckUser.t +t/68-ContextSwitching-with-Impersonation.t t/68-ContextSwitching-with-Logout.t t/68-ContextSwitching-with-TOTP-and-Notification.t t/68-ContextSwitching.t diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm index 6629b0e01..4b530987d 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm @@ -213,6 +213,13 @@ sub display { $speChars =~ s/(?:^\s|\s$)//g; $skinfile = 'menu'; + my $isPP = + $self->conf->{passwordPolicyMinSize} + || $self->conf->{passwordPolicyMinLower} + || $self->conf->{passwordPolicyMinUpper} + || $self->conf->{passwordPolicyMinDigit} + || $speChars; + #utf8::decode($auth_user); %templateParams = ( AUTH_USER => $req->{sessionInfo}->{ $self->conf->{portalUserAttr} }, @@ -228,6 +235,7 @@ sub display { PPOLICY_MINLOWER => $self->conf->{passwordPolicyMinLower}, PPOLICY_MINUPPER => $self->conf->{passwordPolicyMinUpper}, PPOLICY_MINDIGIT => $self->conf->{passwordPolicyMinDigit}, + PPOLICY_NOPOLICY => !$isPP, PPOLICY_ALLOWEDSPECHAR => $speChars, ( $speChars diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/ContextSwitching.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/ContextSwitching.pm index 6cb2f9670..051748dd0 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/ContextSwitching.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/ContextSwitching.pm @@ -75,7 +75,7 @@ sub init { sub display { my ( $self, $req ) = @_; my $realSessionId = - $req->userData->{"$self->{conf}->{impersonationPrefix}_session_id"}; + $req->userData->{"$self->{conf}->{contextSwitchingPrefix}_session_id"}; my $realSession; unless ( $realSession = $self->p->getApacheSession($realSessionId) ) { $self->userLogger->info( @@ -85,14 +85,17 @@ sub display { # Check access rules unless ( $self->rule->( $req, $req->userData ) - || $req->userData->{"$self->{conf}->{impersonationPrefix}_session_id"} ) + || $req->userData->{ + "$self->{conf}->{contextSwitchingPrefix}_session_id"} ) { $self->userLogger->warn('ContextSwitching service NOT authorized'); return $self->p->do( $req, [ sub { PE_IMPERSONATION_SERVICE_NOT_ALLOWED } ] ); } - if ( $req->userData->{"$self->{conf}->{impersonationPrefix}_session_id"} ) { + if ( + $req->userData->{"$self->{conf}->{contextSwitchingPrefix}_session_id"} ) + { $self->logger->debug('Request to stop ContextSwitching'); if ( $self->conf->{contextSwitchingStopWithLogout} ) { $self->userLogger->notice("Stop ContextSwitching for $req->{user}"); @@ -177,14 +180,9 @@ sub run { # Create spoofed session $req = $self->_switchContext( $req, $spoofId ); - if ( $req->error ) { - if ( $req->error == PE_BADCREDENTIALS ) { - $statut = PE_MALFORMEDUSER; - } - else { - $statut = $req->error; - } - } + $statut = + ( $req->error == PE_BADCREDENTIALS ? PE_MALFORMEDUSER : $req->error ) + if $req->error; # Main session $self->p->updateSession( $req, $req->sessionInfo ); @@ -211,12 +209,11 @@ sub _switchContext { ] ); if ( my $error = $self->p->process($req) ) { - if ( $error == PE_BADCREDENTIALS ) { - $self->userLogger->warn( - 'ContextSwitching requested for an unvalid user (' - . $req->{user} - . ")" ); - } + $self->userLogger->warn( + 'ContextSwitching requested for an unvalid user (' + . $req->{user} + . ")" ) + if ( $error == PE_BADCREDENTIALS ); $self->logger->debug("Process returned error: $error"); $req->error($error); $raz = 1; @@ -233,37 +230,34 @@ sub _switchContext { $raz = 1; } - $req->sessionInfo->{"$self->{conf}->{impersonationPrefix}_session_id"} = + $req->sessionInfo->{"$self->{conf}->{contextSwitchingPrefix}_session_id"} = $realSessionId; - if ($raz) { - return $self->_abortImpersonation( $req, $spoofId, $realId, 1 ); - } - else { + return $self->_abortImpersonation( $req, $spoofId, $realId, 1 ) if $raz; + + $self->logger->debug( + "Update sessionInfo with real authenticationLevel: $realAuthLevel"); + $req->sessionInfo->{authenticationLevel} = $realAuthLevel; + delete $req->sessionInfo->{groups}; + + # Compute groups & macros again with real authenticationLevel + $req->steps( [ $self->p->groupsAndMacros, 'setLocalGroups' ] ); + if ( my $error = $self->p->process($req) ) { $self->logger->debug( - "Update sessionInfo with real authenticationLevel: $realAuthLevel"); - $req->sessionInfo->{authenticationLevel} = $realAuthLevel; - delete $req->sessionInfo->{groups}; - - # Compute groups & macros again with real authenticationLevel - $req->steps( [ $self->p->groupsAndMacros, 'setLocalGroups' ] ); - if ( my $error = $self->p->process($req) ) { - $self->logger->debug( - "ContextSwitching: Process returned error: $error"); - $req->error($error); - } - - $self->userLogger->notice( - "Start ContextSwitching: $realId becomes $spoofId "); - return $req; + "ContextSwitching: Process returned error: $error"); + $req->error($error); } + + $self->userLogger->notice( + "Start ContextSwitching: $realId becomes $spoofId "); + return $req; } sub _abortImpersonation { my ( $self, $req, $spoofId, $realId, $abort ) = @_; my $type = $abort ? 'sessionInfo' : 'userData'; my $realSessionId = - $req->{$type}->{"$self->{conf}->{impersonationPrefix}_session_id"}; + $req->{$type}->{"$self->{conf}->{contextSwitchingPrefix}_session_id"}; my $session; unless ( $session = $self->p->getApacheSession($realSessionId) ) { $self->userLogger->info("Session $session expired"); @@ -293,7 +287,8 @@ sub _abortImpersonation { $req->urldc( $self->conf->{portal} ); $req->id($realSessionId); $self->p->buildCookie($req); - delete $req->{$type}->{"$self->{conf}->{impersonationPrefix}_session_id"}; + delete $req->{$type} + ->{"$self->{conf}->{contextSwitchingPrefix}_session_id"}; return $req; } @@ -301,7 +296,7 @@ sub _abortImpersonation { sub displayLink { my ( $self, $req ) = @_; return 'OFF' - if $req->userData->{"$self->{conf}->{impersonationPrefix}_session_id"}; + if $req->userData->{"$self->{conf}->{contextSwitchingPrefix}_session_id"}; return 'ON' if $self->rule->( $req, $req->userData ); } diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/ar.json b/lemonldap-ng-portal/site/htdocs/static/languages/ar.json index ded8409c1..36b569650 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/ar.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/ar.json @@ -229,6 +229,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"المصادقات المتبقية، غير كلمة المرور الخاصة بك!", "proxyError":"بوابة سيئة: غير قادر على الانضمام لالخادم البعيد", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/de.json b/lemonldap-ng-portal/site/htdocs/static/languages/de.json index a9fc69593..7c04224c3 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/de.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/de.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"verbleibende Authentifizierungen, bitte Passwort ändern !", "proxyError":"Bad gateway: Der Remote-Server kann nicht verbunden werden", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/en.json b/lemonldap-ng-portal/site/htdocs/static/languages/en.json index 71129f550..a75049524 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/en.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/en.json @@ -229,6 +229,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"Bad gateway: unable to join remote server", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/es.json b/lemonldap-ng-portal/site/htdocs/static/languages/es.json index d437c34db..e7f0005b9 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/es.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/es.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Mayúsculas, como mínimo:", "passwordPolicyMinDigit":"Dígitos, como mínimo:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"autenticaciones restantes, ¡cambie su contraseña!.", "proxyError":"Puerta de enlace no válida: servidor remoto inalcanzable", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/fi.json b/lemonldap-ng-portal/site/htdocs/static/languages/fi.json index baa406552..4f541555b 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/fi.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/fi.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"Bad gateway: unable to join remote server", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/fr.json b/lemonldap-ng-portal/site/htdocs/static/languages/fr.json index a13601570..8e4cd824e 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/fr.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/fr.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper": "Minimum de majuscules :", "passwordPolicyMinDigit": "Minimum de chiffres :", "passwordPolicyMinSpeChar":"Minimum de caractères spéciaux :", +"passwordPolicyNone":"Vous êtes libre de choisir votre mot de passe !", "passwordPolicySpecialChar":"Caractères spéciaux autorisés :", "ppGrace": "authentifications restantes, changez votre mot de passe !", "proxyError": "Mauvaise passerelle : impossible de joindre le serveur amont", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/it.json b/lemonldap-ng-portal/site/htdocs/static/languages/it.json index aaf0b57b0..af2a55ac2 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/it.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/it.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"autenticazioni restanti, modifica la tua password!", "proxyError":"Gateway errata: impossibile associarsi a un server remoto", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/nl.json b/lemonldap-ng-portal/site/htdocs/static/languages/nl.json index e289b5218..230ebfc05 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/nl.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/nl.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"Bad gateway: unable to join remote server", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/pt.json b/lemonldap-ng-portal/site/htdocs/static/languages/pt.json index 1296debcb..c7d64d37c 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/pt.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/pt.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"Bad gateway: unable to join remote server", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/ro.json b/lemonldap-ng-portal/site/htdocs/static/languages/ro.json index 241cdbd5f..25fdb79f8 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/ro.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/ro.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"Bad gateway: unable to join remote server", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/tr.json b/lemonldap-ng-portal/site/htdocs/static/languages/tr.json index 3c0484554..1078c3a36 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/tr.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/tr.json @@ -229,6 +229,7 @@ "passwordPolicyMinUpper":"Minimum büyük harf karakter sayısı :", "passwordPolicyMinDigit":"Minimum rakam karakter sayısı :", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"kimlik doğrulaması kaldı, parolanızı değiştirin!", "proxyError":"Kötü ağ geçidi: uzak sunucuya katılamıyor", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/vi.json b/lemonldap-ng-portal/site/htdocs/static/languages/vi.json index 13c35d45b..c3efd4986 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/vi.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/vi.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"chứng thực vẫn còn, thay đổi mật khẩu của bạn!", "proxyError":"Gateway không chính xác: không thể kết nối máy chủ từ xa", diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/zh.json b/lemonldap-ng-portal/site/htdocs/static/languages/zh.json index b6bffb441..f32bf96f5 100644 --- a/lemonldap-ng-portal/site/htdocs/static/languages/zh.json +++ b/lemonldap-ng-portal/site/htdocs/static/languages/zh.json @@ -228,6 +228,7 @@ "passwordPolicyMinUpper":"Minimal upper characters:", "passwordPolicyMinDigit":"Minimal digit characters:", "passwordPolicyMinSpeChar":"Minimal special characters:", +"passwordPolicyNone":"You are free to choose your password!", "passwordPolicySpecialChar":"Allowed special characters:", "ppGrace":"authentications remaining, change your password!", "proxyError":"错误的网关:无法连接远程服务器", diff --git a/lemonldap-ng-portal/site/templates/bootstrap/passwordpolicy.tpl b/lemonldap-ng-portal/site/templates/bootstrap/passwordpolicy.tpl index 561f02c35..9db1268b3 100644 --- a/lemonldap-ng-portal/site/templates/bootstrap/passwordpolicy.tpl +++ b/lemonldap-ng-portal/site/templates/bootstrap/passwordpolicy.tpl @@ -20,4 +20,7 @@