Bug#1107656: unblock: lemonldap-ng/2.21.1+ds-1

Yadd yadd at debian.org
Wed Jun 11 12:54:17 BST 2025


Package: release.debian.org
Severity: normal
X-Debbugs-Cc: lemonldap-ng at packages.debian.org, yadd at debian.org
Control: affects -1 + src:lemonldap-ng
User: release.debian.org at packages.debian.org
Usertags: unblock

Please unblock package lemonldap-ng

[ Reason ]
Debian Trixie embeds version 2.21.x of lemonldap-ng which is a LTS
version. Upstream community published a new LTS version for branch
2.21.x which fixes the following issues:
- fix error when admin script are used as root with PostgreSQL
- fix empty display parameter sent in OIDC authorization request
- fix OpenID-Connect doesn't manage "prompt=none" for unauthenticated users
- fix adding a new CAS application in Manager also add a CAS server with
  the same name (regression)
- fix internal server error when resending 2FA code if token has expired
  (regression)
- fix _lastAuthnUTime missing when using "Switch context another user"
- add slovak translation

[ Impact ]
Blocking bugs, especially for CAS protocol.

[ Tests ]
Upstream test coverage is good and was updated with this version

[ Risks ]
Low risk: patch is not complex, lemonldap-ng has no reverse
dependencies and new tests cover changes.

Changes:
- update doc
- update test files
- update "HOME" variable in admin scripts after changing uid
- update translation and add slovak translation
- update OpenID-Connect libraries:
  * catch "prompt=none" for unauthenticated users
  * don't set empty parameters in authorization-code-flow
- move _lastAuthnUTime initialization into the right place
  (setAuthSessionInfo() instead of authenticate())

[ Checklist ]
  [X] all changes are documented in the d/changelog
  [X] I reviewed all changes and I approve them
  [X] attach debdiff against the package in testing

Best regards,
Xavier

unblock lemonldap-ng/2.21.1+ds-1
-------------- next part --------------
diff --git a/changelog b/changelog
index dabc1563f..c6cce398b 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,18 @@
+lemonldap-ng (2.21.1) noble; urgency=medium
+
+  * Bugs:
+    * #3205: lemonldap scripts fail with permission error when run as root with pg tls backend
+    * #3361: Empty display parameter sent in OIDC authorization request
+    * #3367: OIDC doesn't manage "prompt=none" for unauthenticated users
+    * #3397: Adding a new CAS application in Manager also add a CAS server with the same name
+    * #3399: Internal server error when resending 2FA code if token has expired
+    * #3401: _lastAuthnUTime missing when using "Switch context another user"
+
+  * Improvements:
+    * #3363: Add Slovak translation into portal
+
+ -- Cl?ment <clem.oudot at gmail.com>  Wed, 11 Jun 2025 10:56:27 +0200
+
 lemonldap-ng (2.21.0) noble; urgency=medium
 
   * Bugs:
diff --git a/codemeta.json b/codemeta.json
index 6bb40c082..b52a0857c 100644
--- a/codemeta.json
+++ b/codemeta.json
@@ -6,11 +6,11 @@
     "contIntegration": "https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/pipelines",
     "dateCreated": "2004-01-01",
     "datePublished": "2010-12-06",
-    "dateModified": "2025-04-07",
+    "dateModified": "2025-06-11",
     "downloadUrl": "https://lemonldap-ng.org/download.html",
     "issueTracker": "https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues",
     "name": "LemonLDAP::NG",
-    "version": "2.21.0",
+    "version": "2.21.1",
     "description": "LemonLDAP::NG is a complete and modular Web-SSO system that can run with reverse-proxies or directly on application webservers. It can be used in conjunction with OpenID-Connect, CAS and SAML systems as identity or service provider. It can also be used as proxy between those federation systems.\n\nIt manages both authentication and authorization and provides headers for accounting. So you can have a full AAA protection. Authorizations are built by associating a regular expression and a rule. Regular expression is applied on the requested URL and the rule calculates if the user is authorized.",
     "applicationCategory": "WebSSO",
     "developmentStatus": "active",
diff --git a/debian/changelog b/debian/changelog
index f39861c19..758eefa50 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,14 @@
+lemonldap-ng (2.21.1+ds-1) unstable; urgency=medium
+
+  * Update patch
+  * Don't import useless dev/conf files
+  * New upstream LTS version
+
+ -- Yadd <yadd at debian.org>  Wed, 11 Jun 2025 13:28:41 +0200
+
 lemonldap-ng (2.21.0+ds-4) unstable; urgency=medium
 
-  * Fix "shuffle bug" (Closes: #1104421)
+  * Fix "shuffle bug" (Closes: #1105406)
 
  -- Yadd <yadd at debian.org>  Tue, 13 May 2025 22:32:24 +0200
 
diff --git a/debian/copyright b/debian/copyright
index 0cc91c3ec..d8d9708ca 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -38,6 +38,7 @@ Files-Excluded: lemonldap-ng-manager/site/htdocs/static/bwr/angular/angular.js
  lemonldap-ng-portal/site/htdocs/static/bwr/fingerprintjs2/fingerprint2.min.js.map
  lemonldap-ng-portal/site/htdocs/static/bwr/jssha/dist/sha1.min.js
  fastcgi-server/man/llng-fastcgi-server.8p
+ dev/conf
  doc/pages/documentation/current/.buildinfo
  .gitlab
  .gitlab-ci.yml
diff --git a/debian/patches/fix-makefile.patch b/debian/patches/fix-makefile.patch
index 671fb8d1c..07efa2dee 100644
--- a/debian/patches/fix-makefile.patch
+++ b/debian/patches/fix-makefile.patch
@@ -1,6 +1,6 @@
 Description: fix makefile (shuffle bug)
 Author: Yadd <yadd at debian.org>
-Bug-Debian: https://bugs.debian.org/1104421
+Bug-Debian: https://bugs.debian.org/1105406
 Forwarded: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/676a4ef2
 Last-Update: 2025-05-13
 
diff --git a/dev/conf/lmConf-1.json b/dev/conf/lmConf-1.json
deleted file mode 100644
index 498ed8f11..000000000
--- a/dev/conf/lmConf-1.json
+++ /dev/null
@@ -1,222 +0,0 @@
-{
-	"https": 0,
-	"applicationList": {
-		"0001-cat": {
-			"catname": "Sample applications",
-			"0002-app": {
-				"options": {
-					"description": "A simple application displaying authenticated user",
-					"display": "auto",
-					"logo": "demo.png",
-					"name": "Application Test 1",
-					"uri": "http://test1.llng.localhost:8080/"
-				},
-				"type": "application"
-			},
-			"0003-app": {
-				"options": {
-					"description": "The same simple application displaying authenticated user",
-					"display": "auto",
-					"logo": "thumbnail.png",
-					"name": "Application Test 2",
-					"uri": "http://test2.llng.localhost:8080/"
-				},
-				"type": "application"
-			},
-			"type": "category"
-		},
-		"0004-cat": {
-			"catname": "Administration",
-			"0005-app": {
-				"options": {
-					"description": "Configure LemonLDAP::NG WebSSO",
-					"display": "auto",
-					"logo": "configure.png",
-					"name": "WebSSO Manager",
-					"uri": "http://manager.llng.localhost:8080/manager.html"
-				},
-				"type": "application"
-			},
-			"0006-app": {
-				"options": {
-					"description": "Explore WebSSO notifications",
-					"display": "auto",
-					"logo": "database.png",
-					"name": "Notifications Explorer",
-					"uri": "http://manager.llng.localhost:8080/notifications.html"
-				},
-				"type": "application"
-			},
-			"0007-app": {
-				"options": {
-					"description": "Explore WebSSO sessions",
-					"display": "auto",
-					"logo": "database.png",
-					"name": "Sessions Explorer",
-					"uri": "http://manager.llng.localhost:8080/sessions.html"
-				},
-				"type": "application"
-			},
-			"0008-app": {
-				"options": {
-					"description": "Explore WebSSO 2FA sessions",
-					"display": "auto",
-					"logo": "database.png",
-					"name": "2FA Sessions Explorer",
-					"uri": "http://manager.llng.localhost:8080/2ndfa.html"
-				},
-				"type": "application"
-			},
-			"type": "category"
-		},
-		"0008-cat": {
-			"catname": "Documentation",
-			"0009-app": {
-				"options": {
-					"description": "Documentation supplied with LemonLDAP::NG",
-					"display": "on",
-					"logo": "help.png",
-					"name": "Local documentation",
-					"uri": "http://manager.llng.localhost:8080/doc/"
-				},
-				"type": "application"
-			},
-			"0010-app": {
-				"options": {
-					"description": "Official LemonLDAP::NG Website",
-					"display": "on",
-					"logo": "network.png",
-					"name": "Official Website",
-					"uri": "https://lemonldap-ng.org/"
-				},
-				"type": "application"
-			},
-			"type": "category"
-		}
-	},
-	"authentication": "Demo",
-	"cfgAuthor": "The LemonLDAP::NG team",
-	"cfgAuthorIP": "127.0.0.1",
-	"cfgDate": 1428138808,
-	"cfgLog": "Default configuration provided by LemonLDAP::NG team",
-	"cfgNum": "1",
-	"cfgVersion": "2.0.0",
-	"cookieName": "lemonldap",
-	"customFunctions": "My::hello My::get_additional_arg",
-	"demoExportedVars": {
-		"cn": "cn",
-		"mail": "mail",
-		"uid": "uid"
-	},
-	"domain": "llng.localhost",
-	"exportedHeaders": {
-		"test1.llng.localhost": {
-			"Auth-User": "$uid",
-			"Ip-Addr": "$ipAddr",
-			"Hello": "hello()",
-			"Uri": "$ENV{REQUEST_URI}",
-			"Macro-Uri": "$UA",
-			"Additional-Arg": "get_additional_arg('header-added')",
-			"Base64": "encode_base64('a:b','')"
-		},
-		"test2.llng.localhost": {
-			"Auth-User": "$uid"
-		}
-	},
-	"exportedVars": {},
-	"globalStorage": "Apache::Session::File",
-	"globalStorageOptions": {
-		"Directory": "/app/dev/sessions",
-		"LockDirectory": "/app/dev/sessions/lock",
-		"generateModule": "Lemonldap::NG::Common::Apache::Session::Generate::SHA256"
-	},
-	"groups": {},
-	"key": "qwertyui",
-	"localSessionStorageOptions": {
-		"cache_depth": 3,
-		"cache_root": "/app/dev/sessions/",
-		"default_expires_in": 600,
-		"directory_umask": "007",
-		"namespace": "lemonldap-ng-sessions"
-	},
-	"locationRules": {
-		"auth.llng.localhost": {
-			"(?#checkUser)^/checkuser": "$uid eq \"dwho\"",
-			"(?#checkDevOps)^/checkdevops": "$uid eq \"dwho\"",
-			"(?#errors)^/lmerror/": "accept",
-			"default": "accept"
-		},
-		"manager.llng.localhost": {
-			"(?#Configuration)^/(manager\\.html|conf|$)": "$uid eq \"dwho\"",
-			"(?#Notifications)^/notifications": "$uid eq \"dwho\" or $uid eq \"rtyler\"",
-			"(?#Sessions)^/sessions": "$uid eq \"dwho\" or $uid eq \"rtyler\"",
-			"default": "$uid eq \"dwho\" or $uid eq \"rtyler\""
-		},
-		"test1.llng.localhost": {
-			"^/logout": "logout_sso",
-			"^/index.pl\\?logout_app$": "logout_app http://test1.llng.localhost:8080/index.pl?foo=1",
-			"^/index.pl\\?logout_all$": "logout_app_sso http://lemonldap-ng.org/welcome/",
-			"^/saml": "unprotect",
-			"default": "accept"
-		},
-		"test2.llng.localhost": {
-			"^/logout": "logout_sso",
-			"default": "accept"
-		}
-	},
-	"vhostOptions": {
-		"manager.llng.localhost": {
-			"vhostMaintenance": 0,
-			"vhostPort": -1,
-			"vhostHttps": -1,
-			"vhostAliases": "",
-			"vhostServiceTokenTTL": -1,
-			"vhostAccessToTrace": "My::accessToTrace, Doctor, Who, _whatToTrace",
-			"vhostType": "Main"
-		}
-	},
-	"loginHistoryEnabled": 1,
-	"macros": {
-		"UA": "$ENV{HTTP_USER_AGENT}",
-		"_whatToTrace": "$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""
-	},
-	"notification": 1,
-	"notificationStorage": "File",
-	"notificationStorageOptions": {
-		"dirName": "/app/dev"
-	},
-	"passwordDB": "Demo",
-	"persistentStorage": "Apache::Session::File",
-	"persistentStorageOptions": {
-		"Directory": "/app/dev/sessions/persistents",
-		"LockDirectory": "/app/dev/sessions/persistents/lock",
-		"generateModule": "Lemonldap::NG::Common::Apache::Session::Generate::SHA256"
-	},
-	"portal": "http://auth.llng.localhost:8080/",
-	"portalSkin": "bootstrap",
-	"portalSkinBackground": "1280px-Cedar_Breaks_National_Monument_partially.jpg",
-	"post": {
-		"test2.llng.localhost": {},
-		"manager.llng.localhost": {},
-		"test1.llng.localhost": {
-			"/form.html": {
-				"vars": [
-					["postuid", "$_user"],
-					["postmail", "'x at x.org'"],
-					["poststatic", "'static content'"]
-				],
-				"jqueryUrl": "http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js",
-				"buttonSelector": "#bt",
-				"formSelector": "#test",
-				"target": "/index.pl"
-			}
-		}
-	},
-	"registerDB": "Demo",
-	"securedCookie": 0,
-	"sessionDataToRemember": {},
-	"timeout": 72000,
-	"userDB": "Same",
-	"whatToTrace": "_whatToTrace",
-	"customToTrace": "mail"
-}
diff --git a/dev/conf/lmConf-10.json b/dev/conf/lmConf-10.json
deleted file mode 100644
index d8e208e71..000000000
--- a/dev/conf/lmConf-10.json
+++ /dev/null
@@ -1 +0,0 @@
-{"cfgNum":10,"ldapSearchDeref":"find","grantSessionRules":{},"oidcServiceMetaDataJWKSURI":"jwks","checkUserDisplayNormalizedHeaders":0,"findUserControl":"^[*\\w]+$","findUserWildcard":"*","corsMax_Age":"86400","SMTPServer":"","samlAuthnContextMapTLSClient":5,"checkDevOpsDisplayNormalizedHeaders":1,"SSLIssuerVar":"SSL_CLIENT_I_DN","sfExtra":{},"rest2fVerifyArgs":{},"slaveAuthnLevel":2,"webauthn2fSelfRegistration":0,"samlIDPMetaDataOptions":{},"ldapGroupAttributeName":"member","issuerDBSAMLPath":"^/saml/","okta2fActivation":0,"oidcServiceEncAlgorithmEnc":"A256GCM","issuerDBOpenIDPath":"^/openidserver/","checkUserDisplayHiddenAttributes":0,"cfgAuthorIP":"10.0.2.100","mailCharset":"utf-8","notifyDeleted":1,"samlServiceSignatureMethod":"RSA_SHA256","totp2fAuthnLevel":"4","radiusExportedVars":{},"ldapExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"oidcRPStateTimeout":600,"port":-1,"portalDisplayLoginHistory":1,"krbRemoveDomain":1,"ldapUsePasswordResetAttribute":1,"issuerDBSAMLRule":1,"casAuthnLevel":1,"userDB":"Same","oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-4":4,"loa-1":1,"loa-2":2,"loa-3":3},"key":"qwertyui","ldapAuthnLevel":2,"cspConnect":"'self'","contextSwitchingRule":0,"globalLogoutRule":0,"notificationWildcard":"allusers","issuerDBJitsiMeetTokensRule":1,"portalPingInterval":60000,"pamService":"login","webauthn2fAttestation":"none","nginxCustomHandlers":{},"githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","samlSPMetaDataMacros":null,"portalDisplayRegister":1,"failedLoginNumber":5,"webauthnAppId":1,"newLocationWarningLocationAttribute":"ipAddr","exportedVars":{},"corsAllow_Methods":"POST,GET","scrollTop":400,"checkXSS":1,"yubikey2fUserCanRemoveKey":1,"oidcServiceAccessTokenExpiration":3600,"issuersTimeout":120,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","registerTimeout":0,"samlAuthnContextMapPasswordProtectedTransport":3,"oidcServiceMetaDataUserInfoURI":"userinfo","samlSPMetaDataOptions":{},"oidcOPMetaDataJWKS":{},"stayConnectedTimeout":2592000,"checkUserDisplayComputedSession":1,"apacheAuthnLevel":3,"openIdSreg_timezone":"_timezone","issuerDBCASPath":"^/cas/","oidcOPMetaDataExportedVars":null,"cookieName":"lemonldap","cspDefault":"'self'","portalErrorOnExpiredSession":1,"password2fUserCanRemoveKey":1,"samlIDPSSODescriptorWantAuthnRequestsSigned":1,"ext2fActivation":0,"adaptativeAuthenticationLevelRules":{},"oidcServiceMetaDataIntrospectionURI":"introspect","totp2fInterval":30,"mailTimeout":0,"pamAuthnLevel":2,"totp2fUserCanRemoveKey":1,"gpgDb":"","securedCookie":0,"samlNameIDFormatMapKerberos":"uid","oidcRPMetaDataScopeRules":null,"oidcStorageOptions":{},"samlOrganizationDisplayName":"Example","demoExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"singleSession":0,"persistentStorageOptions":{"LockDirectory":"/app/dev/sessions/persistents/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions/persistents"},"casAttributes":{},"contextSwitchingIdRule":1,"reloadTimeout":5,"notificationStorage":"File","notificationDefaultCond":"","bruteForceProtectionTempo":30,"passwordResetAllowedRetries":3,"oidcServiceAuthorizationCodeExpiration":60,"oidcServiceKeyTypeEnc":"RSA","newLocationWarningLocationDisplayAttribute":"","facebookUserField":"id","openIdSreg_nickname":"uid","ldapGroupAttributeNameUser":"dn","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"oidcRPMetaDataExportedVars":{},"applicationList":{"0004-cat":{"0008-app":{"type":"application","options":{"name":"2FA Sessions Explorer","description":"Explore WebSSO 2FA sessions","logo":"database.png","display":"auto","uri":"http://manager.llng.localhost:8080/2ndfa.html"}},"type":"category","0006-app":{"options":{"description":"Explore WebSSO notifications","name":"Notifications Explorer","logo":"database.png","uri":"http://manager.llng.localhost:8080/notifications.html","display":"auto"},"type":"application"},"catname":"Administration","0005-app":{"options":{"description":"Configure LemonLDAP::NG WebSSO","name":"WebSSO Manager","uri":"http://manager.llng.localhost:8080/manager.html","display":"auto","logo":"configure.png"},"type":"application"},"0007-app":{"type":"application","options":{"logo":"database.png","display":"auto","uri":"http://manager.llng.localhost:8080/sessions.html","name":"Sessions Explorer","description":"Explore WebSSO sessions"}}},"0008-cat":{"0010-app":{"options":{"description":"Official LemonLDAP::NG Website","name":"Official Website","uri":"https://lemonldap-ng.org/","display":"on","logo":"network.png"},"type":"application"},"catname":"Documentation","0009-app":{"options":{"description":"Documentation supplied with LemonLDAP::NG","name":"Local documentation","uri":"http://manager.llng.localhost:8080/doc/","display":"on","logo":"help.png"},"type":"application"},"type":"category"},"0001-cat":{"0003-app":{"type":"application","options":{"description":"The same simple application displaying authenticated user","name":"Application Test 2","uri":"http://test2.llng.localhost:8080/","display":"auto","logo":"thumbnail.png"}},"type":"category","0002-app":{"type":"application","options":{"display":"auto","uri":"http://test1.llng.localhost:8080/","logo":"demo.png","name":"Application Test 1","description":"A simple application displaying authenticated user"}},"catname":"Sample applications"}},"rest2fActivation":0,"issuerDBCASRule":1,"openIdAuthnLevel":1,"corsExpose_Headers":"*","samlNameIDFormatMapX509":"mail","oidcServiceOldKeyTypeSig":"RSA","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","authentication":"Choice","useSafeJail":1,"timeout":72000,"facebookAuthnLevel":1,"dbiExportedVars":{},"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","samlMetadataForceUTF8":1,"totp2fSelfRegistration":1,"samlAuthnContextMapKerberos":4,"samlSPMetaDataXML":null,"stayConnectedBypassFG":0,"checkUserDisplayEmptyValues":0,"casAppMetaDataMacros":null,"certificateResetByMailCertificateAttribute":"userCertificate;binary","customPluginsParams":{},"oidcServiceDynamicRegistrationExportedVars":{},"sfManagerRule":1,"mail2fCodeRegex":"\\d{6}","customToTrace":"mail","samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","casAccessControlPolicy":"none","casSrvMetaDataExportedVars":{},"oidcServiceMetaDataCheckSessionURI":"checksession.html","oidcAuthnLevel":1,"crowdsecAction":"reject","bruteForceProtectionMaxFailed":3,"localSessionStorage":"Cache::FileCache","ldapTimeout":10,"githubClientID":"cd5857b36056d0bf968b","oidcRPCallbackGetParam":"openidconnectcallback","trustedBrowserUseTotp":1,"samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","restAuthnLevel":2,"rememberDefaultChecked":1,"hideOldPassword":1,"newLocationWarningMaxValues":"0","samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","checkUserDisplayPersistentInfo":0,"issuerDBOpenIDRule":1,"yubikey2fPublicIDSize":12,"webauthnAuthnLevel":3,"stayConnected":0,"oidcServiceNewKeyTypeSig":"RSA","samlSPSSODescriptorAuthnRequestsSigned":1,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","impersonationSkipEmptyValues":1,"SMTPTLS":"","oidcServiceOldKeyTypeEnc":"RSA","locationDetectGeoIpLanguages":"en, fr","jitsiExpiration":"300","passwordDB":"Choice","portalCheckLogins":1,"successLoginNumber":5,"webauthn2fUserCanRemoveKey":1,"vhostOptions":{"test2.llng.localhost":{},"auth.llng.localhost":{},"manager.llng.localhost":{"vhostMaintenance":0,"vhostHttps":-1,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostPort":-1,"vhostAliases":"","vhostType":"Main","vhostServiceTokenTTL":-1},"test1.llng.localhost":{"vhostHttps":-1,"vhostComment":"","vhostAuthnLevel":"4","vhostAccessToTrace":"","vhostServiceTokenTTL":-1,"vhostAliases":"","vhostMaintenance":0,"vhostPort":-1,"vhostType":"Main"}},"locationRules":{"test1.llng.localhost":{"default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/saml":"unprotect","^/logout":"logout_sso","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1"},"manager.llng.localhost":{"(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"auth.llng.localhost":{"(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","default":"accept","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","(?#errors)^/lmerror/":"accept"},"test2.llng.localhost":{"default":"accept","^/logout":"logout_sso"}},"redirectFormMethod":"get","cspScript":"'self'","twitterAuthnLevel":1,"oidcServiceMetaDataAuthorizeURI":"authorize","trustedBrowserRule":1,"mail2fActivation":0,"ldapGroupAttributeNameSearch":"cn","messageBrokerOptions":{},"managerDn":"","passwordPolicyMaxSize":0,"sameSite":"","passwordPolicySpecialChar":"__ALL__","cfgVersion":"2.19.2","password2fSelfRegistration":0,"yubikey2fSelfRegistration":0,"openIdIDPList":"0;","SMTPTLSOpts":{},"issuerDBJitsiMeetTokensPath":"^/jitsi/","portalRequireOldPassword":1,"totp2fActivation":1,"samlIDPMetaDataExportedAttributes":null,"samlIDPMetaDataXML":{},"oidcServiceMetaDataRegistrationURI":"register","checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","captcha_mail_enabled":1,"mailFrom":"noreply at example.com","passwordPolicyMinDigit":0,"notificationStorageOptions":{"dirName":"/app/dev"},"corsAllow_Origin":"*","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","sfOnlyUpgrade":1,"confirmFormMethod":"post","portalSkin":"bootstrap","totp2fEncryptSecret":0,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","singleIP":0,"notificationServerPOST":1,"samlOrganizationURL":"http://www.example.com","oidcOPMetaDataOptions":{},"checkUserHiddenHeaders":{},"casAppMetaDataOptions":{},"webIDExportedVars":{},"bruteForceProtectionMaxAge":300,"oidcRPMetaDataMacros":null,"cspImg":"'self' data:","ldapVerify":"require","sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","ldapServer":"ldap://localhost","formTimeout":120,"totp2fDigits":6,"openIdSreg_fullname":"cn","customFunctions":"My::hello My::get_additional_arg","proxyAuthServiceChoiceParam":"lmAuth","groups":{},"openIdExportedVars":{},"issuerDBGetPath":"^/get/","sfRemovedNotifTitle":"Second factor notification","radius2fTimeout":20,"oidcRPMetaDataOptionsExtraClaims":null,"ADPwdMaxAge":0,"oidcServiceIDTokenExpiration":3600,"krbAuthnLevel":3,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","corsAllow_Credentials":"true","restClockTolerance":15,"password2fActivation":0,"globalStorage":"Apache::Session::File","requireToken":1,"portalDisplayGeneratePassword":1,"timeoutActivity":0,"certificateResetByMailValidityDelay":0,"multiValuesSeparator":"; ","portalUserAttr":"_user","useRedirectAjaxOnUnauthorized":1,"linkedInFields":"id,first-name,last-name,email-address","mailSessionKey":"mail","cspFrameAncestors":"","gpgAuthnLevel":5,"SSLVarIf":{},"samlRelayStateTimeout":600,"captcha_size":6,"bruteForceProtectionMaxLockTime":900,"webIDAuthnLevel":1,"samlSPMetaDataExportedAttributes":null,"portalFavicon":"common/favicon.ico","samlOverrideIDPEntityID":"","cfgAuthor":"dwho","ldapIOTimeout":10,"samlNameIDFormatMapEmail":"mail","portalDisplayRefreshMyRights":1,"managerPassword":"","openIdSPList":"0;","passwordPolicyMinSpeChar":0,"ldapPwdEnc":"utf-8","rememberTimer":0,"sessionDataToRemember":{},"findUserSearchingAttributes":{},"https":0,"registerDB":"Demo","displaySessionId":1,"passwordPolicyMinUpper":0,"showLanguages":1,"samlAuthnContextMapExtra":{},"hiddenAttributes":"_password _2fDevices","impersonationRule":0,"linkedInUserField":"emailAddress","oidcServiceMetaDataEndSessionURI":"logout","loginHistoryEnabled":1,"proxyAuthnLevel":2,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","logoutServices":{},"ldapGroupObjectClass":"groupOfNames","samlSPSSODescriptorWantAssertionsSigned":1,"samlOrganizationName":"Example","checkUserDisplayEmptyHeaders":0,"captcha_login_enabled":0,"oidcRPMetaDataOptions":{},"userControl":"^[\\w\\.\\-@]+$","sfRequired":0,"portalDisplayAppslist":1,"checkDevOpsCheckSessionAttributes":1,"exportedHeaders":{"test2.llng.localhost":{"Auth-User":"$uid"},"auth.llng.localhost":{},"test1.llng.localhost":{"Hello":"hello()","Uri":"$ENV{REQUEST_URI}","Macro-Uri":"$UA","Ip-Addr":"$ipAddr","Additional-Arg":"get_additional_arg('header-added')","Base64":"encode_base64('a:b','')","Auth-User":"$uid"},"manager.llng.localhost":{}},"portal":"http://auth.llng.localhost:8080/","upgradeSession":1,"passwordPolicyMinSize":0,"httpOnly":1,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","notificationServerSentAttributes":"uid reference date title subtitle text check","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","linkedInScope":"r_liteprofile r_emailaddress","contextSwitchingStopWithLogout":1,"persistentStorage":"Apache::Session::File","authChoiceParam":"lmAuth","cspFormAction":"*","radius2fRequestAttributes":{},"captcha_register_enabled":1,"corsAllow_Headers":"*","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","githubUserField":"login","useRedirectOnError":1,"portalMainLogo":"common/logos/logo_llng_400px.png","portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","captchaOptions":{},"certificateResetByMailCeaAttribute":"description","cspFont":"'self'","webauthn2fActivation":0,"ldapVersion":3,"lwpOpts":{"timeout":10},"cspStyle":"'self'","eventQueueName":"llng_events","findUserExcludingAttributes":{},"impersonationIdRule":1,"decryptValueRule":0,"casStorageOptions":{},"corsEnabled":1,"combModules":{},"ldapPasswordResetAttributeValue":"TRUE","rest2fInitArgs":{},"impersonationMergeSSOgroups":0,"oidcServiceDynamicRegistrationExtraClaims":{},"samlAuthnContextMapPassword":2,"cfgLog":"","whatToTrace":"_whatToTrace","totp2fRange":1,"localSessionStorageOptions":{"cache_root":"/app/dev/sessions/","cache_depth":3,"directory_umask":"007","default_expires_in":600,"namespace":"lemonldap-ng-sessions"},"stayConnectedSingleSession":0,"checkUserIdRule":1,"issuerDBOpenIDConnectRule":1,"radiusRequestAttributes":{},"samlStorageOptions":{},"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","yubikey2fActivation":0,"portalDisplayLogout":1,"ADPwdExpireWarning":0,"activeTimer":1,"githubScope":"user:email","checkUserDisplayHistory":0,"linkedInAuthnLevel":1,"passwordPolicyActivation":1,"oidcServiceAllowAuthorizationCodeFlow":1,"issuerDBOpenIDConnectPath":"^/oauth2/","post":{"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","target":"/index.pl","formSelector":"#test","buttonSelector":"#bt","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]]}},"auth.llng.localhost":{},"test2.llng.localhost":{}},"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","twitterUserField":"screen_name","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions","LockDirectory":"/app/dev/sessions/lock"},"radiusAuthnLevel":3,"jitsiSigningAlg":"RS256","timeoutActivityInterval":60,"issuerDBGetParameters":{},"infoFormMethod":"get","stayConnectedCookieName":"llngconnection","issuerDBGetRule":1,"globalLogoutTimer":1,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","ldapBase":"dc=example,dc=com","domain":"llng.localhost","samlEntityID":"#PORTAL#/saml/metadata","casSrvMetaDataOptions":{},"oidcServiceMetaDataFrontChannelURI":"flogout","jsRedirect":0,"samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","facebookExportedVars":{},"oidcServiceMetaDataBackChannelURI":"blogout","customAddParams":{},"casAppMetaDataExportedVars":{},"lwpSslOpts":{},"slaveExportedVars":{},"nullAuthnLevel":0,"portalAntiFrame":1,"portalForceAuthnInterval":5,"reloadUrls":{},"openIdSreg_email":"mail","ext2fCodeActivation":"\\d{6}","sfRemovedNotifRef":"RemoveSF","webauthn2fUserVerification":"preferred","SSLVar":"SSL_CLIENT_S_DN_Email","impersonationHiddenAttributes":"_2fDevices, _loginHistory","githubAuthnLevel":1,"rememberAuthChoiceRule":1,"remoteGlobalStorageOptions":{"ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","proxy":"http://auth.example.com/sessions"},"oidcServiceKeyTypeSig":"RSA","SSLAuthnLevel":5,"checkHIBPRequired":1,"oidcServiceOfflineSessionExpiration":2592000,"passwordPolicyMinLower":0,"checkHIBPURL":"https://api.pwnedpasswords.com/range/","singleUserByIP":0,"portalSkinRules":{},"autoSigninRules":{},"radius2fActivation":0,"notification":1,"authChoiceModules":{"2_Github":"GitHub;Null;Null;;1;{}","1_Null":"Null;Null;Null;;;{}","1_Demo":"Demo;Demo;Demo;;1;{}"},"ldapPasswordResetAttribute":"pwdReset","sfRemovedMsgRule":0,"dbiAuthnLevel":2,"casTicketExpiration":0,"checkDevOpsDownload":1,"ldapGroupAttributeNameGroup":"dn","rememberCookieTimeout":31536000,"oidcOPMetaDataJSON":{},"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","rememberCookieName":"llngrememberauthchoice","cfgDate":1727883815,"oidcServiceMetaDataTokenURI":"token","samlNameIDFormatMapWindows":"uid"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-11.json b/dev/conf/lmConf-11.json
deleted file mode 100644
index ed1191685..000000000
--- a/dev/conf/lmConf-11.json
+++ /dev/null
@@ -1 +0,0 @@
-{"portalSkinRules":{},"portalForceAuthnInterval":5,"passwordPolicyMinDigit":0,"cfgAuthor":"dwho","cookieName":"lemonldap","issuerDBOpenIDRule":1,"totp2fActivation":1,"SMTPServer":"","samlOrganizationURL":"http://www.example.com","rememberAuthChoiceRule":1,"checkUserIdRule":1,"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","localSessionStorageOptions":{"cache_depth":3,"cache_root":"/app/dev/sessions/","default_expires_in":600,"directory_umask":"007","namespace":"lemonldap-ng-sessions"},"totp2fRange":1,"showLanguages":1,"crowdsecAction":"reject","ADPwdMaxAge":0,"httpOnly":1,"ext2fActivation":0,"samlMetadataForceUTF8":1,"multiValuesSeparator":"; ","samlOverrideIDPEntityID":"","dbiAuthnLevel":2,"mail2fActivation":0,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlAuthnContextMapPasswordProtectedTransport":3,"notificationStorage":"File","passwordPolicyMinSpeChar":0,"checkUserDisplayEmptyValues":0,"managerDn":"","impersonationSkipEmptyValues":1,"macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"corsExpose_Headers":"*","rememberTimer":0,"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","webauthn2fAttestation":"none","webauthn2fSelfRegistration":0,"ldapBase":"dc=example,dc=com","ldapGroupAttributeName":"member","oidcServiceEncAlgorithmEnc":"A256GCM","corsAllow_Methods":"POST,GET","failedLoginNumber":5,"samlNameIDFormatMapEmail":"mail","portal":"http://auth.llng.localhost:8080/","samlOrganizationDisplayName":"Example","portalMainLogo":"common/logos/logo_llng_400px.png","checkDevOpsDisplayNormalizedHeaders":1,"linkedInUserField":"emailAddress","oidcServiceKeyTypeEnc":"RSA","notificationWildcard":"allusers","yubikey2fSelfRegistration":0,"userDB":"Same","oidcServiceNewKeyTypeSig":"RSA","issuerDBCASRule":1,"oidcServiceAuthorizationCodeExpiration":60,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","sfManagerRule":1,"casAuthnLevel":1,"webauthn2fUserCanRemoveKey":1,"pamAuthnLevel":2,"openIdSreg_fullname":"cn","rememberCookieTimeout":31536000,"checkUserDisplayEmptyHeaders":0,"ldapAuthnLevel":2,"samlNameIDFormatMapX509":"mail","lwpSslOpts":{},"rest2fActivation":0,"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","requireToken":1,"mailTimeout":0,"managerPassword":"","radius2fActivation":0,"slaveAuthnLevel":2,"webauthnAppId":1,"SSLVar":"SSL_CLIENT_S_DN_Email","issuerDBGetRule":1,"captcha_mail_enabled":1,"portalOpenLinkInNewWindow":0,"samlAuthnContextMapKerberos":4,"oidcServiceMetaDataJWKSURI":"jwks","casAccessControlPolicy":"none","samlEntityID":"#PORTAL#/saml/metadata","SMTPTLS":"","oidcRPMetaDataScopeRules":null,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","oidcServiceOfflineSessionExpiration":2592000,"cspImg":"'self' data:","redirectFormMethod":"get","casAppMetaDataOptions":{},"authChoiceParam":"lmAuth","casAppMetaDataExportedVars":{},"notificationDefaultCond":"","corsEnabled":1,"oidcOPMetaDataExportedVars":{},"rest2fInitArgs":{},"decryptValueRule":0,"authChoiceModules":{"2_Github":"GitHub;Null;Null;;1;{}","1_Null":"Null;Null;Null;;;{}","1_Demo":"Demo;Demo;Demo;;1;{}"},"cspDefault":"'self'","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"ldapGroupAttributeNameGroup":"dn","customFunctions":"My::hello My::get_additional_arg","issuerDBOpenIDConnectPath":"^/oauth2/","whatToTrace":"_whatToTrace","notificationServerPOST":1,"infoFormMethod":"get","krbAuthnLevel":3,"oidcRPMetaDataMacros":null,"totp2fDigits":6,"passwordPolicyMinLower":0,"samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","cfgNum":11,"corsMax_Age":"86400","hiddenAttributes":"_password _2fDevices","ldapPasswordResetAttributeValue":"TRUE","registerDB":"Demo","captcha_size":6,"samlSPMetaDataOptions":{},"passwordResetAllowedRetries":3,"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","localSessionStorage":"Cache::FileCache","cspConnect":"'self'","issuerDBJitsiMeetTokensRule":1,"useSafeJail":1,"mailSessionKey":"mail","oidcRPCallbackGetParam":"openidconnectcallback","portalRequireOldPassword":1,"oidcRPStateTimeout":600,"oidcServiceDynamicRegistrationExportedVars":{},"notificationStorageOptions":{"dirName":"/app/dev"},"cfgLog":"test obfuscate_pass","portalDisplayRefreshMyRights":1,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","upgradeSession":1,"oidcServiceMetaDataCheckSessionURI":"checksession.html","impersonationRule":0,"ldapPwdEnc":"utf-8","portalDisplayCertificateResetByMail":0,"sfRemovedNotifTitle":"Second factor notification","ldapSearchDeref":"find","oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-1":1,"loa-2":2,"loa-3":3,"loa-4":4},"linkedInScope":"r_liteprofile r_emailaddress","webIDExportedVars":{},"authentication":"Choice","certificateResetByMailCeaAttribute":"description","corsAllow_Credentials":"true","applicationList":{"0004-cat":{"catname":"Administration","0006-app":{"options":{"name":"Notifications Explorer","uri":"http://manager.llng.localhost:8080/notifications.html","description":"Explore WebSSO notifications","logo":"database.png","display":"auto"},"type":"application"},"0005-app":{"options":{"logo":"configure.png","display":"auto","uri":"http://manager.llng.localhost:8080/manager.html","description":"Configure LemonLDAP::NG WebSSO","name":"WebSSO Manager"},"type":"application"},"0007-app":{"type":"application","options":{"display":"auto","logo":"database.png","name":"Sessions Explorer","description":"Explore WebSSO sessions","uri":"http://manager.llng.localhost:8080/sessions.html"}},"0008-app":{"type":"application","options":{"display":"auto","logo":"database.png","uri":"http://manager.llng.localhost:8080/2ndfa.html","description":"Explore WebSSO 2FA sessions","name":"2FA Sessions Explorer"}},"type":"category"},"0001-cat":{"0002-app":{"options":{"uri":"http://test1.llng.localhost:8080/","description":"A simple application displaying authenticated user","name":"Application Test 1","logo":"demo.png","display":"auto"},"type":"application"},"catname":"Sample applications","0003-app":{"options":{"logo":"thumbnail.png","display":"auto","description":"The same simple application displaying authenticated user","uri":"http://test2.llng.localhost:8080/","name":"Application Test 2"},"type":"application"},"type":"category"},"0008-cat":{"catname":"Documentation","0009-app":{"type":"application","options":{"display":"on","logo":"help.png","description":"Documentation supplied with LemonLDAP::NG","uri":"http://manager.llng.localhost:8080/doc/","name":"Local documentation"}},"0010-app":{"options":{"description":"Official LemonLDAP::NG Website","uri":"https://lemonldap-ng.org/","name":"Official Website","logo":"network.png","display":"on"},"type":"application"},"type":"category"}},"mail2fCodeRegex":"\\d{6}","githubClientID":"cd5857b36056d0bf968b","globalLogoutTimer":1,"vhostOptions":{"manager.llng.localhost":{"vhostPort":-1,"vhostServiceTokenTTL":-1,"vhostHttps":-1,"vhostMaintenance":0,"vhostType":"Main","vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostAliases":""},"auth.llng.localhost":{},"test1.llng.localhost":{"vhostHttps":-1,"vhostAccessToTrace":"","vhostType":"Main","vhostComment":"","vhostMaintenance":0,"vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostAuthnLevel":"4","vhostAliases":""},"test2.llng.localhost":{}},"checkHIBPURL":"https://api.pwnedpasswords.com/range/","mailOnPasswordChange":0,"passwordPolicyMinSize":0,"exportedHeaders":{"test2.llng.localhost":{"Auth-User":"$uid"},"auth.llng.localhost":{},"test1.llng.localhost":{"Additional-Arg":"get_additional_arg('header-added')","Ip-Addr":"$ipAddr","Macro-Uri":"$UA","Auth-User":"$uid","Base64":"encode_base64('a:b','')","Uri":"$ENV{REQUEST_URI}","Hello":"hello()"},"manager.llng.localhost":{}},"totp2fEncryptSecret":0,"samlAuthnContextMapTLSClient":5,"portalFavicon":"common/favicon.ico","casSrvMetaDataExportedVars":{},"issuerDBGetParameters":{},"contextSwitchingStopWithLogout":1,"notification":1,"password2fActivation":0,"messageBrokerOptions":{},"password2fSelfRegistration":0,"rest2fVerifyArgs":{},"oidcServiceMetaDataTokenURI":"token","passwordDB":"Choice","locationRules":{"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"test1.llng.localhost":{"^/logout":"logout_sso","default":"accept","^/saml":"unprotect","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/"},"auth.llng.localhost":{"(?#checkUser)^/checkuser":"$uid eq \"dwho\"","(?#errors)^/lmerror/":"accept","default":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\""},"manager.llng.localhost":{"(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""}},"demoExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"impersonationIdRule":1,"checkXSS":1,"checkHIBPRequired":1,"hideOldPassword":1,"oidcServiceMetaDataUserInfoURI":"userinfo","singleUserByIP":0,"checkUserDisplayNormalizedHeaders":0,"githubScope":"user:email","ext2fCodeActivation":"\\d{6}","captcha_register_enabled":1,"samlIDPMetaDataExportedAttributes":null,"samlStorageOptions":{},"samlIDPMetaDataOptions":{},"yubikey2fUserCanRemoveKey":1,"yubikey2fPublicIDSize":12,"totp2fSelfRegistration":1,"customAddParams":{},"post":{"manager.llng.localhost":{},"test2.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"target":"/index.pl","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt","formSelector":"#test","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js"}},"auth.llng.localhost":{}},"oidcServiceOldKeyTypeSig":"RSA","contextSwitchingRule":0,"newLocationWarningLocationDisplayAttribute":"","customPluginsParams":{},"webauthnAuthnLevel":3,"cfgVersion":"2.20.1","githubAuthnLevel":1,"loginHistoryEnabled":1,"stayConnectedCookieName":"llngconnection","oidcServiceAllowAuthorizationCodeFlow":1,"singleSession":0,"dbiExportedVars":{},"bruteForceProtectionMaxLockTime":900,"displaySessionId":1,"portalDisplayPasswordPolicy":0,"openIdSreg_nickname":"uid","newLocationWarningLocationAttribute":"ipAddr","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","activeTimer":1,"formTimeout":120,"portalErrorOnExpiredSession":1,"portalDisplayAppslist":1,"useRedirectAjaxOnUnauthorized":1,"linkedInAuthnLevel":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","customToTrace":"mail","autoSigninRules":{},"jitsiSigningAlg":"RS256","cfgDate":1736837820,"samlAuthnContextMapPassword":2,"cfgAuthorIP":"10.0.2.100","portalAntiFrame":1,"radius2fTimeout":20,"bruteForceProtectionMaxAge":300,"restClockTolerance":15,"portalDisplayLoginHistory":1,"certificateResetByMailCertificateAttribute":"userCertificate;binary","SSLVarIf":{},"oidcRPMetaDataOptions":{},"cspFormAction":"*","findUserSearchingAttributes":{},"passwordPolicyMinUpper":0,"oidcStorageOptions":{},"oidcServiceMetaDataAuthorizeURI":"authorize","casAppMetaDataMacros":null,"corsAllow_Origin":"*","successLoginNumber":5,"passwordPolicyMaxSize":0,"trustedBrowserUseTotp":1,"oidcServiceMetaDataBackChannelURI":"blogout","port":-1,"checkDevOpsDownload":1,"timeoutActivity":0,"jitsiExpiration":"300","issuerDBOpenIDConnectRule":1,"oidcServiceMetaDataEndSessionURI":"logout","nginxCustomHandlers":{},"radiusRequestAttributes":{},"domain":"llng.localhost","oidcServiceIDTokenExpiration":3600,"samlSPSSODescriptorWantAssertionsSigned":1,"trustedBrowserRule":1,"passwordPolicySpecialChar":"__ALL__","browsersDontStorePassword":1,"openIdAuthnLevel":1,"issuerDBJitsiMeetTokensPath":"^/jitsi/","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","reloadTimeout":5,"password2fUserCanRemoveKey":1,"totp2fAuthnLevel":"4","pamService":"login","webIDAuthnLevel":1,"checkDevOpsCheckSessionAttributes":1,"logoutServices":{},"groups":{},"SSLAuthnLevel":5,"oidcAuthnLevel":1,"oidcServiceKeyTypeSig":"RSA","oidcServiceMetaDataFrontChannelURI":"flogout","sfOnlyUpgrade":1,"samlServiceSignatureMethod":"RSA_SHA256","cspFont":"'self'","locationDetectGeoIpLanguages":"en, fr","sfRemovedNotifRef":"RemoveSF","samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","portalSkin":"bootstrap","lwpOpts":{"timeout":10},"oidcServiceEncAlgorithmAlg":"RSA-OAEP","samlOrganizationName":"Example","remoteGlobalStorageOptions":{"ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","proxy":"http://auth.example.com/sessions"},"portalErrorOnMailNotFound":0,"stayConnectedBypassFG":0,"casStorageOptions":{},"facebookExportedVars":{},"ldapPasswordResetAttribute":"pwdReset","portalUserAttr":"_user","notifyDeleted":1,"portalEnablePasswordDisplay":0,"checkUserHiddenHeaders":{},"oidcServiceMetaDataIntrospectionURI":"introspect","radiusExportedVars":{},"issuerDBOpenIDPath":"^/openidserver/","cspFrameAncestors":"","globalStorageOptions":{"Directory":"/app/dev/sessions","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock"},"passwordPolicyActivation":1,"proxyAuthnLevel":2,"samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","SSLIssuerVar":"SSL_CLIENT_I_DN","portalDisplayLogout":1,"ADPwdExpireWarning":0,"ldapVerify":"require","ldapVersion":3,"gpgAuthnLevel":5,"scrollTop":400,"okta2fActivation":0,"captcha_login_enabled":0,"casSrvMetaDataOptions":{},"oidcServiceDynamicRegistrationExtraClaims":{},"contextSwitchingIdRule":1,"portalPingInterval":60000,"openIdSreg_timezone":"_timezone","githubUserField":"login","grantSessionRules":{},"oidcOPMetaDataJWKS":{},"oidcRPMetaDataOptionsExtraClaims":null,"combModules":{},"globalLogoutRule":0,"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock"},"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","krbRemoveDomain":1,"notificationServerSentAttributes":"uid reference date title subtitle text check","securedCookie":0,"casTicketExpiration":0,"ldapServer":"ldap://localhost","samlAuthnContextMapExtra":{},"openIdIDPList":"0;","facebookAuthnLevel":1,"timeout":72000,"jsRedirect":0,"exportedVars":{},"ldapGroupAttributeNameSearch":"cn","globalStorage":"Apache::Session::File","sfRemovedMsgRule":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","proxyAuthServiceChoiceParam":"lmAuth","openIdSPList":"0;","samlRelayStateTimeout":600,"stayConnectedSingleSession":0,"sfExtra":{},"twitterUserField":"screen_name","restAuthnLevel":2,"useRedirectOnError":1,"issuerDBGetPath":"^/get/","sameSite":"","impersonationHiddenAttributes":"_2fDevices, _loginHistory","SMTPTLSOpts":{},"ldapUsePasswordResetAttribute":1,"webauthn2fActivation":0,"issuersTimeout":120,"checkUserDisplayHiddenAttributes":0,"portalDisplayRegister":1,"facebookUserField":"id","openIdExportedVars":{},"ldapExportedVars":{"mail":"mail","uid":"uid","cn":"cn"},"portalDisplayResetPassword":0,"oidcServiceAccessTokenExpiration":3600,"eventQueueName":"llng_events","timeoutActivityInterval":60,"nullAuthnLevel":0,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","mailCharset":"utf-8","persistentStorage":"Apache::Session::File","linkedInFields":"id,first-name,last-name,email-address","key":"qwertyui","mailFrom":"noreply at example.com","ldapGroupAttributeNameUser":"dn","randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","oidcServiceOldKeyTypeEnc":"RSA","cspStyle":"'self'","sfRequired":0,"samlNameIDFormatMapKerberos":"uid","slaveExportedVars":{},"issuerDBSAMLRule":1,"reloadUrls":{},"bruteForceProtectionTempo":30,"findUserExcludingAttributes":{},"gpgDb":"","checkUserDisplayHistory":0,"singleIP":0,"newLocationWarningMaxValues":"0","portalDisplayGeneratePassword":1,"ldapTimeout":10,"userControl":"^[\\w\\.\\-@]+$","stayConnected":0,"findUserWildcard":"*","rememberDefaultChecked":1,"checkUserDisplayPersistentInfo":0,"findUserControl":"^[*\\w]+$","captchaOptions":{},"impersonationMergeSSOgroups":0,"oidcOPMetaDataJSON":{},"radiusAuthnLevel":3,"samlIDPMetaDataXML":{},"oidcRPMetaDataExportedVars":{},"stayConnectedTimeout":2592000,"samlSPMetaDataExportedAttributes":null,"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcServiceMetaDataRegistrationURI":"register","corsAllow_Headers":"*","checkUserDisplayComputedSession":1,"https":0,"ldapIOTimeout":10,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","bruteForceProtectionMaxFailed":3,"radius2fRequestAttributes":{},"cspScript":"'self'","casAttributes":{},"samlNameIDFormatMapWindows":"uid","twitterAuthnLevel":1,"yubikey2fActivation":0,"openIdSreg_email":"mail","rememberCookieName":"llngrememberauthchoice","githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","ldapGroupObjectClass":"groupOfNames","adaptativeAuthenticationLevelRules":{},"apacheAuthnLevel":3,"webauthn2fUserVerification":"preferred","samlSPMetaDataMacros":null,"totp2fUserCanRemoveKey":1,"totp2fInterval":30,"oidcOPMetaDataOptions":{},"sessionDataToRemember":{},"issuerDBSAMLPath":"^/saml/","samlSPSSODescriptorAuthnRequestsSigned":1,"registerTimeout":0,"portalCheckLogins":1,"issuerDBCASPath":"^/cas/","samlSPMetaDataXML":null,"confirmFormMethod":"post","certificateResetByMailValidityDelay":0}
\ No newline at end of file
diff --git a/dev/conf/lmConf-12.json b/dev/conf/lmConf-12.json
deleted file mode 100644
index 4668833e9..000000000
--- a/dev/conf/lmConf-12.json
+++ /dev/null
@@ -1 +0,0 @@
-{"pamService":"login","facebookAuthnLevel":1,"githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","notificationsExplorer":0,"samlAuthnContextMapExtra":{},"checkDevOpsDisplayNormalizedHeaders":1,"captcha_mail_enabled":1,"cfgVersion":"2.21.0","oidcServiceEncAlgorithmEnc":"A256GCM","issuerDBOpenIDRule":1,"SSLAuthnLevel":5,"captcha_login_enabled":0,"mail2fActivation":0,"openIdSreg_timezone":"_timezone","openIdSreg_email":"mail","authChoiceParam":"lmAuth","mailCharset":"utf-8","oidcServiceNewKeyTypeSig":"RSA","rememberCookieName":"llngrememberauthchoice","samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","openIdSreg_nickname":"uid","oidcServiceAuthorizationCodeExpiration":60,"issuerDBJitsiMeetTokensPath":"^/jitsi/","oidcServiceMetaDataEndSessionURI":"logout","SMTPTLS":"","certificateResetByMailValidityDelay":0,"portalErrorOnExpiredSession":1,"trustedBrowserRule":1,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","checkDevOpsCheckSessionAttributes":1,"passwordDB":"Choice","rest2fActivation":0,"successLoginNumber":5,"cspScript":"'self'","httpOnly":1,"SMTPTLSOpts":{},"checkUserDisplayEmptyHeaders":0,"ldapSearchDeref":"find","oidcServiceOfflineSessionExpiration":2592000,"issuerDBJitsiMeetTokensRule":1,"linkedInUserField":"emailAddress","samlSPSSODescriptorWantAssertionsSigned":1,"oidcServiceMetaDataFrontChannelURI":"flogout","portalRequireOldPassword":1,"multiValuesSeparator":"; ","totp2fUserCanRemoveKey":1,"totp2fAuthnLevel":"4","linkedInScope":"r_liteprofile r_emailaddress","localSessionStorageOptions":{"namespace":"lemonldap-ng-sessions","cache_depth":3,"directory_umask":"007","default_expires_in":600,"cache_root":"/app/dev/sessions/"},"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","ldapPwdEnc":"utf-8","jitsiExpiration":"300","certificateResetByMailCeaAttribute":"description","samlOrganizationDisplayName":"Example","stayConnectedCookieName":"llngconnection","locationDetectGeoIpLanguages":"en, fr","grantSessionRules":{},"ADPwdExpireWarning":0,"timeout":72000,"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","webauthnAuthnLevel":3,"exportedVars":{},"portalCheckLogins":1,"samlNameIDFormatMapX509":"mail","passwordPolicyMaxSize":0,"timeoutActivity":0,"cspConnect":"'self'","portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","browsersDontStorePassword":1,"webIDExportedVars":{},"samlSPSSODescriptorAuthnRequestsSigned":1,"portalPingInterval":60000,"oidcServiceMetaDataIntrospectionURI":"introspect","findUserSearchingAttributes":{},"ldapServer":"ldap://localhost","ldapTimeout":10,"SSLVar":"SSL_CLIENT_S_DN_Email","certificateResetByMailCertificateAttribute":"userCertificate;binary","samlMetadataForceUTF8":1,"checkUserHiddenHeaders":{},"domain":"llng.localhost","casStorageOptions":{},"contextSwitchingStopWithLogout":1,"nullAuthnLevel":0,"webauthn2fActivation":0,"radius2fTimeout":20,"ldapGroupAttributeNameUser":"dn","ldapGroupObjectClass":"groupOfNames","passwordPolicyMinLower":0,"requireToken":1,"totp2fEncryptSecret":0,"impersonationMergeSSOgroups":0,"portalUserAttr":"_user","portalSkin":"bootstrap","samlIDPMetaDataOptions":{},"samlOrganizationName":"Example","lwpOpts":{"timeout":10},"checkUserDisplayHistory":0,"ext2fActivation":0,"krbRemoveDomain":1,"eventQueueName":"llng_events","SSLVarIf":{},"mail2fCodeRegex":"\\d{6}","trustedBrowserUseTotp":1,"samlStorageOptions":{},"cfgAuthorIP":"10.0.2.100","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","issuerDBGetRule":1,"oidcServiceOldKeyTypeEnc":"RSA","impersonationSkipEmptyValues":1,"oidcRPMetaDataOptionsExtraClaims":null,"oidcServiceMetaDataTokenURI":"token","useSafeJail":1,"passwordPolicyMinDigit":0,"timeoutActivityInterval":60,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","samlAuthnContextMapKerberos":4,"apacheAuthnLevel":3,"webauthn2fAttestation":"none","checkUserDisplayPersistentInfo":0,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","totp2fDigits":6,"displaySessionId":1,"authChoiceModules":{"1_Demo":"Demo;Demo;Demo;;1;{}","1_Null":"Null;Null;Null;;;{}","2_Github":"GitHub;Null;Null;;1;{}"},"globalLogoutTimer":1,"totp2fActivation":1,"securedCookie":0,"oidcStorageOptions":{},"yubikey2fSelfRegistration":0,"SSLIssuerVar":"SSL_CLIENT_I_DN","proxyAuthnLevel":2,"sfRemovedNotifRef":"RemoveSF","openIdSPList":"0;","openIdAuthnLevel":1,"cspStyle":"'self'","radiusExportedVars":{},"crowdsecAction":"reject","lwpSslOpts":{},"post":{"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"target":"/index.pl","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","formSelector":"#test","buttonSelector":"#bt"}},"test2.llng.localhost":{},"auth.llng.localhost":{}},"portalDisplayLoginHistory":1,"samlAuthnContextMapPasswordProtectedTransport":3,"newLocationWarningLocationAttribute":"ipAddr","passwordPolicyMinSize":0,"bruteForceProtectionMaxFailed":3,"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","oidcServiceEncAlgorithmAlg":"RSA-OAEP","localSessionStorage":"Cache::FileCache","issuerDBOpenIDPath":"^/openidserver/","mailSessionKey":"mail","samlAuthnContextMapPassword":2,"portal":"http://auth.llng.localhost:8080/","samlOrganizationURL":"http://www.example.com","passwordPolicyMinUpper":0,"casAuthnLevel":1,"totp2fSelfRegistration":1,"passwordResetAllowedRetries":3,"rest2fVerifyArgs":{},"portalDisplayLogout":1,"oidcServiceMetaDataAuthnContext":{"loa-1":1,"loa-2":2,"loa-5":5,"loa-3":3,"loa-4":4},"SMTPServer":"","rememberTimer":0,"userDB":"Same","radius2fRequestAttributes":{},"openIdSreg_fullname":"cn","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","samlServiceSignatureMethod":"RSA_SHA256","ADPwdMaxAge":0,"samlIDPMetaDataExportedAttributes":null,"casSrvMetaDataOptions":{},"cookieName":"lemonldap","issuerDBGetPath":"^/get/","customPluginsParams":{},"logoutServices":{},"userControl":"^[\\w\\.\\-@]+$","pamAuthnLevel":2,"infoFormMethod":"get","facebookUserField":"id","portalSkinRules":{},"mailOnPasswordChange":0,"portalDisplayRegister":1,"restAuthnLevel":2,"hiddenAttributes":"_password _2fDevices","issuersTimeout":120,"captcha_register_enabled":1,"checkHIBPURL":"https://api.pwnedpasswords.com/range/","password2fUserCanRemoveKey":1,"sfManagerRule":1,"scrollTop":400,"findUserControl":"^[*\\w]+$","portalFavicon":"common/favicon.ico","restClockTolerance":15,"ldapGroupAttributeNameSearch":"cn","persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","LockDirectory":"/app/dev/sessions/persistents/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256"},"issuerDBGetParameters":{},"stayConnected":0,"portalDisplayRefreshMyRights":1,"sessionDataToRemember":{},"linkedInAuthnLevel":1,"sfOnlyUpgrade":1,"slaveAuthnLevel":2,"messageBrokerOptions":{},"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcServiceAccessTokenExpiration":3600,"ldapUsePasswordResetAttribute":1,"bruteForceProtectionTempo":30,"webauthnAppId":1,"applicationList":{"0001-cat":{"0002-app":{"options":{"display":"auto","name":"Application Test 1","uri":"http://test1.llng.localhost:8080/","logo":"demo.png","description":"A simple application displaying authenticated user"},"type":"application"},"type":"category","catname":"Sample applications","0003-app":{"type":"application","options":{"display":"auto","name":"Application Test 2","uri":"http://test2.llng.localhost:8080/","logo":"thumbnail.png","description":"The same simple application displaying authenticated user"}}},"0004-cat":{"0008-app":{"type":"application","options":{"description":"Explore WebSSO 2FA sessions","logo":"database.png","uri":"http://manager.llng.localhost:8080/2ndfa.html","name":"2FA Sessions Explorer","display":"auto"}},"catname":"Administration","0006-app":{"type":"application","options":{"uri":"http://manager.llng.localhost:8080/notifications.html","logo":"database.png","description":"Explore WebSSO notifications","display":"auto","name":"Notifications Explorer"}},"0007-app":{"options":{"name":"Sessions Explorer","display":"auto","description":"Explore WebSSO sessions","logo":"database.png","uri":"http://manager.llng.localhost:8080/sessions.html"},"type":"application"},"type":"category","0005-app":{"type":"application","options":{"description":"Configure LemonLDAP::NG WebSSO","logo":"configure.png","uri":"http://manager.llng.localhost:8080/manager.html","name":"WebSSO Manager","display":"auto"}}},"0008-cat":{"0010-app":{"type":"application","options":{"display":"on","name":"Official Website","uri":"https://lemonldap-ng.org/","description":"Official LemonLDAP::NG Website","logo":"network.png"}},"0009-app":{"options":{"display":"on","name":"Local documentation","uri":"http://manager.llng.localhost:8080/doc/","description":"Documentation supplied with LemonLDAP::NG","logo":"help.png"},"type":"application"},"catname":"Documentation","type":"category"}},"checkUserDisplayHiddenAttributes":0,"casAttributes":{},"contextSwitchingIdRule":1,"notificationServerSentAttributes":"uid reference date title subtitle text check","ldapPasswordResetAttribute":"pwdReset","reloadTimeout":5,"oldNotifFormat":0,"portalDisplayPasswordPolicy":0,"checkUserDisplayComputedSession":1,"openIdExportedVars":{},"radiusAuthnLevel":3,"cfgLog":"","sfRemovedMsgRule":0,"oidcRPMetaDataOptions":{},"singleUserByIP":0,"combModules":{},"githubAuthnLevel":1,"managerPassword":"","ext2fCodeActivation":"\\d{6}","jsRedirect":0,"nginxCustomHandlers":{},"persistentStorage":"Apache::Session::File","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"oidcServiceDynamicRegistrationExportedVars":{},"samlEntityID":"#PORTAL#/saml/metadata","portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","publicNotifications":1,"remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","notificationStorageOptions":{"dirName":"/app/dev"},"samlOverrideIDPEntityID":"","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","gpgAuthnLevel":5,"rememberDefaultChecked":1,"corsEnabled":1,"mailTimeout":0,"oidcServiceMetaDataJWKSURI":"jwks","checkUserDisplayEmptyValues":0,"bruteForceProtectionMaxAge":300,"samlSPMetaDataXML":null,"portalForceAuthnInterval":5,"demoExportedVars":{"cn":"cn","mail":"mail","uid":"uid"},"facebookExportedVars":{},"loginHistoryEnabled":1,"casAppMetaDataMacros":null,"dbiExportedVars":{},"oidcServiceKeyTypeSig":"RSA","autoSigninRules":{},"corsAllow_Methods":"POST,GET","findUserExcludingAttributes":{},"oidcServiceMetaDataBackChannelURI":"blogout","oidcServiceKeyTypeEnc":"RSA","exportedHeaders":{"auth.llng.localhost":{},"manager.llng.localhost":{},"test2.llng.localhost":{"Auth-User":"$uid"},"test1.llng.localhost":{"Base64":"encode_base64('a:b','')","Auth-User":"$uid","Hello":"hello()","Macro-Uri":"$UA","Uri":"$ENV{REQUEST_URI}","Ip-Addr":"$ipAddr","Additional-Arg":"get_additional_arg('header-added')"}},"cspFormAction":"*","corsExpose_Headers":"*","customFunctions":"My::hello My::get_additional_arg","oidcServiceMetaDataAuthorizeURI":"authorize","corsAllow_Headers":"*","rememberCookieTimeout":31536000,"notifyDeleted":1,"casSrvMetaDataExportedVars":{},"radius2fActivation":0,"samlAuthnContextMapTLSClient":5,"checkXSS":1,"cfgAuthor":"dwho","contextSwitchingRule":0,"webIDAuthnLevel":1,"checkUserIdRule":1,"password2fActivation":0,"casTicketExpiration":0,"issuerDBSAMLRule":1,"ldapGroupAttributeName":"member","githubScope":"user:email","issuerDBOpenIDConnectRule":1,"cspFont":"'self'","cfgNum":12,"cspFrameAncestors":"","linkedInFields":"id,first-name,last-name,email-address","oidcOPMetaDataExportedVars":{},"corsAllow_Credentials":"true","oidcRPMetaDataMacros":null,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","portalDisplayCertificateResetByMail":0,"globalStorage":"Apache::Session::File","activeTimer":1,"newLocationWarningMaxValues":"0","passwordPolicySpecialChar":"__ALL__","portalDisplayAppslist":1,"ldapExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"corsAllow_Origin":"*","oidcOPMetaDataJWKS":{},"groups":{},"managerDn":"","portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","checkDevOpsDownload":1,"oidcServiceMetaDataRegistrationURI":"register","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","rememberAuthChoiceRule":1,"githubClientID":"cd5857b36056d0bf968b","oidcOPMetaDataOptions":{},"jitsiSigningAlg":"RS256","casAppMetaDataOptions":{},"oidcOPMetaDataJSON":{},"captchaOptions":{},"cspImg":"'self' data:","singleIP":0,"portalDisplayGeneratePassword":1,"oidcServiceOldKeyTypeSig":"RSA","samlSPMetaDataExportedAttributes":null,"yubikey2fActivation":0,"stayConnectedSingleSession":0,"oidcServiceMetaDataUserInfoURI":"userinfo","samlSPMetaDataMacros":null,"samlNameIDFormatMapKerberos":"uid","impersonationIdRule":1,"ldapVersion":3,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","okta2fActivation":0,"globalLogoutRule":0,"cspDefault":"'self'","vhostOptions":{"auth.llng.localhost":{},"test2.llng.localhost":{},"manager.llng.localhost":{"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostAliases":"","vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostHttps":-1,"vhostMaintenance":0,"vhostType":"Main"},"test1.llng.localhost":{"vhostServiceTokenTTL":-1,"vhostAliases":"","vhostComment":"","vhostAccessToTrace":"","vhostAuthnLevel":"4","vhostHttps":-1,"vhostPort":-1,"vhostMaintenance":0,"vhostType":"Main"}},"openIdIDPList":"0;","confirmFormMethod":"post","bruteForceProtectionMaxLockTime":900,"oidcAuthnLevel":1,"twitterAuthnLevel":1,"macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"https":0,"dbiAuthnLevel":2,"registerDB":"Demo","oidcRPStateTimeout":600,"showLanguages":1,"upgradeSession":1,"samlRelayStateTimeout":600,"sameSite":"","radiusRequestAttributes":{},"redirectFormMethod":"get","rest2fInitArgs":{},"webauthn2fSelfRegistration":0,"stayConnectedBypassFG":0,"adaptativeAuthenticationLevelRules":{},"totp2fRange":1,"issuerDBSAMLPath":"^/saml/","oidcServiceIDTokenExpiration":3600,"sfRemovedNotifTitle":"Second factor notification","oidcRPCallbackGetParam":"openidconnectcallback","gpgDb":"","customAddParams":{},"oidcServiceAllowAuthorizationCodeFlow":1,"issuerDBCASRule":1,"krbAuthnLevel":3,"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","corsMax_Age":"86400","stayConnectedTimeout":2592000,"ldapIOTimeout":10,"oidcServiceDynamicRegistrationExtraClaims":{},"failedLoginNumber":5,"impersonationRule":0,"whatToTrace":"_whatToTrace","yubikey2fPublicIDSize":12,"ldapAuthnLevel":2,"reloadUrls":{},"casAppMetaDataExportedVars":{},"portalMainLogo":"common/logos/logo_llng_400px.png","oidcServiceMetaDataAmrRules":{"pwd":"$authenticationLevel == 2","mfa":"$_2f","otp":"$_2f eq \"TOTP\"","pop":"$_auth eq \"WebAuthn\" or $_auth eq \"SSL\""},"password2fSelfRegistration":0,"notificationServerPOST":1,"sfExtra":{},"findUserWildcard":"*","notificationDefaultCond":"","key":"qwertyui","samlIDPMetaDataXML":{},"port":-1,"formTimeout":120,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","notificationStorage":"File","registerTimeout":0,"locationRules":{"manager.llng.localhost":{"(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"test1.llng.localhost":{"^/saml":"unprotect","^/logout":"logout_sso","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","default":"accept"},"test2.llng.localhost":{"default":"accept","^/logout":"logout_sso"},"auth.llng.localhost":{"(?#errors)^/lmerror/":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","default":"accept","(?#checkUser)^/checkuser":"$uid eq \"dwho\""}},"newLocationWarningLocationDisplayAttribute":"","ldapGroupAttributeNameGroup":"dn","mailFrom":"noreply at example.com","portalErrorOnMailNotFound":0,"passwordPolicyMinSpeChar":0,"singleSession":0,"passwordPolicyActivation":1,"oidcRPMetaDataScopeRules":null,"customToTrace":"mail","samlSPMetaDataOptions":{},"webauthn2fUserCanRemoveKey":1,"impersonationHiddenAttributes":"_2fDevices, _loginHistory","samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","portalOpenLinkInNewWindow":0,"oidcRPMetaDataExportedVars":{},"cfgDate":1743669571,"yubikey2fUserCanRemoveKey":1,"hideOldPassword":1,"remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"totp2fInterval":30,"sfRequired":0,"portalEnablePasswordDisplay":0,"captcha_size":6,"ldapVerify":"require","ldapPasswordResetAttributeValue":"TRUE","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock","Directory":"/app/dev/sessions"},"useRedirectAjaxOnUnauthorized":1,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","githubUserField":"login","casAccessControlPolicy":"none","oidcServiceMetaDataCheckSessionURI":"checksession.html","issuerDBCASPath":"^/cas/","useRedirectOnError":1,"decryptValueRule":0,"notification":1,"notificationWildcard":"allusers","checkHIBPRequired":1,"checkUserDisplayNormalizedHeaders":0,"authentication":"Choice","ldapBase":"dc=example,dc=com","issuerDBOpenIDConnectPath":"^/oauth2/","proxyAuthServiceChoiceParam":"lmAuth","portalDisplayResetPassword":0,"portalAntiFrame":1,"samlNameIDFormatMapWindows":"uid","samlNameIDFormatMapEmail":"mail","webauthn2fUserVerification":"preferred","slaveExportedVars":{},"twitterUserField":"screen_name"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-13.json b/dev/conf/lmConf-13.json
deleted file mode 100644
index 66c3afb30..000000000
--- a/dev/conf/lmConf-13.json
+++ /dev/null
@@ -1 +0,0 @@
-{"rememberTimer":0,"adaptativeAuthenticationLevelRules":{},"sfRequired":0,"twitterAuthnLevel":1,"ldapExportedVars":{"uid":"uid","cn":"cn","mail":"mail"},"samlEntityID":"#PORTAL#/saml/metadata","casAppMetaDataMacros":null,"radius2fActivation":0,"activeTimer":1,"mailCharset":"utf-8","totp2fAuthnLevel":"4","passwordPolicyMinSize":0,"webauthn2fSelfRegistration":0,"samlSPMetaDataOptions":{},"oidcRPStateTimeout":600,"password2fUserCanRemoveKey":1,"localSessionStorageOptions":{"default_expires_in":600,"directory_umask":"007","cache_root":"/app/dev/sessions/","namespace":"lemonldap-ng-sessions","cache_depth":3},"contextSwitchingStopWithLogout":1,"webIDExportedVars":{},"lwpSslOpts":{},"crowdsecAction":"reject","checkHIBPURL":"https://api.pwnedpasswords.com/range/","rest2fActivation":0,"issuerDBGetRule":1,"bruteForceProtectionMaxFailed":3,"checkUserIdRule":1,"totp2fSelfRegistration":1,"bruteForceProtectionMaxAge":300,"rememberDefaultChecked":1,"checkUserDisplayComputedSession":1,"password2fActivation":0,"samlOrganizationDisplayName":"Example","totp2fDigits":6,"oidcRPMetaDataScopeRules":null,"oidcServiceDynamicRegistrationExtraClaims":{},"reloadTimeout":5,"samlOverrideIDPEntityID":"","portalRequireOldPassword":1,"certificateResetByMailCeaAttribute":"description","vhostOptions":{"test2.llng.localhost":{},"manager.llng.localhost":{"vhostMaintenance":0,"vhostHttps":-1,"vhostType":"Main","vhostPort":-1,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostServiceTokenTTL":-1,"vhostAliases":""},"auth.llng.localhost":{},"test1.llng.localhost":{"vhostAccessToTrace":"","vhostServiceTokenTTL":-1,"vhostType":"Main","vhostHttps":-1,"vhostMaintenance":0,"vhostAuthnLevel":"4","vhostPort":-1,"vhostAliases":"","vhostComment":""}},"samlSPMetaDataXML":null,"samlOrganizationURL":"http://www.example.com","yubikey2fUserCanRemoveKey":1,"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","hiddenAttributes":"_password _2fDevices","logoutServices":{},"oidcServiceMetaDataFrontChannelURI":"flogout","oidcServiceMetaDataBackChannelURI":"blogout","cspStyle":"'self'","oidcServiceIDTokenExpiration":3600,"password2fSelfRegistration":0,"SSLAuthnLevel":5,"corsExpose_Headers":"*","checkUserDisplayEmptyValues":0,"checkDevOpsDisplayNormalizedHeaders":1,"notificationWildcard":"allusers","redirectFormMethod":"get","yubikey2fSelfRegistration":0,"nginxCustomHandlers":{},"locationDetectGeoIpLanguages":"en, fr","samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","oidcServiceAccessTokenExpiration":3600,"findUserSearchingAttributes":{},"rememberCookieTimeout":31536000,"openIdSreg_fullname":"cn","managerPassword":"","oidcRPMetaDataOptionsExtraClaims":null,"localSessionStorage":"Cache::FileCache","oidcServiceMetaDataIntrospectionURI":"introspect","hideOldPassword":1,"oidcServiceOfflineSessionExpiration":2592000,"portalAntiFrame":1,"issuerDBOpenIDConnectPath":"^/oauth2/","captcha_register_enabled":1,"checkUserDisplayEmptyHeaders":0,"oidcServiceAuthorizationCodeExpiration":60,"impersonationRule":0,"restClockTolerance":15,"cspFormAction":"*","radiusAuthnLevel":3,"singleSession":0,"useRedirectAjaxOnUnauthorized":1,"oidcServiceMetaDataCheckSessionURI":"checksession.html","issuersTimeout":120,"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","issuerDBOpenIDPath":"^/openidserver/","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","openIdAuthnLevel":1,"portalDisplayRefreshMyRights":1,"corsAllow_Methods":"POST,GET","bruteForceProtectionMaxLockTime":900,"captcha_login_enabled":0,"githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","key":"qwertyui","checkDevOpsDownload":1,"multiValuesSeparator":"; ","messageBrokerOptions":{},"displaySessionId":1,"oidcServiceMetaDataEndSessionURI":"logout","oidcServiceMetaDataAuthorizeURI":"authorize","domain":"llng.localhost","combModules":{},"nullAuthnLevel":0,"stayConnectedCookieName":"llngconnection","samlAuthnContextMapExtra":{},"customAddParams":{},"samlAuthnContextMapTLSClient":5,"decryptValueRule":0,"githubUserField":"login","certificateResetByMailCertificateAttribute":"userCertificate;binary","ldapPasswordResetAttributeValue":"TRUE","cfgAuthorIP":"10.0.2.100","useRedirectOnError":1,"webauthnAppId":1,"oldNotifFormat":0,"totp2fInterval":30,"SMTPServer":"","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","yubikey2fPublicIDSize":12,"samlNameIDFormatMapWindows":"uid","notificationServerSentAttributes":"uid reference date title subtitle text check","rememberCookieName":"llngrememberauthchoice","portalCheckLogins":1,"openIdSPList":"0;","captcha_mail_enabled":1,"totp2fRange":1,"persistentStorage":"Apache::Session::File","requireToken":1,"customToTrace":"mail","githubAuthnLevel":1,"samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","samlNameIDFormatMapEmail":"mail","macros":{"_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\"","UA":"$ENV{HTTP_USER_AGENT}"},"facebookAuthnLevel":1,"impersonationSkipEmptyValues":1,"SSLVarIf":{},"eventQueueName":"llng_events","cfgAuthor":"dwho","jsRedirect":0,"passwordPolicySpecialChar":"__ALL__","oidcServiceMetaDataTokenURI":"token","casAppMetaDataExportedVars":{},"ldapAuthnLevel":2,"ldapVersion":3,"casStorageOptions":{},"pamAuthnLevel":2,"casAccessControlPolicy":"none","cfgVersion":"2.21.0","githubClientID":"cd5857b36056d0bf968b","sfOnlyUpgrade":1,"cspFrameAncestors":"","ldapGroupAttributeNameUser":"dn","publicNotifications":1,"locationRules":{"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"manager.llng.localhost":{"(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"auth.llng.localhost":{"(?#checkUser)^/checkuser":"$uid eq \"dwho\"","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#errors)^/lmerror/":"accept","default":"accept"},"test1.llng.localhost":{"^/saml":"unprotect","default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/logout":"logout_sso"}},"rest2fVerifyArgs":{},"managerDn":"","ldapGroupAttributeName":"member","twitterUserField":"screen_name","ldapPasswordResetAttribute":"pwdReset","facebookUserField":"id","mail2fActivation":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","yubikey2fActivation":0,"sfManagerRule":1,"cspConnect":"'self'","passwordResetAllowedRetries":3,"ldapSearchDeref":"find","mailTimeout":0,"ldapVerify":"require","findUserExcludingAttributes":{},"passwordPolicyMaxSize":0,"customPluginsParams":{},"notificationStorageOptions":{"dirName":"/app/dev/notifications"},"trustedBrowserRule":1,"samlAuthnContextMapPasswordProtectedTransport":3,"samlAuthnContextMapPassword":2,"issuerDBGetPath":"^/get/","certificateResetByMailValidityDelay":0,"samlIDPSSODescriptorWantAuthnRequestsSigned":1,"radiusRequestAttributes":{},"oidcRPMetaDataExportedVars":{},"portal":"http://auth.llng.localhost:8080/","oidcServiceEncAlgorithmEnc":"A256GCM","lwpOpts":{"timeout":10},"issuerDBJitsiMeetTokensPath":"^/jitsi/","corsAllow_Origin":"*","confirmFormMethod":"post","casAttributes":{},"reloadUrls":{},"totp2fEncryptSecret":0,"ext2fActivation":0,"linkedInFields":"id,first-name,last-name,email-address","findUserWildcard":"*","krbAuthnLevel":3,"samlSPSSODescriptorAuthnRequestsSigned":1,"globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock","Directory":"/app/dev/sessions"},"passwordPolicyMinDigit":0,"slaveAuthnLevel":2,"mailOnPasswordChange":0,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","oidcServiceMetaDataJWKSURI":"jwks","portalFavicon":"common/favicon.ico","corsAllow_Headers":"*","oidcRPMetaDataMacros":null,"samlOrganizationName":"Example","cspDefault":"'self'","cookieName":"lemonldap","oidcStorageOptions":{},"proxyAuthnLevel":2,"oidcServiceOldKeyTypeEnc":"RSA","autoSigninRules":{},"checkUserDisplayPersistentInfo":0,"mailSessionKey":"mail","samlStorageOptions":{},"trustedBrowserUseTotp":1,"stayConnected":0,"impersonationIdRule":1,"portalOpenLinkInNewWindow":0,"totp2fActivation":1,"port":-1,"contextSwitchingRule":0,"portalDisplayLogout":1,"issuerDBSAMLPath":"^/saml/","portalDisplayRegister":1,"notifyDeleted":1,"apacheAuthnLevel":3,"linkedInAuthnLevel":1,"httpOnly":1,"sameSite":"","corsAllow_Credentials":"true","checkXSS":1,"useSafeJail":1,"issuerDBSAMLRule":1,"persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","LockDirectory":"/app/dev/sessions/persistents/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256"},"mailFrom":"noreply at example.com","portalPingInterval":60000,"ldapServer":"ldap://localhost","ldapGroupObjectClass":"groupOfNames","linkedInScope":"r_liteprofile r_emailaddress","impersonationMergeSSOgroups":0,"facebookExportedVars":{},"issuerDBOpenIDRule":1,"casSrvMetaDataExportedVars":{},"globalLogoutTimer":1,"corsEnabled":1,"oidcRPMetaDataOptions":{},"ADPwdExpireWarning":0,"checkDevOpsCheckSessionAttributes":1,"gpgDb":"","loginHistoryEnabled":1,"samlRelayStateTimeout":600,"portalDisplayCertificateResetByMail":0,"stayConnectedTimeout":2592000,"portalDisplayAppslist":1,"oidcServiceKeyTypeSig":"RSA","slaveExportedVars":{},"sfExtra":{},"passwordPolicyMinUpper":0,"SMTPTLSOpts":{},"ldapBase":"dc=example,dc=com","passwordPolicyActivation":1,"groups":{},"radius2fTimeout":20,"sessionDataToRemember":{},"okta2fActivation":0,"casTicketExpiration":0,"scrollTop":400,"samlIDPMetaDataExportedAttributes":null,"browsersDontStorePassword":1,"successLoginNumber":5,"cspFont":"'self'","rest2fInitArgs":{},"userControl":"^[\\w\\.\\-@]+$","oidcOPMetaDataJSON":{},"sfRemovedNotifTitle":"Second factor notification","casAuthnLevel":1,"ldapUsePasswordResetAttribute":1,"demoExportedVars":{"uid":"uid","mail":"mail","cn":"cn"},"portalSkinRules":{},"cspImg":"'self' data:","portalErrorOnMailNotFound":0,"timeoutActivityInterval":60,"notificationsExplorer":0,"oidcServiceMetaDataUserInfoURI":"userinfo","SSLVar":"SSL_CLIENT_S_DN_Email","samlMetadataForceUTF8":1,"rememberAuthChoiceRule":1,"authentication":"Choice","cfgLog":"","linkedInUserField":"emailAddress","issuerDBCASPath":"^/cas/","jitsiSigningAlg":"RS256","timeout":72000,"remoteGlobalStorageOptions":{"ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","proxy":"http://auth.example.com/sessions"},"sfRemovedMsgRule":0,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","samlSPMetaDataExportedAttributes":null,"webauthn2fAttestation":"none","findUserControl":"^[*\\w]+$","impersonationHiddenAttributes":"_2fDevices, _loginHistory","samlNameIDFormatMapX509":"mail","whatToTrace":"_whatToTrace","oidcOPMetaDataJWKS":{},"singleUserByIP":0,"oidcServiceMetaDataAuthnContext":{"loa-3":3,"loa-2":2,"loa-4":4,"loa-5":5,"loa-1":1},"https":0,"oidcServiceKeyTypeEnc":"RSA","oidcOPMetaDataExportedVars":{},"webauthnAuthnLevel":3,"checkUserDisplayHistory":0,"notificationServerPOST":1,"newLocationWarningLocationAttribute":"ipAddr","customFunctions":"My::hello My::get_additional_arg","ldapGroupAttributeNameGroup":"dn","cspScript":"'self'","upgradeSession":1,"issuerDBGetParameters":{},"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","restAuthnLevel":2,"krbRemoveDomain":1,"openIdSreg_nickname":"uid","portalErrorOnExpiredSession":1,"pamService":"login","failedLoginNumber":5,"portalDisplayGeneratePassword":1,"portalMainLogo":"common/logos/logo_llng_400px.png","passwordPolicyMinSpeChar":0,"issuerDBJitsiMeetTokensRule":1,"cfgDate":1743675781,"oidcServiceDynamicRegistrationExportedVars":{},"samlServiceSignatureMethod":"RSA_SHA256","openIdSreg_timezone":"_timezone","oidcRPCallbackGetParam":"openidconnectcallback","globalStorage":"Apache::Session::File","SMTPTLS":"","passwordPolicyMinLower":0,"oidcOPMetaDataOptions":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","oidcServiceMetaDataRegistrationURI":"register","portalUserAttr":"_user","issuerDBCASRule":1,"checkUserDisplayNormalizedHeaders":0,"registerDB":"Demo","samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","showLanguages":1,"samlAuthnContextMapKerberos":4,"stayConnectedBypassFG":0,"securedCookie":0,"ext2fCodeActivation":"\\d{6}","checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","openIdIDPList":"0;","globalLogoutRule":0,"stayConnectedSingleSession":0,"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcServiceMetaDataAmrRules":{"mfa":"$_2f","pwd":"$authenticationLevel == 2","pop":"$_auth eq \"WebAuthn\" or $_auth eq \"SSL\"","otp":"$_2f eq \"TOTP\""},"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","oidcServiceEncAlgorithmAlg":"RSA-OAEP","ADPwdMaxAge":0,"portalDisplayPasswordPolicy":0,"exportedVars":{},"contextSwitchingIdRule":1,"oidcServiceAllowAuthorizationCodeFlow":1,"checkHIBPRequired":1,"infoFormMethod":"get","exportedHeaders":{"manager.llng.localhost":{},"test2.llng.localhost":{"Auth-User":"$uid"},"test1.llng.localhost":{"Base64":"encode_base64('a:b','')","Auth-User":"$uid","Additional-Arg":"get_additional_arg('header-added')","Uri":"$ENV{REQUEST_URI}","Macro-Uri":"$UA","Hello":"hello()","Ip-Addr":"$ipAddr"},"auth.llng.localhost":{}},"samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","corsMax_Age":"86400","portalDisplayResetPassword":0,"registerTimeout":0,"cfgNum":13,"captcha_size":6,"authChoiceParam":"lmAuth","notificationStorage":"File","captchaOptions":{},"post":{"test2.llng.localhost":{},"manager.llng.localhost":{},"auth.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"formSelector":"#test","target":"/index.pl","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js"}}},"mail2fCodeRegex":"\\d{6}","gpgAuthnLevel":5,"samlIDPMetaDataOptions":{},"grantSessionRules":{},"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","bruteForceProtectionTempo":30,"portalEnablePasswordDisplay":0,"authChoiceModules":{"1_Null":"Null;Null;Null;;;{}","2_Github":"GitHub;Null;Null;;1;{}","1_Demo":"Demo;Demo;Demo;;1;{}"},"passwordDB":"Choice","singleIP":0,"githubScope":"user:email","samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","userDB":"Same","dbiAuthnLevel":2,"samlIDPMetaDataXML":{},"sfRemovedNotifRef":"RemoveSF","ldapTimeout":10,"ldapGroupAttributeNameSearch":"cn","openIdSreg_email":"mail","casSrvMetaDataOptions":{},"oidcServiceNewKeyTypeSig":"RSA","webIDAuthnLevel":1,"checkUserDisplayHiddenAttributes":0,"jitsiExpiration":"300","portalForceAuthnInterval":5,"notificationDefaultCond":"","webauthn2fUserVerification":"preferred","totp2fUserCanRemoveKey":1,"timeoutActivity":0,"openIdExportedVars":{},"webauthn2fActivation":0,"samlSPMetaDataMacros":null,"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","radiusExportedVars":{},"samlSPSSODescriptorWantAssertionsSigned":1,"casAppMetaDataOptions":{},"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","oidcAuthnLevel":1,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","portalSkin":"bootstrap","oidcServiceOldKeyTypeSig":"RSA","webauthn2fUserCanRemoveKey":1,"ldapIOTimeout":10,"samlNameIDFormatMapKerberos":"uid","newLocationWarningLocationDisplayAttribute":"","applicationList":{"0001-cat":{"0002-app":{"type":"application","options":{"description":"A simple application displaying authenticated user","display":"auto","logo":"demo.png","uri":"http://test1.llng.localhost:8080/","name":"Application Test 1"}},"catname":"Sample applications","type":"category","0003-app":{"options":{"description":"The same simple application displaying authenticated user","display":"auto","name":"Application Test 2","logo":"thumbnail.png","uri":"http://test2.llng.localhost:8080/"},"type":"application"}},"0008-cat":{"0009-app":{"type":"application","options":{"uri":"http://manager.llng.localhost:8080/doc/","logo":"help.png","name":"Local documentation","description":"Documentation supplied with LemonLDAP::NG","display":"on"}},"0010-app":{"options":{"display":"on","description":"Official LemonLDAP::NG Website","logo":"network.png","uri":"https://lemonldap-ng.org/","name":"Official Website"},"type":"application"},"catname":"Documentation","type":"category"},"0004-cat":{"0007-app":{"type":"application","options":{"description":"Explore WebSSO sessions","display":"auto","name":"Sessions Explorer","uri":"http://manager.llng.localhost:8080/sessions.html","logo":"database.png"}},"type":"category","catname":"Administration","0005-app":{"type":"application","options":{"name":"WebSSO Manager","uri":"http://manager.llng.localhost:8080/manager.html","logo":"configure.png","display":"auto","description":"Configure LemonLDAP::NG WebSSO"}},"0006-app":{"type":"application","options":{"name":"Notifications Explorer","logo":"database.png","uri":"http://manager.llng.localhost:8080/notifications.html","display":"auto","description":"Explore WebSSO notifications"}},"0008-app":{"type":"application","options":{"uri":"http://manager.llng.localhost:8080/2ndfa.html","logo":"database.png","name":"2FA Sessions Explorer","display":"auto","description":"Explore WebSSO 2FA sessions"}}}},"radius2fRequestAttributes":{},"portalDisplayLoginHistory":1,"ldapPwdEnc":"utf-8","formTimeout":120,"notification":1,"issuerDBOpenIDConnectRule":1,"proxyAuthServiceChoiceParam":"lmAuth","newLocationWarningMaxValues":"0","checkUserHiddenHeaders":{},"dbiExportedVars":{}}
\ No newline at end of file
diff --git a/dev/conf/lmConf-2.json b/dev/conf/lmConf-2.json
deleted file mode 100644
index c4a49d90e..000000000
--- a/dev/conf/lmConf-2.json
+++ /dev/null
@@ -1 +0,0 @@
-{"oidcOPMetaDataOptions":{},"totp2fSelfRegistration":1,"yubikey2fPublicIDSize":12,"passwordResetAllowedRetries":3,"samlAuthnContextMapPasswordProtectedTransport":3,"SSLIssuerVar":"SSL_CLIENT_I_DN","samlAuthnContextMapTLSClient":5,"casSrvMetaDataExportedVars":{},"apacheAuthnLevel":3,"dbiAuthnLevel":2,"linkedInScope":"r_liteprofile r_emailaddress","issuerDBSAMLRule":1,"samlOrganizationDisplayName":"Example","passwordPolicyMinSpeChar":0,"dbiExportedVars":{},"oidcOPMetaDataJWKS":{},"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","oidcServiceAuthorizationCodeExpiration":60,"casAuthnLevel":1,"ldapUsePasswordResetAttribute":1,"findUserExcludingAttributes":{},"lwpSslOpts":{},"userControl":"^[\\w\\.\\-@]+$","oidcServiceKeyTypeSig":"RSA","portalDisplayGeneratePassword":1,"totp2fEncryptSecret":0,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","stayConnected":0,"casSrvMetaDataOptions":{},"corsAllow_Methods":"POST,GET","singleIP":0,"issuerDBOpenIDPath":"^/openidserver/","grantSessionRules":{},"portalSkinRules":{},"samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","captcha_login_enabled":0,"oidcOPMetaDataJSON":{},"oidcServiceAccessTokenExpiration":3600,"groups":{},"corsAllow_Credentials":"true","mail2fCodeRegex":"\\d{6}","gpgAuthnLevel":5,"cspFormAction":"*","samlSPMetaDataExportedAttributes":null,"timeoutActivity":0,"oidcServiceMetaDataFrontChannelURI":"flogout","ADPwdMaxAge":0,"mailSessionKey":"mail","sfRemovedNotifTitle":"Second factor notification","notificationServerSentAttributes":"uid reference date title subtitle text check","password2fUserCanRemoveKey":1,"casAttributes":{},"portalErrorOnExpiredSession":1,"cspFrameAncestors":"","notificationDefaultCond":"","localSessionStorage":"Cache::FileCache","portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","certificateResetByMailCertificateAttribute":"userCertificate;binary","decryptValueRule":0,"pamService":"login","portalAntiFrame":1,"checkUserDisplayEmptyValues":0,"totp2fActivation":1,"portalMainLogo":"common/logos/logo_llng_400px.png","casAppMetaDataExportedVars":{},"checkUserDisplayPersistentInfo":0,"samlServiceSignatureMethod":"RSA_SHA256","issuerDBJitsiMeetTokensRule":1,"portalDisplayLogout":1,"whatToTrace":"_whatToTrace","checkXSS":1,"corsMax_Age":"86400","gpgDb":"","oidcServiceEncAlgorithmEnc":"A256GCM","oidcRPMetaDataExportedVars":{},"contextSwitchingRule":0,"mailTimeout":0,"SMTPTLS":"","portalDisplayRegister":1,"portalFavicon":"common/favicon.ico","portalRequireOldPassword":1,"oidcServiceMetaDataUserInfoURI":"userinfo","scrollTop":400,"stayConnectedBypassFG":0,"issuerDBGetParameters":{},"port":-1,"macros":{"_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\"","UA":"$ENV{HTTP_USER_AGENT}"},"trustedBrowserUseTotp":1,"openIdSreg_email":"mail","stayConnectedTimeout":2592000,"hideOldPassword":1,"trustedBrowserRule":1,"persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","LockDirectory":"/app/dev/sessions/persistents/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256"},"exportedVars":{},"issuerDBOpenIDConnectRule":1,"rememberCookieTimeout":31536000,"samlMetadataForceUTF8":1,"ldapPwdEnc":"utf-8","samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","ldapPasswordResetAttributeValue":"TRUE","bruteForceProtectionTempo":30,"samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","linkedInFields":"id,first-name,last-name,email-address","userDB":"Same","webauthn2fActivation":0,"checkUserDisplayComputedSession":1,"checkUserDisplayHiddenAttributes":0,"corsEnabled":1,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","cspFont":"'self'","locationDetectGeoIpLanguages":"en, fr","oidcServiceMetaDataAuthnContext":{"loa-4":4,"loa-2":2,"loa-3":3,"loa-5":5,"loa-1":1},"singleUserByIP":0,"casAccessControlPolicy":"none","httpOnly":1,"notificationWildcard":"allusers","checkUserDisplayHistory":0,"bruteForceProtectionMaxLockTime":900,"portalCheckLogins":1,"portalPingInterval":60000,"useRedirectOnError":1,"facebookAuthnLevel":1,"proxyAuthServiceChoiceParam":"lmAuth","ldapTimeout":10,"certificateResetByMailValidityDelay":0,"certificateResetByMailCeaAttribute":"description","oidcServiceAllowAuthorizationCodeFlow":1,"findUserWildcard":"*","cspConnect":"'self'","findUserControl":"^[*\\w]+$","bruteForceProtectionMaxAge":300,"sessionDataToRemember":{},"totp2fDigits":6,"cspStyle":"'self'","portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","locationRules":{"auth.llng.localhost":{"(?#errors)^/lmerror/":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","default":"accept"},"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"manager.llng.localhost":{"default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"test1.llng.localhost":{"default":"accept","^/logout":"logout_sso","^/saml":"unprotect","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/"}},"facebookExportedVars":{},"samlNameIDFormatMapKerberos":"uid","mailCharset":"utf-8","samlNameIDFormatMapX509":"mail","radiusRequestAttributes":{},"webauthn2fUserVerification":"preferred","customToTrace":"mail","notificationStorage":"File","oidcServiceMetaDataJWKSURI":"jwks","twitterUserField":"screen_name","notificationStorageOptions":{"dirName":"/app/dev"},"samlOrganizationURL":"http://www.example.com","issuerDBSAMLPath":"^/saml/","ldapGroupAttributeNameGroup":"dn","sameSite":"","oidcRPMetaDataOptionsExtraClaims":null,"facebookUserField":"id","samlSPMetaDataXML":null,"confirmFormMethod":"post","upgradeSession":1,"sfManagerRule":1,"https":0,"cspScript":"'self'","ldapGroupAttributeNameUser":"dn","okta2fActivation":0,"contextSwitchingStopWithLogout":1,"oidcServiceOfflineSessionExpiration":2592000,"cspImg":"'self' data:","failedLoginNumber":5,"multiValuesSeparator":"; ","messageBrokerOptions":{},"captchaOptions":{},"cfgAuthorIP":"10.0.2.100","oidcServiceMetaDataEndSessionURI":"logout","openIdIDPList":"0;","openIdSreg_timezone":"_timezone","ldapVersion":3,"successLoginNumber":5,"casTicketExpiration":0,"captcha_size":6,"globalLogoutRule":0,"samlSPSSODescriptorWantAssertionsSigned":1,"restClockTolerance":15,"ldapIOTimeout":10,"SSLAuthnLevel":5,"SMTPServer":"","yubikey2fSelfRegistration":0,"formTimeout":120,"registerDB":"Demo","ADPwdExpireWarning":0,"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","localSessionStorageOptions":{"default_expires_in":600,"directory_umask":"007","cache_root":"/app/dev/sessions/","namespace":"lemonldap-ng-sessions","cache_depth":3},"checkUserIdRule":1,"stayConnectedSingleSession":0,"oidcServiceMetaDataCheckSessionURI":"checksession.html","ldapExportedVars":{"mail":"mail","uid":"uid","cn":"cn"},"oidcStorageOptions":{},"combModules":{},"cfgDate":1726653971,"samlAuthnContextMapExtra":{},"samlOrganizationName":"Example","cookieName":"lemonldap","webauthn2fUserCanRemoveKey":1,"webIDExportedVars":{},"newLocationWarningLocationAttribute":"ipAddr","timeout":72000,"post":{"test2.llng.localhost":{},"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"buttonSelector":"#bt","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"target":"/index.pl","formSelector":"#test","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js"}}},"checkDevOpsDownload":1,"timeoutActivityInterval":60,"showLanguages":1,"samlIDPMetaDataXML":{},"yubikey2fActivation":0,"issuerDBJitsiMeetTokensPath":"^/jitsi/","samlRelayStateTimeout":600,"restAuthnLevel":2,"password2fActivation":0,"autoSigninRules":{},"githubScope":"user:email","bruteForceProtectionMaxFailed":3,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","samlSPMetaDataOptions":{},"passwordPolicyMinSize":0,"passwordPolicyMaxSize":0,"impersonationRule":0,"mail2fActivation":0,"issuerDBOpenIDConnectPath":"^/oauth2/","passwordPolicySpecialChar":"__ALL__","portalDisplayAppslist":1,"vhostOptions":{"manager.llng.localhost":{"vhostAliases":"","vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostType":"Main","vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostMaintenance":0,"vhostHttps":-1}},"newLocationWarningLocationDisplayAttribute":"","radius2fRequestAttributes":{},"lwpOpts":{"timeout":10},"ext2fCodeActivation":"\\d{6}","newLocationWarningMaxValues":"0","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","issuerDBGetRule":1,"portalSkin":"bootstrap","useSafeJail":1,"openIdSPList":"0;","customFunctions":"My::hello My::get_additional_arg","samlSPSSODescriptorAuthnRequestsSigned":1,"casStorageOptions":{},"ldapBase":"dc=example,dc=com","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","rest2fInitArgs":{},"applicationList":{"0001-cat":{"0002-app":{"options":{"display":"auto","name":"Application Test 1","uri":"http://test1.llng.localhost:8080/","description":"A simple application displaying authenticated user","logo":"demo.png"},"type":"application"},"catname":"Sample applications","type":"category","0003-app":{"type":"application","options":{"uri":"http://test2.llng.localhost:8080/","logo":"thumbnail.png","description":"The same simple application displaying authenticated user","display":"auto","name":"Application Test 2"}}},"0008-cat":{"catname":"Documentation","0010-app":{"options":{"description":"Official LemonLDAP::NG Website","logo":"network.png","uri":"https://lemonldap-ng.org/","display":"on","name":"Official Website"},"type":"application"},"type":"category","0009-app":{"options":{"logo":"help.png","description":"Documentation supplied with LemonLDAP::NG","uri":"http://manager.llng.localhost:8080/doc/","name":"Local documentation","display":"on"},"type":"application"}},"0004-cat":{"0008-app":{"type":"application","options":{"display":"auto","name":"2FA Sessions Explorer","uri":"http://manager.llng.localhost:8080/2ndfa.html","logo":"database.png","description":"Explore WebSSO 2FA sessions"}},"0006-app":{"options":{"name":"Notifications Explorer","display":"auto","uri":"http://manager.llng.localhost:8080/notifications.html","description":"Explore WebSSO notifications","logo":"database.png"},"type":"application"},"catname":"Administration","type":"category","0005-app":{"options":{"logo":"configure.png","description":"Configure LemonLDAP::NG WebSSO","uri":"http://manager.llng.localhost:8080/manager.html","name":"WebSSO Manager","display":"auto"},"type":"application"},"0007-app":{"type":"application","options":{"name":"Sessions Explorer","display":"auto","logo":"database.png","description":"Explore WebSSO sessions","uri":"http://manager.llng.localhost:8080/sessions.html"}}}},"linkedInAuthnLevel":1,"globalLogoutTimer":1,"securedCookie":0,"portalDisplayLoginHistory":1,"githubAuthnLevel":1,"SSLVarIf":{},"totp2fRange":1,"oidcServiceMetaDataIntrospectionURI":"introspect","oidcRPMetaDataOptions":{},"impersonationSkipEmptyValues":1,"webauthnAuthnLevel":3,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","oidcServiceOldKeyTypeEnc":"RSA","krbRemoveDomain":1,"openIdAuthnLevel":1,"oidcServiceNewKeyTypeSig":"RSA","sfRemovedNotifRef":"RemoveSF","checkUserDisplayNormalizedHeaders":0,"samlAuthnContextMapKerberos":4,"openIdSreg_nickname":"uid","oidcServiceKeyTypeEnc":"RSA","stayConnectedCookieName":"llngconnection","casAppMetaDataOptions":{},"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","radiusAuthnLevel":3,"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","proxyAuthnLevel":2,"jitsiSigningAlg":"RS256","cfgAuthor":"dwho","issuersTimeout":120,"portal":"http://auth.llng.localhost:8080/","ldapServer":"ldap://localhost","issuerDBCASRule":1,"slaveExportedVars":{},"oidcServiceOldKeyTypeSig":"RSA","linkedInUserField":"emailAddress","radiusExportedVars":{},"corsAllow_Headers":"*","portalUserAttr":"_user","ldapAuthnLevel":2,"rememberDefaultChecked":0,"sfRemovedMsgRule":0,"webauthn2fSelfRegistration":0,"samlIDPSSODescriptorWantAuthnRequestsSigned":1,"ldapVerify":"require","openIdExportedVars":{},"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","SSLVar":"SSL_CLIENT_S_DN_Email","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions","LockDirectory":"/app/dev/sessions/lock"},"samlNameIDFormatMapEmail":"mail","requireToken":1,"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","oidcServiceIDTokenExpiration":3600,"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","key":"qwertyui","krbAuthnLevel":3,"adaptativeAuthenticationLevelRules":{},"eventQueueName":"llng_events","samlIDPMetaDataOptions":{},"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","rest2fActivation":0,"ldapPasswordResetAttribute":"pwdReset","corsAllow_Origin":"*","managerPassword":"","radius2fActivation":0,"checkDevOpsCheckSessionAttributes":1,"samlIDPMetaDataExportedAttributes":null,"reloadTimeout":5,"customPluginsParams":{},"samlSPMetaDataMacros":null,"singleSession":0,"oidcServiceMetaDataAuthorizeURI":"authorize","rememberTimer":5,"twitterAuthnLevel":1,"ldapGroupAttributeName":"member","webauthnAppId":1,"openIdSreg_fullname":"cn","githubUserField":"login","oidcRPCallbackGetParam":"openidconnectcallback","ldapGroupObjectClass":"groupOfNames","ldapSearchDeref":"find","cfgVersion":"2.19.2","exportedHeaders":{"test1.llng.localhost":{"Ip-Addr":"$ipAddr","Additional-Arg":"get_additional_arg('header-added')","Uri":"$ENV{REQUEST_URI}","Hello":"hello()","Base64":"encode_base64('a:b','')","Auth-User":"$uid","Macro-Uri":"$UA"},"test2.llng.localhost":{"Auth-User":"$uid"}},"loginHistoryEnabled":1,"logoutServices":{},"checkDevOpsDisplayNormalizedHeaders":1,"checkUserDisplayEmptyHeaders":0,"samlNameIDFormatMapWindows":"uid","issuerDBCASPath":"^/cas/","totp2fInterval":30,"hiddenAttributes":"_password _2fDevices","cfgNum":2,"findUserSearchingAttributes":{},"infoFormMethod":"get","yubikey2fUserCanRemoveKey":1,"issuerDBOpenIDRule":1,"totp2fUserCanRemoveKey":1,"activeTimer":1,"globalStorage":"Apache::Session::File","mailFrom":"noreply at example.com","displaySessionId":1,"domain":"llng.localhost","randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","passwordPolicyActivation":1,"pamAuthnLevel":2,"passwordPolicyMinUpper":0,"rememberCookieName":"llngrememberauthchoice","password2fSelfRegistration":0,"rememberAuthChoiceRule":0,"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","cfgLog":"TOTP et trusted browser","notification":1,"notificationServerPOST":1,"ldapGroupAttributeNameSearch":"cn","oidcOPMetaDataExportedVars":null,"notifyDeleted":1,"oidcServiceDynamicRegistrationExtraClaims":{},"oidcServiceDynamicRegistrationExportedVars":{},"sfExtra":{},"jsRedirect":0,"slaveAuthnLevel":2,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","totp2fAuthnLevel":"4","passwordDB":"Demo","casAppMetaDataMacros":null,"contextSwitchingIdRule":1,"portalForceAuthnInterval":5,"checkHIBPURL":"https://api.pwnedpasswords.com/range/","customAddParams":{},"corsExpose_Headers":"*","passwordPolicyMinLower":0,"redirectFormMethod":"get","impersonationHiddenAttributes":"_2fDevices, _loginHistory","managerDn":"","ext2fActivation":0,"webauthn2fAttestation":"none","cspDefault":"'self'","remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"oidcRPMetaDataMacros":null,"reloadUrls":{},"demoExportedVars":{"mail":"mail","uid":"uid","cn":"cn"},"authChoiceParam":"lmAuth","samlAuthnContextMapPassword":2,"SMTPTLSOpts":{},"oidcRPMetaDataScopeRules":null,"webIDAuthnLevel":1,"impersonationIdRule":1,"oidcServiceMetaDataBackChannelURI":"blogout","impersonationMergeSSOgroups":0,"captcha_register_enabled":1,"authentication":"Demo","issuerDBGetPath":"^/get/","registerTimeout":0,"samlEntityID":"#PORTAL#/saml/metadata","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","samlStorageOptions":{},"oidcRPStateTimeout":600,"oidcServiceMetaDataRegistrationURI":"register","samlOverrideIDPEntityID":"","nginxCustomHandlers":{},"authChoiceModules":{},"radius2fTimeout":20,"jitsiExpiration":"300","sfOnlyUpgrade":1,"oidcServiceMetaDataTokenURI":"token","checkUserHiddenHeaders":{},"oidcAuthnLevel":1,"passwordPolicyMinDigit":0,"checkHIBPRequired":1,"sfRequired":0,"captcha_mail_enabled":1,"nullAuthnLevel":0,"crowdsecAction":"reject","persistentStorage":"Apache::Session::File","portalDisplayRefreshMyRights":1,"rest2fVerifyArgs":{}}
\ No newline at end of file
diff --git a/dev/conf/lmConf-3.json b/dev/conf/lmConf-3.json
deleted file mode 100644
index 244148478..000000000
--- a/dev/conf/lmConf-3.json
+++ /dev/null
@@ -1 +0,0 @@
-{"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","locationRules":{"test2.llng.localhost":{"default":"accept","^/logout":"logout_sso"},"auth.llng.localhost":{"(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","(?#errors)^/lmerror/":"accept","default":"accept"},"test1.llng.localhost":{"^/saml":"unprotect","^/logout":"logout_sso","default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1"},"manager.llng.localhost":{"(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""}},"radiusRequestAttributes":{},"webauthn2fUserVerification":"preferred","facebookExportedVars":{},"samlNameIDFormatMapX509":"mail","mailCharset":"utf-8","samlNameIDFormatMapKerberos":"uid","bruteForceProtectionMaxAge":300,"findUserControl":"^[*\\w]+$","cspConnect":"'self'","cspStyle":"'self'","sessionDataToRemember":{},"totp2fDigits":6,"notificationStorageOptions":{"dirName":"/app/dev"},"twitterUserField":"screen_name","samlOrganizationURL":"http://www.example.com","customToTrace":"mail","oidcServiceMetaDataJWKSURI":"jwks","notificationStorage":"File","cspFont":"'self'","casAccessControlPolicy":"none","singleUserByIP":0,"oidcServiceMetaDataAuthnContext":{"loa-1":1,"loa-5":5,"loa-3":3,"loa-2":2,"loa-4":4},"locationDetectGeoIpLanguages":"en, fr","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","useRedirectOnError":1,"portalCheckLogins":1,"portalPingInterval":60000,"bruteForceProtectionMaxLockTime":900,"notificationWildcard":"allusers","httpOnly":1,"checkUserDisplayHistory":0,"checkUserDisplayComputedSession":1,"webauthn2fActivation":0,"checkUserDisplayHiddenAttributes":0,"linkedInFields":"id,first-name,last-name,email-address","userDB":"Same","corsEnabled":1,"certificateResetByMailValidityDelay":0,"certificateResetByMailCeaAttribute":"description","findUserWildcard":"*","oidcServiceAllowAuthorizationCodeFlow":1,"proxyAuthServiceChoiceParam":"lmAuth","facebookAuthnLevel":1,"ldapTimeout":10,"formTimeout":120,"yubikey2fSelfRegistration":0,"localSessionStorageOptions":{"default_expires_in":600,"directory_umask":"007","namespace":"lemonldap-ng-sessions","cache_depth":3,"cache_root":"/app/dev/sessions/"},"ADPwdExpireWarning":0,"registerDB":"Demo","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","samlSPSSODescriptorWantAssertionsSigned":1,"ldapIOTimeout":10,"SSLAuthnLevel":5,"restClockTolerance":15,"globalLogoutRule":0,"captcha_size":6,"casTicketExpiration":0,"SMTPServer":"","ldapExportedVars":{"uid":"uid","mail":"mail","cn":"cn"},"oidcStorageOptions":{},"stayConnectedSingleSession":0,"checkUserIdRule":1,"oidcServiceMetaDataCheckSessionURI":"checksession.html","contextSwitchingStopWithLogout":1,"cspImg":"'self' data:","oidcServiceOfflineSessionExpiration":2592000,"okta2fActivation":0,"ldapGroupAttributeNameUser":"dn","failedLoginNumber":5,"multiValuesSeparator":"; ","oidcRPMetaDataOptionsExtraClaims":null,"sameSite":"","facebookUserField":"id","samlSPMetaDataXML":null,"issuerDBSAMLPath":"^/saml/","ldapGroupAttributeNameGroup":"dn","https":0,"cspScript":"'self'","confirmFormMethod":"post","sfManagerRule":1,"upgradeSession":1,"openIdIDPList":"0;","openIdSreg_timezone":"_timezone","successLoginNumber":5,"ldapVersion":3,"messageBrokerOptions":{},"cfgAuthorIP":"10.0.2.100","captchaOptions":{},"oidcServiceMetaDataEndSessionURI":"logout","casSrvMetaDataOptions":{},"corsAllow_Methods":"POST,GET","singleIP":0,"grantSessionRules":{},"issuerDBOpenIDPath":"^/openidserver/","oidcServiceEncAlgorithmAlg":"RSA-OAEP","stayConnected":0,"userControl":"^[\\w\\.\\-@]+$","oidcServiceKeyTypeSig":"RSA","totp2fEncryptSecret":0,"portalDisplayGeneratePassword":1,"samlSPMetaDataExportedAttributes":null,"cspFormAction":"*","gpgAuthnLevel":5,"timeoutActivity":0,"mailSessionKey":"mail","oidcServiceMetaDataFrontChannelURI":"flogout","ADPwdMaxAge":0,"oidcOPMetaDataJSON":{},"oidcServiceAccessTokenExpiration":3600,"captcha_login_enabled":0,"samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","corsAllow_Credentials":"true","groups":{},"portalSkinRules":{},"mail2fCodeRegex":"\\d{6}","samlAuthnContextMapTLSClient":5,"casSrvMetaDataExportedVars":{},"linkedInScope":"r_liteprofile r_emailaddress","samlOrganizationDisplayName":"Example","issuerDBSAMLRule":1,"apacheAuthnLevel":3,"dbiAuthnLevel":2,"totp2fSelfRegistration":1,"yubikey2fPublicIDSize":12,"oidcOPMetaDataOptions":{},"passwordResetAllowedRetries":3,"SSLIssuerVar":"SSL_CLIENT_I_DN","samlAuthnContextMapPasswordProtectedTransport":3,"findUserExcludingAttributes":{},"ldapUsePasswordResetAttribute":1,"lwpSslOpts":{},"oidcOPMetaDataJWKS":{},"passwordPolicyMinSpeChar":0,"dbiExportedVars":{},"casAuthnLevel":1,"oidcServiceAuthorizationCodeExpiration":60,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","mailTimeout":0,"portalFavicon":"common/favicon.ico","portalDisplayRegister":1,"SMTPTLS":"","contextSwitchingRule":0,"issuerDBGetParameters":{},"port":-1,"portalRequireOldPassword":1,"oidcServiceMetaDataUserInfoURI":"userinfo","scrollTop":400,"stayConnectedBypassFG":0,"whatToTrace":"_whatToTrace","portalDisplayLogout":1,"checkXSS":1,"issuerDBJitsiMeetTokensRule":1,"oidcServiceEncAlgorithmEnc":"A256GCM","oidcRPMetaDataExportedVars":{},"corsMax_Age":"86400","gpgDb":"","samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","ldapPwdEnc":"utf-8","ldapPasswordResetAttributeValue":"TRUE","samlMetadataForceUTF8":1,"bruteForceProtectionTempo":30,"samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","stayConnectedTimeout":2592000,"openIdSreg_email":"mail","trustedBrowserUseTotp":1,"hideOldPassword":1,"macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"rememberCookieTimeout":31536000,"exportedVars":{},"issuerDBOpenIDConnectRule":1,"trustedBrowserRule":1,"persistentStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions/persistents","LockDirectory":"/app/dev/sessions/persistents/lock"},"cspFrameAncestors":"","notificationDefaultCond":"","decryptValueRule":0,"localSessionStorage":"Cache::FileCache","portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","certificateResetByMailCertificateAttribute":"userCertificate;binary","password2fUserCanRemoveKey":1,"notificationServerSentAttributes":"uid reference date title subtitle text check","sfRemovedNotifTitle":"Second factor notification","portalErrorOnExpiredSession":1,"casAttributes":{},"casAppMetaDataExportedVars":{},"samlServiceSignatureMethod":"RSA_SHA256","checkUserDisplayPersistentInfo":0,"pamService":"login","portalMainLogo":"common/logos/logo_llng_400px.png","totp2fActivation":1,"portalAntiFrame":1,"checkUserDisplayEmptyValues":0,"domain":"llng.localhost","globalStorage":"Apache::Session::File","activeTimer":1,"displaySessionId":1,"mailFrom":"noreply at example.com","passwordPolicyActivation":1,"pamAuthnLevel":2,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","issuerDBOpenIDRule":1,"yubikey2fUserCanRemoveKey":1,"totp2fUserCanRemoveKey":1,"sfExtra":{},"oidcServiceDynamicRegistrationExportedVars":{},"oidcOPMetaDataExportedVars":null,"notifyDeleted":1,"ldapGroupAttributeNameSearch":"cn","oidcServiceDynamicRegistrationExtraClaims":{},"slaveAuthnLevel":2,"totp2fAuthnLevel":"4","samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","jsRedirect":0,"password2fSelfRegistration":0,"rememberAuthChoiceRule":0,"passwordPolicyMinUpper":0,"rememberCookieName":"llngrememberauthchoice","notification":1,"cfgLog":"","portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","notificationServerPOST":1,"ldapGroupAttributeName":"member","openIdSreg_fullname":"cn","webauthnAppId":1,"rememberTimer":5,"twitterAuthnLevel":1,"ldapGroupObjectClass":"groupOfNames","oidcRPCallbackGetParam":"openidconnectcallback","githubUserField":"login","radius2fActivation":0,"managerPassword":"","checkDevOpsCheckSessionAttributes":1,"corsAllow_Origin":"*","ldapPasswordResetAttribute":"pwdReset","rest2fActivation":0,"singleSession":0,"oidcServiceMetaDataAuthorizeURI":"authorize","reloadTimeout":5,"customPluginsParams":{},"samlIDPMetaDataExportedAttributes":null,"samlSPMetaDataMacros":null,"hiddenAttributes":"_password _2fDevices","totp2fInterval":30,"issuerDBCASPath":"^/cas/","findUserSearchingAttributes":{},"infoFormMethod":"get","cfgNum":3,"checkUserDisplayEmptyHeaders":0,"ldapSearchDeref":"find","cfgVersion":"2.19.2","checkDevOpsDisplayNormalizedHeaders":1,"logoutServices":{},"exportedHeaders":{"test1.llng.localhost":{"Auth-User":"$uid","Ip-Addr":"$ipAddr","Base64":"encode_base64('a:b','')","Macro-Uri":"$UA","Hello":"hello()","Uri":"$ENV{REQUEST_URI}","Additional-Arg":"get_additional_arg('header-added')"},"manager.llng.localhost":{},"test2.llng.localhost":{"Auth-User":"$uid"},"auth.llng.localhost":{}},"loginHistoryEnabled":1,"samlNameIDFormatMapWindows":"uid","jitsiExpiration":"300","checkUserHiddenHeaders":{},"oidcServiceMetaDataTokenURI":"token","oidcAuthnLevel":1,"sfOnlyUpgrade":1,"samlStorageOptions":{},"samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","radius2fTimeout":20,"samlOverrideIDPEntityID":"","oidcServiceMetaDataRegistrationURI":"register","oidcRPStateTimeout":600,"authChoiceModules":{},"nginxCustomHandlers":{},"persistentStorage":"Apache::Session::File","crowdsecAction":"reject","captcha_mail_enabled":1,"sfRequired":0,"nullAuthnLevel":0,"rest2fVerifyArgs":{},"portalDisplayRefreshMyRights":1,"passwordPolicyMinDigit":0,"checkHIBPRequired":1,"corsExpose_Headers":"*","passwordPolicyMinLower":0,"redirectFormMethod":"get","ext2fActivation":0,"cspDefault":"'self'","webauthn2fAttestation":"none","managerDn":"","impersonationHiddenAttributes":"_2fDevices, _loginHistory","passwordDB":"Demo","casAppMetaDataMacros":null,"contextSwitchingIdRule":1,"customAddParams":{},"portalForceAuthnInterval":5,"checkHIBPURL":"https://api.pwnedpasswords.com/range/","oidcRPMetaDataScopeRules":null,"impersonationIdRule":1,"oidcServiceMetaDataBackChannelURI":"blogout","webIDAuthnLevel":1,"samlEntityID":"#PORTAL#/saml/metadata","registerTimeout":0,"captcha_register_enabled":1,"impersonationMergeSSOgroups":0,"authentication":"Demo","issuerDBGetPath":"^/get/","remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"oidcRPMetaDataMacros":null,"reloadUrls":{},"samlAuthnContextMapPassword":2,"SMTPTLSOpts":{},"authChoiceParam":"lmAuth","demoExportedVars":{"uid":"uid","mail":"mail","cn":"cn"},"samlSPSSODescriptorAuthnRequestsSigned":1,"customFunctions":"My::hello My::get_additional_arg","openIdSPList":"0;","useSafeJail":1,"casStorageOptions":{},"ext2fCodeActivation":"\\d{6}","radius2fRequestAttributes":{},"lwpOpts":{"timeout":10},"newLocationWarningMaxValues":"0","issuerDBGetRule":1,"portalSkin":"bootstrap","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","githubAuthnLevel":1,"portalDisplayLoginHistory":1,"securedCookie":0,"globalLogoutTimer":1,"SSLVarIf":{},"ldapBase":"dc=example,dc=com","sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","linkedInAuthnLevel":1,"rest2fInitArgs":{},"applicationList":{"0001-cat":{"0003-app":{"options":{"name":"Application Test 2","display":"auto","uri":"http://test2.llng.localhost:8080/","description":"The same simple application displaying authenticated user","logo":"thumbnail.png"},"type":"application"},"type":"category","catname":"Sample applications","0002-app":{"options":{"name":"Application Test 1","display":"auto","description":"A simple application displaying authenticated user","logo":"demo.png","uri":"http://test1.llng.localhost:8080/"},"type":"application"}},"0008-cat":{"catname":"Documentation","0009-app":{"type":"application","options":{"display":"on","name":"Local documentation","logo":"help.png","description":"Documentation supplied with LemonLDAP::NG","uri":"http://manager.llng.localhost:8080/doc/"}},"type":"category","0010-app":{"type":"application","options":{"description":"Official LemonLDAP::NG Website","logo":"network.png","uri":"https://lemonldap-ng.org/","name":"Official Website","display":"on"}}},"0004-cat":{"0007-app":{"type":"application","options":{"display":"auto","name":"Sessions Explorer","uri":"http://manager.llng.localhost:8080/sessions.html","description":"Explore WebSSO sessions","logo":"database.png"}},"0006-app":{"type":"application","options":{"uri":"http://manager.llng.localhost:8080/notifications.html","logo":"database.png","description":"Explore WebSSO notifications","name":"Notifications Explorer","display":"auto"}},"0008-app":{"options":{"description":"Explore WebSSO 2FA sessions","logo":"database.png","uri":"http://manager.llng.localhost:8080/2ndfa.html","name":"2FA Sessions Explorer","display":"auto"},"type":"application"},"0005-app":{"type":"application","options":{"logo":"configure.png","description":"Configure LemonLDAP::NG WebSSO","uri":"http://manager.llng.localhost:8080/manager.html","name":"WebSSO Manager","display":"auto"}},"type":"category","catname":"Administration"}},"issuerDBJitsiMeetTokensPath":"^/jitsi/","samlIDPMetaDataXML":{},"yubikey2fActivation":0,"samlRelayStateTimeout":600,"post":{"auth.llng.localhost":{},"test2.llng.localhost":{},"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt","formSelector":"#test","target":"/index.pl","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js"}}},"newLocationWarningLocationAttribute":"ipAddr","timeout":72000,"showLanguages":1,"timeoutActivityInterval":60,"checkDevOpsDownload":1,"password2fActivation":0,"restAuthnLevel":2,"autoSigninRules":{},"githubScope":"user:email","cfgDate":1726654167,"samlOrganizationName":"Example","samlAuthnContextMapExtra":{},"combModules":{},"webauthn2fUserCanRemoveKey":1,"webIDExportedVars":{},"cookieName":"lemonldap","passwordPolicySpecialChar":"__ALL__","issuerDBOpenIDConnectPath":"^/oauth2/","newLocationWarningLocationDisplayAttribute":"","vhostOptions":{"test1.llng.localhost":{"vhostType":"Main","vhostAuthnLevel":"4","vhostPort":-1,"vhostServiceTokenTTL":-1,"vhostAliases":"","vhostComment":"","vhostHttps":-1,"vhostAccessToTrace":"","vhostMaintenance":0},"manager.llng.localhost":{"vhostHttps":-1,"vhostMaintenance":0,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostPort":-1,"vhostType":"Main","vhostServiceTokenTTL":-1,"vhostAliases":""},"auth.llng.localhost":{},"test2.llng.localhost":{}},"portalDisplayAppslist":1,"samlSPMetaDataOptions":{},"passwordPolicyMinSize":0,"bruteForceProtectionMaxFailed":3,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","mail2fActivation":0,"impersonationRule":0,"passwordPolicyMaxSize":0,"webauthn2fSelfRegistration":0,"sfRemovedMsgRule":0,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","SSLVar":"SSL_CLIENT_S_DN_Email","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"openIdExportedVars":{},"ldapVerify":"require","issuerDBCASRule":1,"oidcServiceOldKeyTypeSig":"RSA","slaveExportedVars":{},"rememberDefaultChecked":0,"radiusExportedVars":{},"corsAllow_Headers":"*","portalUserAttr":"_user","linkedInUserField":"emailAddress","ldapAuthnLevel":2,"samlIDPMetaDataOptions":{},"eventQueueName":"llng_events","adaptativeAuthenticationLevelRules":{},"krbAuthnLevel":3,"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions","LockDirectory":"/app/dev/sessions/lock"},"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","requireToken":1,"key":"qwertyui","samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcServiceIDTokenExpiration":3600,"samlNameIDFormatMapEmail":"mail","samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","impersonationSkipEmptyValues":1,"webauthnAuthnLevel":3,"oidcServiceOldKeyTypeEnc":"RSA","krbRemoveDomain":1,"oidcServiceMetaDataIntrospectionURI":"introspect","totp2fRange":1,"oidcRPMetaDataOptions":{},"jitsiSigningAlg":"RS256","proxyAuthnLevel":2,"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","radiusAuthnLevel":3,"ldapServer":"ldap://localhost","cfgAuthor":"dwho","issuersTimeout":120,"portal":"http://auth.llng.localhost:8080/","samlAuthnContextMapKerberos":4,"openIdAuthnLevel":1,"sfRemovedNotifRef":"RemoveSF","oidcServiceNewKeyTypeSig":"RSA","checkUserDisplayNormalizedHeaders":0,"casAppMetaDataOptions":{},"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","oidcServiceKeyTypeEnc":"RSA","openIdSreg_nickname":"uid","stayConnectedCookieName":"llngconnection"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-4.json b/dev/conf/lmConf-4.json
deleted file mode 100644
index a496a984e..000000000
--- a/dev/conf/lmConf-4.json
+++ /dev/null
@@ -1 +0,0 @@
-{"jsRedirect":0,"oidcServiceIDTokenExpiration":3600,"oidcOPMetaDataJWKS":{},"groups":{},"ext2fActivation":0,"sfRemovedNotifTitle":"Second factor notification","oidcServiceMetaDataUserInfoURI":"userinfo","mail2fActivation":0,"ldapGroupObjectClass":"groupOfNames","webauthn2fUserCanRemoveKey":1,"oidcRPStateTimeout":600,"krbRemoveDomain":1,"autoSigninRules":{},"yubikey2fUserCanRemoveKey":1,"whatToTrace":"_whatToTrace","cspDefault":"'self'","ADPwdMaxAge":0,"issuerDBOpenIDPath":"^/openidserver/","checkHIBPURL":"https://api.pwnedpasswords.com/range/","samlNameIDFormatMapKerberos":"uid","restClockTolerance":15,"samlSPMetaDataOptions":{},"webIDExportedVars":{},"cspFrameAncestors":"","pamService":"login","cfgAuthor":"dwho","customToTrace":"mail","nginxCustomHandlers":{},"authentication":"Choice","persistentStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock","Directory":"/app/dev/sessions/persistents"},"sameSite":"","ldapPasswordResetAttributeValue":"TRUE","passwordPolicyMinLower":0,"key":"qwertyui","ldapVersion":3,"oidcServiceEncAlgorithmEnc":"A256GCM","openIdSreg_email":"mail","singleIP":0,"messageBrokerOptions":{},"ldapVerify":"require","useRedirectAjaxOnUnauthorized":1,"ldapExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"openIdSPList":"0;","samlAuthnContextMapExtra":{},"samlAuthnContextMapKerberos":4,"corsMax_Age":"86400","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","eventQueueName":"llng_events","checkUserDisplayNormalizedHeaders":0,"localSessionStorageOptions":{"cache_depth":3,"cache_root":"/app/dev/sessions/","directory_umask":"007","namespace":"lemonldap-ng-sessions","default_expires_in":600},"rest2fActivation":0,"adaptativeAuthenticationLevelRules":{},"apacheAuthnLevel":3,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","trustedBrowserUseTotp":1,"notification":1,"issuerDBOpenIDConnectPath":"^/oauth2/","SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","useRedirectOnError":1,"ldapIOTimeout":10,"portalCheckLogins":1,"portalDisplayLoginHistory":1,"cspImg":"'self' data:","exportedHeaders":{"manager.llng.localhost":{},"auth.llng.localhost":{},"test2.llng.localhost":{"Auth-User":"$uid"},"test1.llng.localhost":{"Ip-Addr":"$ipAddr","Uri":"$ENV{REQUEST_URI}","Auth-User":"$uid","Base64":"encode_base64('a:b','')","Hello":"hello()","Additional-Arg":"get_additional_arg('header-added')","Macro-Uri":"$UA"}},"restAuthnLevel":2,"impersonationHiddenAttributes":"_2fDevices, _loginHistory","casAccessControlPolicy":"none","linkedInScope":"r_liteprofile r_emailaddress","managerPassword":"","notificationDefaultCond":"","bruteForceProtectionMaxFailed":3,"casAttributes":{},"samlStorageOptions":{},"contextSwitchingStopWithLogout":1,"oidcServiceKeyTypeEnc":"RSA","slaveAuthnLevel":2,"displaySessionId":1,"cspConnect":"'self'","showLanguages":1,"successLoginNumber":5,"multiValuesSeparator":"; ","stayConnected":0,"portalDisplayRegister":1,"customPluginsParams":{},"facebookExportedVars":{},"notificationServerPOST":1,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"lwpSslOpts":{},"oidcServiceDynamicRegistrationExtraClaims":{},"issuersTimeout":120,"samlSPMetaDataXML":null,"mailTimeout":0,"macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"issuerDBSAMLPath":"^/saml/","locationDetectGeoIpLanguages":"en, fr","bruteForceProtectionMaxLockTime":900,"certificateResetByMailValidityDelay":0,"openIdSreg_nickname":"uid","radius2fActivation":0,"ADPwdExpireWarning":0,"checkUserDisplayComputedSession":1,"mailSessionKey":"mail","sfRemovedMsgRule":0,"httpOnly":1,"yubikey2fPublicIDSize":12,"totp2fRange":1,"https":0,"useSafeJail":1,"rest2fInitArgs":{},"oidcServiceNewKeyTypeSig":"RSA","contextSwitchingRule":0,"dbiAuthnLevel":2,"openIdExportedVars":{},"casAppMetaDataExportedVars":{},"gpgDb":"","oidcRPCallbackGetParam":"openidconnectcallback","certificateResetByMailCertificateAttribute":"userCertificate;binary","bruteForceProtectionTempo":30,"notificationWildcard":"allusers","samlRelayStateTimeout":600,"oidcServiceMetaDataJWKSURI":"jwks","portalDisplayRefreshMyRights":1,"findUserWildcard":"*","oidcServiceOldKeyTypeSig":"RSA","impersonationIdRule":1,"samlNameIDFormatMapWindows":"uid","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","globalLogoutTimer":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","findUserControl":"^[*\\w]+$","securedCookie":0,"issuerDBCASPath":"^/cas/","issuerDBJitsiMeetTokensRule":1,"radiusAuthnLevel":3,"decryptValueRule":0,"checkUserDisplayHistory":0,"yubikey2fActivation":0,"captcha_size":6,"openIdAuthnLevel":1,"captcha_login_enabled":0,"passwordPolicyActivation":1,"corsAllow_Headers":"*","passwordResetAllowedRetries":3,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","cfgNum":4,"ldapGroupAttributeNameUser":"dn","cspFont":"'self'","okta2fActivation":0,"portalPingInterval":60000,"sessionDataToRemember":{},"linkedInAuthnLevel":1,"oidcRPMetaDataExportedVars":{},"oidcServiceMetaDataEndSessionURI":"logout","openIdIDPList":"0;","scrollTop":400,"samlMetadataForceUTF8":1,"rememberAuthChoiceRule":0,"customAddParams":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","singleUserByIP":0,"oidcOPMetaDataJSON":{},"portalRequireOldPassword":1,"webauthnAuthnLevel":3,"casAppMetaDataOptions":{},"oidcStorageOptions":{},"cspScript":"'self'","passwordPolicyMinUpper":0,"webauthn2fAttestation":"none","contextSwitchingIdRule":1,"activeTimer":1,"oidcServiceOldKeyTypeEnc":"RSA","facebookAuthnLevel":1,"proxyAuthServiceChoiceParam":"lmAuth","twitterUserField":"screen_name","post":{"manager.llng.localhost":{},"test2.llng.localhost":{},"auth.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"target":"/index.pl","formSelector":"#test","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt"}}},"sfRequired":0,"radiusExportedVars":{},"totp2fInterval":30,"oidcRPMetaDataMacros":null,"rememberDefaultChecked":0,"customFunctions":"My::hello My::get_additional_arg","oidcServiceMetaDataTokenURI":"token","SMTPServer":"","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","totp2fSelfRegistration":1,"lwpOpts":{"timeout":10},"portalDisplayLogout":1,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","samlOrganizationName":"Example","timeoutActivity":0,"issuerDBGetRule":1,"sfExtra":{},"passwordPolicySpecialChar":"__ALL__","ldapGroupAttributeNameGroup":"dn","portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","sfOnlyUpgrade":1,"oidcServiceKeyTypeSig":"RSA","portalErrorOnExpiredSession":1,"proxyAuthnLevel":2,"ldapTimeout":10,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","persistentStorage":"Apache::Session::File","newLocationWarningLocationAttribute":"ipAddr","cookieName":"lemonldap","authChoiceModules":{"2_Test":"Apache;Null;Null;;;{}","1_Demo":"Demo;Demo;Demo;;;{}"},"dbiExportedVars":{},"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","corsAllow_Credentials":"true","notifyDeleted":1,"mail2fCodeRegex":"\\d{6}","SMTPTLS":"","oidcOPMetaDataOptions":{},"issuerDBJitsiMeetTokensPath":"^/jitsi/","portal":"http://auth.llng.localhost:8080/","openIdSreg_timezone":"_timezone","stayConnectedBypassFG":0,"githubUserField":"login","passwordPolicyMinDigit":0,"captchaOptions":{},"singleSession":0,"nullAuthnLevel":0,"cfgLog":"Choice","cfgVersion":"2.19.2","slaveExportedVars":{},"checkUserHiddenHeaders":{},"checkHIBPRequired":1,"checkUserDisplayEmptyValues":0,"ldapPwdEnc":"utf-8","githubScope":"user:email","jitsiExpiration":"300","trustedBrowserRule":1,"crowdsecAction":"reject","pamAuthnLevel":2,"samlSPMetaDataMacros":null,"logoutServices":{},"findUserSearchingAttributes":{},"applicationList":{"0004-cat":{"type":"category","0005-app":{"type":"application","options":{"name":"WebSSO Manager","uri":"http://manager.llng.localhost:8080/manager.html","display":"auto","logo":"configure.png","description":"Configure LemonLDAP::NG WebSSO"}},"0006-app":{"options":{"description":"Explore WebSSO notifications","name":"Notifications Explorer","display":"auto","uri":"http://manager.llng.localhost:8080/notifications.html","logo":"database.png"},"type":"application"},"catname":"Administration","0008-app":{"options":{"description":"Explore WebSSO 2FA sessions","name":"2FA Sessions Explorer","logo":"database.png","display":"auto","uri":"http://manager.llng.localhost:8080/2ndfa.html"},"type":"application"},"0007-app":{"type":"application","options":{"logo":"database.png","display":"auto","uri":"http://manager.llng.localhost:8080/sessions.html","name":"Sessions Explorer","description":"Explore WebSSO sessions"}}},"0008-cat":{"0009-app":{"options":{"description":"Documentation supplied with LemonLDAP::NG","display":"on","uri":"http://manager.llng.localhost:8080/doc/","logo":"help.png","name":"Local documentation"},"type":"application"},"0010-app":{"type":"application","options":{"name":"Official Website","uri":"https://lemonldap-ng.org/","display":"on","logo":"network.png","description":"Official LemonLDAP::NG Website"}},"type":"category","catname":"Documentation"},"0001-cat":{"0003-app":{"type":"application","options":{"description":"The same simple application displaying authenticated user","logo":"thumbnail.png","display":"auto","uri":"http://test2.llng.localhost:8080/","name":"Application Test 2"}},"type":"category","catname":"Sample applications","0002-app":{"options":{"uri":"http://test1.llng.localhost:8080/","display":"auto","logo":"demo.png","name":"Application Test 1","description":"A simple application displaying authenticated user"},"type":"application"}}},"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","portalFavicon":"common/favicon.ico","upgradeSession":1,"globalLogoutRule":0,"checkDevOpsCheckSessionAttributes":1,"oidcServiceDynamicRegistrationExportedVars":{},"samlSPMetaDataExportedAttributes":null,"samlIDPMetaDataXML":{},"samlSPSSODescriptorWantAssertionsSigned":1,"rest2fVerifyArgs":{},"combModules":{},"cfgAuthorIP":"10.0.2.100","samlOrganizationURL":"http://www.example.com","oidcServiceMetaDataIntrospectionURI":"introspect","checkUserIdRule":1,"impersonationMergeSSOgroups":0,"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","issuerDBOpenIDRule":1,"password2fSelfRegistration":0,"oidcServiceMetaDataRegistrationURI":"register","webIDAuthnLevel":1,"impersonationRule":0,"casSrvMetaDataOptions":{},"samlOverrideIDPEntityID":"","grantSessionRules":{},"checkDevOpsDisplayNormalizedHeaders":1,"oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-1":1,"loa-3":3,"loa-2":2,"loa-4":4},"samlIDPMetaDataOptions":{},"stayConnectedTimeout":2592000,"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","oidcAuthnLevel":1,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","linkedInFields":"id,first-name,last-name,email-address","yubikey2fSelfRegistration":0,"cspFormAction":"*","webauthn2fUserVerification":"preferred","krbAuthnLevel":3,"managerDn":"","casStorageOptions":{},"oidcServiceMetaDataFrontChannelURI":"flogout","samlAuthnContextMapPasswordProtectedTransport":3,"requireToken":1,"portalMainLogo":"common/logos/logo_llng_400px.png","cspStyle":"'self'","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","userDB":"Same","rememberCookieTimeout":31536000,"oidcRPMetaDataOptionsExtraClaims":null,"checkUserDisplayPersistentInfo":0,"radius2fRequestAttributes":{},"ldapUsePasswordResetAttribute":1,"portalUserAttr":"_user","findUserExcludingAttributes":{},"issuerDBSAMLRule":1,"casSrvMetaDataExportedVars":{},"oidcServiceAllowAuthorizationCodeFlow":1,"notificationStorage":"File","SSLVarIf":{},"demoExportedVars":{"uid":"uid","cn":"cn","mail":"mail"},"totp2fUserCanRemoveKey":1,"remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"oidcServiceMetaDataBackChannelURI":"blogout","radius2fTimeout":20,"oidcRPMetaDataScopeRules":null,"SSLAuthnLevel":5,"casTicketExpiration":0,"checkDevOpsDownload":1,"twitterAuthnLevel":1,"oidcServiceAccessTokenExpiration":3600,"ldapGroupAttributeName":"member","timeoutActivityInterval":60,"port":-1,"samlNameIDFormatMapEmail":"mail","samlNameIDFormatMapX509":"mail","reloadTimeout":5,"portalAntiFrame":1,"notificationStorageOptions":{"dirName":"/app/dev"},"corsExpose_Headers":"*","newLocationWarningMaxValues":"0","facebookUserField":"id","samlSPSSODescriptorAuthnRequestsSigned":1,"locationRules":{"test1.llng.localhost":{"default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/logout":"logout_sso","^/saml":"unprotect"},"manager.llng.localhost":{"(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"auth.llng.localhost":{"(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","default":"accept","(?#errors)^/lmerror/":"accept"}},"ldapAuthnLevel":2,"certificateResetByMailCeaAttribute":"description","samlOrganizationDisplayName":"Example","passwordPolicyMaxSize":0,"portalForceAuthnInterval":5,"timeout":72000,"oidcServiceMetaDataCheckSessionURI":"checksession.html","webauthn2fActivation":0,"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","jitsiSigningAlg":"RS256","openIdSreg_fullname":"cn","portalSkinRules":{},"samlEntityID":"#PORTAL#/saml/metadata","samlServiceSignatureMethod":"RSA_SHA256","oidcOPMetaDataExportedVars":null,"mailFrom":"noreply at example.com","failedLoginNumber":5,"casAuthnLevel":1,"githubAuthnLevel":1,"issuerDBGetPath":"^/get/","samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"registerDB":"Demo","sfRemovedNotifRef":"RemoveSF","stayConnectedCookieName":"llngconnection","exportedVars":{},"cfgDate":1727794901,"reloadUrls":{},"mailCharset":"utf-8","hideOldPassword":1,"confirmFormMethod":"post","registerTimeout":0,"sfManagerRule":1,"notificationServerSentAttributes":"uid reference date title subtitle text check","impersonationSkipEmptyValues":1,"localSessionStorage":"Cache::FileCache","oidcServiceOfflineSessionExpiration":2592000,"captcha_mail_enabled":1,"linkedInUserField":"emailAddress","checkXSS":1,"password2fActivation":0,"bruteForceProtectionMaxAge":300,"corsAllow_Methods":"POST,GET","passwordPolicyMinSpeChar":0,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","globalStorage":"Apache::Session::File","infoFormMethod":"get","ldapSearchDeref":"find","ext2fCodeActivation":"\\d{6}","ldapGroupAttributeNameSearch":"cn","oidcServiceMetaDataAuthorizeURI":"authorize","oidcRPMetaDataOptions":{},"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","formTimeout":120,"issuerDBOpenIDConnectRule":1,"webauthn2fSelfRegistration":0,"domain":"llng.localhost","oidcServiceAuthorizationCodeExpiration":60,"hiddenAttributes":"_password _2fDevices","redirectFormMethod":"get","samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","portalDisplayGeneratePassword":1,"newLocationWarningLocationDisplayAttribute":"","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","corsAllow_Origin":"*","loginHistoryEnabled":1,"samlAuthnContextMapTLSClient":5,"totp2fAuthnLevel":"4","ldapPasswordResetAttribute":"pwdReset","totp2fEncryptSecret":0,"samlIDPMetaDataExportedAttributes":null,"issuerDBCASRule":1,"vhostOptions":{"test1.llng.localhost":{"vhostComment":"","vhostAliases":"","vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostAuthnLevel":"4","vhostHttps":-1,"vhostType":"Main","vhostMaintenance":0,"vhostAccessToTrace":""},"test2.llng.localhost":{},"manager.llng.localhost":{"vhostMaintenance":0,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostType":"Main","vhostHttps":-1,"vhostPort":-1,"vhostAliases":"","vhostServiceTokenTTL":-1},"auth.llng.localhost":{}},"checkUserDisplayEmptyHeaders":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","authChoiceParam":"lmAuth","globalStorageOptions":{"Directory":"/app/dev/sessions","LockDirectory":"/app/dev/sessions/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256"},"password2fUserCanRemoveKey":1,"ldapServer":"ldap://localhost","passwordDB":"Choice","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","rememberTimer":5,"webauthnAppId":1,"checkUserDisplayHiddenAttributes":0,"stayConnectedSingleSession":0,"portalDisplayAppslist":1,"corsEnabled":1,"SSLVar":"SSL_CLIENT_S_DN_Email","portalSkin":"bootstrap","ldapBase":"dc=example,dc=com","totp2fDigits":6,"rememberCookieName":"llngrememberauthchoice","passwordPolicyMinSize":0,"gpgAuthnLevel":5,"totp2fActivation":1,"captcha_register_enabled":1,"casAppMetaDataMacros":null}
\ No newline at end of file
diff --git a/dev/conf/lmConf-5.json b/dev/conf/lmConf-5.json
deleted file mode 100644
index 1c60b0133..000000000
--- a/dev/conf/lmConf-5.json
+++ /dev/null
@@ -1 +0,0 @@
-{"sfOnlyUpgrade":1,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","portalErrorOnExpiredSession":1,"oidcServiceKeyTypeSig":"RSA","proxyAuthnLevel":2,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","ldapTimeout":10,"newLocationWarningLocationAttribute":"ipAddr","persistentStorage":"Apache::Session::File","cookieName":"lemonldap","authChoiceModules":{"1_Demo":"Demo;Demo;Demo;;1;{}","2_Test":"Apache;Null;Null;;0;{}"},"dbiExportedVars":{},"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","notifyDeleted":1,"corsAllow_Credentials":"true","mail2fCodeRegex":"\\d{6}","SMTPTLS":"","oidcOPMetaDataOptions":{},"issuerDBJitsiMeetTokensPath":"^/jitsi/","portal":"http://auth.llng.localhost:8080/","githubUserField":"login","stayConnectedBypassFG":0,"openIdSreg_timezone":"_timezone","passwordPolicyMinDigit":0,"nullAuthnLevel":0,"singleSession":0,"captchaOptions":{},"cfgLog":"","cfgVersion":"2.19.2","slaveExportedVars":{},"checkUserHiddenHeaders":{},"checkUserDisplayEmptyValues":0,"checkHIBPRequired":1,"ldapPwdEnc":"utf-8","githubScope":"user:email","jitsiExpiration":"300","trustedBrowserRule":1,"crowdsecAction":"reject","pamAuthnLevel":2,"samlSPMetaDataMacros":null,"logoutServices":{},"findUserSearchingAttributes":{},"portalFavicon":"common/favicon.ico","upgradeSession":1,"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","applicationList":{"0004-cat":{"0007-app":{"options":{"description":"Explore WebSSO sessions","name":"Sessions Explorer","uri":"http://manager.llng.localhost:8080/sessions.html","logo":"database.png","display":"auto"},"type":"application"},"0005-app":{"type":"application","options":{"display":"auto","logo":"configure.png","uri":"http://manager.llng.localhost:8080/manager.html","name":"WebSSO Manager","description":"Configure LemonLDAP::NG WebSSO"}},"0008-app":{"options":{"description":"Explore WebSSO 2FA sessions","name":"2FA Sessions Explorer","uri":"http://manager.llng.localhost:8080/2ndfa.html","display":"auto","logo":"database.png"},"type":"application"},"type":"category","0006-app":{"options":{"display":"auto","logo":"database.png","uri":"http://manager.llng.localhost:8080/notifications.html","name":"Notifications Explorer","description":"Explore WebSSO notifications"},"type":"application"},"catname":"Administration"},"0008-cat":{"catname":"Documentation","0010-app":{"type":"application","options":{"description":"Official LemonLDAP::NG Website","uri":"https://lemonldap-ng.org/","logo":"network.png","display":"on","name":"Official Website"}},"type":"category","0009-app":{"type":"application","options":{"description":"Documentation supplied with LemonLDAP::NG","display":"on","logo":"help.png","uri":"http://manager.llng.localhost:8080/doc/","name":"Local documentation"}}},"0001-cat":{"type":"category","0002-app":{"options":{"name":"Application Test 1","logo":"demo.png","uri":"http://test1.llng.localhost:8080/","display":"auto","description":"A simple application displaying authenticated user"},"type":"application"},"catname":"Sample applications","0003-app":{"type":"application","options":{"uri":"http://test2.llng.localhost:8080/","logo":"thumbnail.png","display":"auto","name":"Application Test 2","description":"The same simple application displaying authenticated user"}}}},"globalLogoutRule":0,"checkDevOpsCheckSessionAttributes":1,"samlSPMetaDataExportedAttributes":null,"oidcServiceDynamicRegistrationExportedVars":{},"rest2fVerifyArgs":{},"samlSPSSODescriptorWantAssertionsSigned":1,"samlIDPMetaDataXML":{},"combModules":{},"cfgAuthorIP":"10.0.2.100","samlOrganizationURL":"http://www.example.com","oidcServiceMetaDataIntrospectionURI":"introspect","impersonationMergeSSOgroups":0,"checkUserIdRule":1,"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","issuerDBOpenIDRule":1,"password2fSelfRegistration":0,"oidcServiceMetaDataRegistrationURI":"register","webIDAuthnLevel":1,"impersonationRule":0,"casSrvMetaDataOptions":{},"grantSessionRules":{},"samlOverrideIDPEntityID":"","checkDevOpsDisplayNormalizedHeaders":1,"oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-4":4,"loa-2":2,"loa-1":1,"loa-3":3},"stayConnectedTimeout":2592000,"samlIDPMetaDataOptions":{},"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","linkedInFields":"id,first-name,last-name,email-address","oidcServiceEncAlgorithmAlg":"RSA-OAEP","oidcAuthnLevel":1,"yubikey2fSelfRegistration":0,"krbAuthnLevel":3,"cspFormAction":"*","webauthn2fUserVerification":"preferred","managerDn":"","casStorageOptions":{},"oidcServiceMetaDataFrontChannelURI":"flogout","samlAuthnContextMapPasswordProtectedTransport":3,"requireToken":1,"cspStyle":"'self'","portalMainLogo":"common/logos/logo_llng_400px.png","userDB":"Same","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","rememberCookieTimeout":31536000,"oidcRPMetaDataOptionsExtraClaims":null,"ldapUsePasswordResetAttribute":1,"radius2fRequestAttributes":{},"checkUserDisplayPersistentInfo":0,"portalUserAttr":"_user","findUserExcludingAttributes":{},"issuerDBSAMLRule":1,"casSrvMetaDataExportedVars":{},"oidcServiceAllowAuthorizationCodeFlow":1,"notificationStorage":"File","SSLVarIf":{},"totp2fUserCanRemoveKey":1,"demoExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"radius2fTimeout":20,"oidcServiceMetaDataBackChannelURI":"blogout","remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"oidcRPMetaDataScopeRules":null,"checkDevOpsDownload":1,"casTicketExpiration":0,"SSLAuthnLevel":5,"twitterAuthnLevel":1,"oidcServiceAccessTokenExpiration":3600,"ldapGroupAttributeName":"member","timeoutActivityInterval":60,"samlNameIDFormatMapEmail":"mail","port":-1,"reloadTimeout":5,"samlNameIDFormatMapX509":"mail","portalAntiFrame":1,"notificationStorageOptions":{"dirName":"/app/dev"},"corsExpose_Headers":"*","facebookUserField":"id","samlSPSSODescriptorAuthnRequestsSigned":1,"locationRules":{"test1.llng.localhost":{"default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/logout":"logout_sso","^/saml":"unprotect"},"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"auth.llng.localhost":{"default":"accept","(?#errors)^/lmerror/":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\""},"manager.llng.localhost":{"(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\""}},"newLocationWarningMaxValues":"0","certificateResetByMailCeaAttribute":"description","samlOrganizationDisplayName":"Example","ldapAuthnLevel":2,"portalForceAuthnInterval":5,"passwordPolicyMaxSize":0,"timeout":72000,"webauthn2fActivation":0,"oidcServiceMetaDataCheckSessionURI":"checksession.html","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","jitsiSigningAlg":"RS256","portalSkinRules":{},"openIdSreg_fullname":"cn","samlEntityID":"#PORTAL#/saml/metadata","samlServiceSignatureMethod":"RSA_SHA256","failedLoginNumber":5,"oidcOPMetaDataExportedVars":null,"mailFrom":"noreply at example.com","casAuthnLevel":1,"githubAuthnLevel":1,"issuerDBGetPath":"^/get/","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","registerDB":"Demo","stayConnectedCookieName":"llngconnection","sfRemovedNotifRef":"RemoveSF","exportedVars":{},"cfgDate":1727794971,"reloadUrls":{},"mailCharset":"utf-8","hideOldPassword":1,"sfManagerRule":1,"registerTimeout":0,"confirmFormMethod":"post","impersonationSkipEmptyValues":1,"localSessionStorage":"Cache::FileCache","notificationServerSentAttributes":"uid reference date title subtitle text check","oidcServiceOfflineSessionExpiration":2592000,"captcha_mail_enabled":1,"bruteForceProtectionMaxAge":300,"password2fActivation":0,"linkedInUserField":"emailAddress","checkXSS":1,"corsAllow_Methods":"POST,GET","passwordPolicyMinSpeChar":0,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","globalStorage":"Apache::Session::File","infoFormMethod":"get","ldapSearchDeref":"find","ext2fCodeActivation":"\\d{6}","ldapGroupAttributeNameSearch":"cn","oidcServiceMetaDataAuthorizeURI":"authorize","oidcRPMetaDataOptions":{},"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","formTimeout":120,"webauthn2fSelfRegistration":0,"issuerDBOpenIDConnectRule":1,"domain":"llng.localhost","oidcServiceAuthorizationCodeExpiration":60,"samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","redirectFormMethod":"get","hiddenAttributes":"_password _2fDevices","newLocationWarningLocationDisplayAttribute":"","portalDisplayGeneratePassword":1,"samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","corsAllow_Origin":"*","loginHistoryEnabled":1,"samlAuthnContextMapTLSClient":5,"ldapPasswordResetAttribute":"pwdReset","totp2fEncryptSecret":0,"totp2fAuthnLevel":"4","issuerDBCASRule":1,"samlIDPMetaDataExportedAttributes":null,"vhostOptions":{"test1.llng.localhost":{"vhostMaintenance":0,"vhostAccessToTrace":"","vhostHttps":-1,"vhostType":"Main","vhostPort":-1,"vhostAuthnLevel":"4","vhostComment":"","vhostAliases":"","vhostServiceTokenTTL":-1},"auth.llng.localhost":{},"test2.llng.localhost":{},"manager.llng.localhost":{"vhostType":"Main","vhostHttps":-1,"vhostMaintenance":0,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostServiceTokenTTL":-1,"vhostAliases":"","vhostPort":-1}},"checkUserDisplayEmptyHeaders":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","authChoiceParam":"lmAuth","password2fUserCanRemoveKey":1,"globalStorageOptions":{"Directory":"/app/dev/sessions","LockDirectory":"/app/dev/sessions/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256"},"ldapServer":"ldap://localhost","passwordDB":"Choice","remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","rememberTimer":5,"webauthnAppId":1,"checkUserDisplayHiddenAttributes":0,"portalDisplayAppslist":1,"stayConnectedSingleSession":0,"SSLVar":"SSL_CLIENT_S_DN_Email","corsEnabled":1,"portalSkin":"bootstrap","ldapBase":"dc=example,dc=com","rememberCookieName":"llngrememberauthchoice","totp2fDigits":6,"passwordPolicyMinSize":0,"totp2fActivation":1,"gpgAuthnLevel":5,"captcha_register_enabled":1,"casAppMetaDataMacros":null,"jsRedirect":0,"oidcServiceIDTokenExpiration":3600,"oidcOPMetaDataJWKS":{},"ext2fActivation":0,"sfRemovedNotifTitle":"Second factor notification","groups":{},"oidcServiceMetaDataUserInfoURI":"userinfo","mail2fActivation":0,"ldapGroupObjectClass":"groupOfNames","krbRemoveDomain":1,"oidcRPStateTimeout":600,"webauthn2fUserCanRemoveKey":1,"autoSigninRules":{},"yubikey2fUserCanRemoveKey":1,"whatToTrace":"_whatToTrace","ADPwdMaxAge":0,"cspDefault":"'self'","issuerDBOpenIDPath":"^/openidserver/","samlNameIDFormatMapKerberos":"uid","checkHIBPURL":"https://api.pwnedpasswords.com/range/","restClockTolerance":15,"samlSPMetaDataOptions":{},"webIDExportedVars":{},"cspFrameAncestors":"","pamService":"login","cfgAuthor":"dwho","customToTrace":"mail","nginxCustomHandlers":{},"authentication":"Choice","persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock"},"ldapPasswordResetAttributeValue":"TRUE","sameSite":"","passwordPolicyMinLower":0,"key":"qwertyui","ldapVersion":3,"openIdSreg_email":"mail","oidcServiceEncAlgorithmEnc":"A256GCM","singleIP":0,"messageBrokerOptions":{},"ldapVerify":"require","useRedirectAjaxOnUnauthorized":1,"ldapExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"openIdSPList":"0;","samlAuthnContextMapKerberos":4,"samlAuthnContextMapExtra":{},"corsMax_Age":"86400","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","eventQueueName":"llng_events","checkUserDisplayNormalizedHeaders":0,"localSessionStorageOptions":{"default_expires_in":600,"cache_depth":3,"directory_umask":"007","namespace":"lemonldap-ng-sessions","cache_root":"/app/dev/sessions/"},"rest2fActivation":0,"adaptativeAuthenticationLevelRules":{},"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","apacheAuthnLevel":3,"notification":1,"trustedBrowserUseTotp":1,"issuerDBOpenIDConnectPath":"^/oauth2/","SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","useRedirectOnError":1,"ldapIOTimeout":10,"portalCheckLogins":1,"portalDisplayLoginHistory":1,"cspImg":"'self' data:","exportedHeaders":{"test2.llng.localhost":{"Auth-User":"$uid"},"auth.llng.localhost":{},"manager.llng.localhost":{},"test1.llng.localhost":{"Ip-Addr":"$ipAddr","Uri":"$ENV{REQUEST_URI}","Auth-User":"$uid","Base64":"encode_base64('a:b','')","Hello":"hello()","Additional-Arg":"get_additional_arg('header-added')","Macro-Uri":"$UA"}},"impersonationHiddenAttributes":"_2fDevices, _loginHistory","restAuthnLevel":2,"casAccessControlPolicy":"none","linkedInScope":"r_liteprofile r_emailaddress","managerPassword":"","notificationDefaultCond":"","bruteForceProtectionMaxFailed":3,"casAttributes":{},"samlStorageOptions":{},"contextSwitchingStopWithLogout":1,"oidcServiceKeyTypeEnc":"RSA","slaveAuthnLevel":2,"displaySessionId":1,"cspConnect":"'self'","showLanguages":1,"successLoginNumber":5,"multiValuesSeparator":"; ","customPluginsParams":{},"facebookExportedVars":{},"portalDisplayRegister":1,"stayConnected":0,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"notificationServerPOST":1,"lwpSslOpts":{},"oidcServiceDynamicRegistrationExtraClaims":{},"mailTimeout":0,"samlSPMetaDataXML":null,"issuersTimeout":120,"issuerDBSAMLPath":"^/saml/","macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"locationDetectGeoIpLanguages":"en, fr","bruteForceProtectionMaxLockTime":900,"certificateResetByMailValidityDelay":0,"openIdSreg_nickname":"uid","radius2fActivation":0,"ADPwdExpireWarning":0,"mailSessionKey":"mail","checkUserDisplayComputedSession":1,"yubikey2fPublicIDSize":12,"sfRemovedMsgRule":0,"httpOnly":1,"https":0,"totp2fRange":1,"useSafeJail":1,"rest2fInitArgs":{},"oidcServiceNewKeyTypeSig":"RSA","contextSwitchingRule":0,"dbiAuthnLevel":2,"openIdExportedVars":{},"casAppMetaDataExportedVars":{},"gpgDb":"","oidcRPCallbackGetParam":"openidconnectcallback","certificateResetByMailCertificateAttribute":"userCertificate;binary","bruteForceProtectionTempo":30,"notificationWildcard":"allusers","samlRelayStateTimeout":600,"oidcServiceMetaDataJWKSURI":"jwks","portalDisplayRefreshMyRights":1,"findUserWildcard":"*","oidcServiceOldKeyTypeSig":"RSA","impersonationIdRule":1,"samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","samlNameIDFormatMapWindows":"uid","globalLogoutTimer":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","findUserControl":"^[*\\w]+$","securedCookie":0,"issuerDBJitsiMeetTokensRule":1,"issuerDBCASPath":"^/cas/","radiusAuthnLevel":3,"decryptValueRule":0,"checkUserDisplayHistory":0,"captcha_size":6,"yubikey2fActivation":0,"captcha_login_enabled":0,"openIdAuthnLevel":1,"corsAllow_Headers":"*","passwordPolicyActivation":1,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","passwordResetAllowedRetries":3,"ldapGroupAttributeNameUser":"dn","cfgNum":5,"cspFont":"'self'","portalPingInterval":60000,"okta2fActivation":0,"sessionDataToRemember":{},"oidcRPMetaDataExportedVars":{},"linkedInAuthnLevel":1,"oidcServiceMetaDataEndSessionURI":"logout","openIdIDPList":"0;","scrollTop":400,"samlMetadataForceUTF8":1,"rememberAuthChoiceRule":0,"customAddParams":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","singleUserByIP":0,"oidcOPMetaDataJSON":{},"portalRequireOldPassword":1,"oidcStorageOptions":{},"casAppMetaDataOptions":{},"webauthnAuthnLevel":3,"cspScript":"'self'","passwordPolicyMinUpper":0,"webauthn2fAttestation":"none","contextSwitchingIdRule":1,"activeTimer":1,"facebookAuthnLevel":1,"proxyAuthServiceChoiceParam":"lmAuth","oidcServiceOldKeyTypeEnc":"RSA","twitterUserField":"screen_name","post":{"auth.llng.localhost":{},"test2.llng.localhost":{},"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"target":"/index.pl","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","buttonSelector":"#bt","formSelector":"#test"}}},"sfRequired":0,"radiusExportedVars":{},"totp2fInterval":30,"oidcRPMetaDataMacros":null,"customFunctions":"My::hello My::get_additional_arg","rememberDefaultChecked":0,"oidcServiceMetaDataTokenURI":"token","SMTPServer":"","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","portalDisplayLogout":1,"lwpOpts":{"timeout":10},"totp2fSelfRegistration":1,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","samlOrganizationName":"Example","timeoutActivity":0,"sfExtra":{},"issuerDBGetRule":1,"passwordPolicySpecialChar":"__ALL__","ldapGroupAttributeNameGroup":"dn"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-6.json b/dev/conf/lmConf-6.json
deleted file mode 100644
index 3c79664ab..000000000
--- a/dev/conf/lmConf-6.json
+++ /dev/null
@@ -1 +0,0 @@
-{"persistentStorage":"Apache::Session::File","newLocationWarningLocationAttribute":"ipAddr","cookieName":"lemonldap","ldapTimeout":10,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","proxyAuthnLevel":2,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","sfOnlyUpgrade":1,"oidcServiceKeyTypeSig":"RSA","portalErrorOnExpiredSession":1,"portal":"http://auth.llng.localhost:8080/","SMTPTLS":"","oidcOPMetaDataOptions":{},"issuerDBJitsiMeetTokensPath":"^/jitsi/","notifyDeleted":1,"corsAllow_Credentials":"true","mail2fCodeRegex":"\\d{6}","authChoiceModules":{"2_Github":"GitHub;Null;Null;;1;{}","1_Demo":"Demo;Demo;Demo;;0;{}"},"dbiExportedVars":{},"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","cfgVersion":"2.19.2","slaveExportedVars":{},"captchaOptions":{},"singleSession":0,"nullAuthnLevel":0,"cfgLog":"","stayConnectedBypassFG":0,"openIdSreg_timezone":"_timezone","githubUserField":"login","passwordPolicyMinDigit":0,"samlSPMetaDataMacros":null,"logoutServices":{},"findUserSearchingAttributes":{},"trustedBrowserRule":1,"jitsiExpiration":"300","crowdsecAction":"reject","pamAuthnLevel":2,"checkHIBPRequired":1,"checkUserDisplayEmptyValues":0,"ldapPwdEnc":"utf-8","githubScope":"user:email","checkUserHiddenHeaders":{},"oidcServiceMetaDataIntrospectionURI":"introspect","checkUserIdRule":1,"impersonationMergeSSOgroups":0,"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","samlIDPMetaDataXML":{},"samlSPSSODescriptorWantAssertionsSigned":1,"rest2fVerifyArgs":{},"combModules":{},"cfgAuthorIP":"10.0.2.100","samlOrganizationURL":"http://www.example.com","oidcServiceDynamicRegistrationExportedVars":{},"samlSPMetaDataExportedAttributes":null,"applicationList":{"0001-cat":{"0003-app":{"options":{"description":"The same simple application displaying authenticated user","logo":"thumbnail.png","display":"auto","uri":"http://test2.llng.localhost:8080/","name":"Application Test 2"},"type":"application"},"type":"category","0002-app":{"type":"application","options":{"description":"A simple application displaying authenticated user","name":"Application Test 1","display":"auto","uri":"http://test1.llng.localhost:8080/","logo":"demo.png"}},"catname":"Sample applications"},"0008-cat":{"type":"category","0009-app":{"options":{"description":"Documentation supplied with LemonLDAP::NG","uri":"http://manager.llng.localhost:8080/doc/","display":"on","logo":"help.png","name":"Local documentation"},"type":"application"},"0010-app":{"options":{"name":"Official Website","uri":"https://lemonldap-ng.org/","display":"on","logo":"network.png","description":"Official LemonLDAP::NG Website"},"type":"application"},"catname":"Documentation"},"0004-cat":{"0008-app":{"type":"application","options":{"description":"Explore WebSSO 2FA sessions","name":"2FA Sessions Explorer","logo":"database.png","uri":"http://manager.llng.localhost:8080/2ndfa.html","display":"auto"}},"0006-app":{"type":"application","options":{"description":"Explore WebSSO notifications","logo":"database.png","uri":"http://manager.llng.localhost:8080/notifications.html","display":"auto","name":"Notifications Explorer"}},"catname":"Administration","0007-app":{"type":"application","options":{"uri":"http://manager.llng.localhost:8080/sessions.html","display":"auto","logo":"database.png","name":"Sessions Explorer","description":"Explore WebSSO sessions"}},"type":"category","0005-app":{"options":{"description":"Configure LemonLDAP::NG WebSSO","name":"WebSSO Manager","logo":"configure.png","uri":"http://manager.llng.localhost:8080/manager.html","display":"auto"},"type":"application"}}},"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","upgradeSession":1,"portalFavicon":"common/favicon.ico","checkDevOpsCheckSessionAttributes":1,"globalLogoutRule":0,"samlOverrideIDPEntityID":"","grantSessionRules":{},"checkDevOpsDisplayNormalizedHeaders":1,"webIDAuthnLevel":1,"impersonationRule":0,"casSrvMetaDataOptions":{},"oidcServiceMetaDataRegistrationURI":"register","issuerDBOpenIDRule":1,"password2fSelfRegistration":0,"samlAuthnContextMapPasswordProtectedTransport":3,"requireToken":1,"portalMainLogo":"common/logos/logo_llng_400px.png","cspStyle":"'self'","managerDn":"","casStorageOptions":{},"oidcServiceMetaDataFrontChannelURI":"flogout","oidcServiceEncAlgorithmAlg":"RSA-OAEP","oidcAuthnLevel":1,"linkedInFields":"id,first-name,last-name,email-address","yubikey2fSelfRegistration":0,"cspFormAction":"*","webauthn2fUserVerification":"preferred","krbAuthnLevel":3,"oidcServiceMetaDataAuthnContext":{"loa-3":3,"loa-1":1,"loa-2":2,"loa-4":4,"loa-5":5},"stayConnectedTimeout":2592000,"samlIDPMetaDataOptions":{},"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","casSrvMetaDataExportedVars":{},"oidcServiceAllowAuthorizationCodeFlow":1,"notificationStorage":"File","SSLVarIf":{},"checkUserDisplayPersistentInfo":0,"radius2fRequestAttributes":{},"ldapUsePasswordResetAttribute":1,"portalUserAttr":"_user","issuerDBSAMLRule":1,"findUserExcludingAttributes":{},"oidcRPMetaDataOptionsExtraClaims":null,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","userDB":"Same","rememberCookieTimeout":31536000,"samlNameIDFormatMapX509":"mail","reloadTimeout":5,"portalAntiFrame":1,"notificationStorageOptions":{"dirName":"/app/dev"},"ldapGroupAttributeName":"member","oidcServiceAccessTokenExpiration":3600,"twitterAuthnLevel":1,"timeoutActivityInterval":60,"port":-1,"samlNameIDFormatMapEmail":"mail","SSLAuthnLevel":5,"casTicketExpiration":0,"checkDevOpsDownload":1,"demoExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"totp2fUserCanRemoveKey":1,"remoteGlobalStorageOptions":{"ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","proxy":"http://auth.example.com/sessions"},"oidcServiceMetaDataBackChannelURI":"blogout","radius2fTimeout":20,"oidcRPMetaDataScopeRules":null,"openIdSreg_fullname":"cn","portalSkinRules":{},"samlEntityID":"#PORTAL#/saml/metadata","samlServiceSignatureMethod":"RSA_SHA256","failedLoginNumber":5,"oidcOPMetaDataExportedVars":null,"mailFrom":"noreply at example.com","timeout":72000,"oidcServiceMetaDataCheckSessionURI":"checksession.html","webauthn2fActivation":0,"samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","jitsiSigningAlg":"RS256","ldapAuthnLevel":2,"samlOrganizationDisplayName":"Example","certificateResetByMailCeaAttribute":"description","portalForceAuthnInterval":5,"passwordPolicyMaxSize":0,"corsExpose_Headers":"*","newLocationWarningMaxValues":"0","samlSPSSODescriptorAuthnRequestsSigned":1,"facebookUserField":"id","locationRules":{"manager.llng.localhost":{"(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\""},"test2.llng.localhost":{"default":"accept","^/logout":"logout_sso"},"auth.llng.localhost":{"(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","default":"accept","(?#errors)^/lmerror/":"accept"},"test1.llng.localhost":{"^/saml":"unprotect","^/logout":"logout_sso","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","default":"accept"}},"sfRemovedNotifRef":"RemoveSF","stayConnectedCookieName":"llngconnection","exportedVars":{},"cfgDate":1727795183,"reloadUrls":{},"issuerDBGetPath":"^/get/","samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"registerDB":"Demo","casAuthnLevel":1,"githubAuthnLevel":1,"corsAllow_Methods":"POST,GET","passwordPolicyMinSpeChar":0,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","checkXSS":1,"linkedInUserField":"emailAddress","bruteForceProtectionMaxAge":300,"password2fActivation":0,"confirmFormMethod":"post","sfManagerRule":1,"registerTimeout":0,"notificationServerSentAttributes":"uid reference date title subtitle text check","localSessionStorage":"Cache::FileCache","impersonationSkipEmptyValues":1,"captcha_mail_enabled":1,"oidcServiceOfflineSessionExpiration":2592000,"mailCharset":"utf-8","hideOldPassword":1,"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcRPMetaDataOptions":{},"ext2fCodeActivation":"\\d{6}","ldapGroupAttributeNameSearch":"cn","oidcServiceMetaDataAuthorizeURI":"authorize","globalStorage":"Apache::Session::File","infoFormMethod":"get","ldapSearchDeref":"find","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","corsAllow_Origin":"*","portalDisplayGeneratePassword":1,"newLocationWarningLocationDisplayAttribute":"","domain":"llng.localhost","oidcServiceAuthorizationCodeExpiration":60,"hiddenAttributes":"_password _2fDevices","redirectFormMethod":"get","samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","formTimeout":120,"issuerDBOpenIDConnectRule":1,"webauthn2fSelfRegistration":0,"authChoiceParam":"lmAuth","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock","Directory":"/app/dev/sessions"},"password2fUserCanRemoveKey":1,"vhostOptions":{"test1.llng.localhost":{"vhostAccessToTrace":"","vhostMaintenance":0,"vhostType":"Main","vhostHttps":-1,"vhostAuthnLevel":"4","vhostPort":-1,"vhostServiceTokenTTL":-1,"vhostAliases":"","vhostComment":""},"manager.llng.localhost":{"vhostAliases":"","vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostHttps":-1,"vhostType":"Main","vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostMaintenance":0},"test2.llng.localhost":{},"auth.llng.localhost":{}},"checkUserDisplayEmptyHeaders":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","samlIDPMetaDataExportedAttributes":null,"issuerDBCASRule":1,"loginHistoryEnabled":1,"samlAuthnContextMapTLSClient":5,"totp2fEncryptSecret":0,"ldapPasswordResetAttribute":"pwdReset","totp2fAuthnLevel":"4","gpgAuthnLevel":5,"totp2fActivation":1,"captcha_register_enabled":1,"casAppMetaDataMacros":null,"ldapBase":"dc=example,dc=com","totp2fDigits":6,"rememberCookieName":"llngrememberauthchoice","passwordPolicyMinSize":0,"checkUserDisplayHiddenAttributes":0,"stayConnectedSingleSession":0,"portalDisplayAppslist":1,"corsEnabled":1,"SSLVar":"SSL_CLIENT_S_DN_Email","portalSkin":"bootstrap","ldapServer":"ldap://localhost","passwordDB":"Choice","webauthnAppId":1,"remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","githubClientID":"cd5857b36056d0bf968b","rememberTimer":5,"mail2fActivation":0,"ldapGroupObjectClass":"groupOfNames","webauthn2fUserCanRemoveKey":1,"oidcRPStateTimeout":600,"krbRemoveDomain":1,"autoSigninRules":{},"whatToTrace":"_whatToTrace","yubikey2fUserCanRemoveKey":1,"oidcOPMetaDataJWKS":{},"groups":{},"sfRemovedNotifTitle":"Second factor notification","ext2fActivation":0,"oidcServiceMetaDataUserInfoURI":"userinfo","oidcServiceIDTokenExpiration":3600,"jsRedirect":0,"cspFrameAncestors":"","pamService":"login","samlSPMetaDataOptions":{},"webIDExportedVars":{},"checkHIBPURL":"https://api.pwnedpasswords.com/range/","samlNameIDFormatMapKerberos":"uid","restClockTolerance":15,"cspDefault":"'self'","ADPwdMaxAge":0,"issuerDBOpenIDPath":"^/openidserver/","ldapVersion":3,"githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","oidcServiceEncAlgorithmEnc":"A256GCM","openIdSreg_email":"mail","passwordPolicyMinLower":0,"key":"qwertyui","authentication":"Choice","nginxCustomHandlers":{},"persistentStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock","Directory":"/app/dev/sessions/persistents"},"sameSite":"","ldapPasswordResetAttributeValue":"TRUE","cfgAuthor":"dwho","customToTrace":"mail","openIdSPList":"0;","useRedirectAjaxOnUnauthorized":1,"ldapExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"ldapVerify":"require","singleIP":0,"messageBrokerOptions":{},"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","apacheAuthnLevel":3,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","trustedBrowserUseTotp":1,"notification":1,"issuerDBOpenIDConnectPath":"^/oauth2/","checkUserDisplayNormalizedHeaders":0,"localSessionStorageOptions":{"cache_depth":3,"directory_umask":"007","namespace":"lemonldap-ng-sessions","cache_root":"/app/dev/sessions/","default_expires_in":600},"rest2fActivation":0,"adaptativeAuthenticationLevelRules":{},"corsMax_Age":"86400","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","eventQueueName":"llng_events","samlAuthnContextMapExtra":{},"samlAuthnContextMapKerberos":4,"managerPassword":"","notificationDefaultCond":"","restAuthnLevel":2,"impersonationHiddenAttributes":"_2fDevices, _loginHistory","casAccessControlPolicy":"none","linkedInScope":"r_liteprofile r_emailaddress","portalCheckLogins":1,"portalDisplayLoginHistory":1,"cspImg":"'self' data:","exportedHeaders":{"test1.llng.localhost":{"Base64":"encode_base64('a:b','')","Hello":"hello()","Auth-User":"$uid","Uri":"$ENV{REQUEST_URI}","Ip-Addr":"$ipAddr","Macro-Uri":"$UA","Additional-Arg":"get_additional_arg('header-added')"},"test2.llng.localhost":{"Auth-User":"$uid"},"manager.llng.localhost":{},"auth.llng.localhost":{}},"SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","useRedirectOnError":1,"ldapIOTimeout":10,"cspConnect":"'self'","showLanguages":1,"successLoginNumber":5,"slaveAuthnLevel":2,"displaySessionId":1,"contextSwitchingStopWithLogout":1,"oidcServiceKeyTypeEnc":"RSA","bruteForceProtectionMaxFailed":3,"casAttributes":{},"samlStorageOptions":{},"oidcServiceDynamicRegistrationExtraClaims":{},"notificationServerPOST":1,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"lwpSslOpts":{},"multiValuesSeparator":"; ","stayConnected":0,"portalDisplayRegister":1,"facebookExportedVars":{},"customPluginsParams":{},"sfRemovedMsgRule":0,"httpOnly":1,"yubikey2fPublicIDSize":12,"https":0,"totp2fRange":1,"ADPwdExpireWarning":0,"checkUserDisplayComputedSession":1,"mailSessionKey":"mail","certificateResetByMailValidityDelay":0,"openIdSreg_nickname":"uid","radius2fActivation":0,"issuersTimeout":120,"samlSPMetaDataXML":null,"mailTimeout":0,"macros":{"_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\"","UA":"$ENV{HTTP_USER_AGENT}"},"locationDetectGeoIpLanguages":"en, fr","issuerDBSAMLPath":"^/saml/","bruteForceProtectionMaxLockTime":900,"oidcRPCallbackGetParam":"openidconnectcallback","casAppMetaDataExportedVars":{},"gpgDb":"","oidcServiceNewKeyTypeSig":"RSA","contextSwitchingRule":0,"dbiAuthnLevel":2,"openIdExportedVars":{},"useSafeJail":1,"rest2fInitArgs":{},"oidcServiceMetaDataJWKSURI":"jwks","portalDisplayRefreshMyRights":1,"bruteForceProtectionTempo":30,"notificationWildcard":"allusers","samlRelayStateTimeout":600,"certificateResetByMailCertificateAttribute":"userCertificate;binary","securedCookie":0,"issuerDBCASPath":"^/cas/","issuerDBJitsiMeetTokensRule":1,"radiusAuthnLevel":3,"globalLogoutTimer":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","findUserControl":"^[*\\w]+$","impersonationIdRule":1,"samlNameIDFormatMapWindows":"uid","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","findUserWildcard":"*","oidcServiceOldKeyTypeSig":"RSA","oidcRPMetaDataExportedVars":{},"linkedInAuthnLevel":1,"oidcServiceMetaDataEndSessionURI":"logout","okta2fActivation":0,"portalPingInterval":60000,"sessionDataToRemember":{},"passwordResetAllowedRetries":3,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","ldapGroupAttributeNameUser":"dn","cfgNum":6,"cspFont":"'self'","decryptValueRule":0,"checkUserDisplayHistory":0,"yubikey2fActivation":0,"captcha_size":6,"openIdAuthnLevel":1,"captcha_login_enabled":0,"passwordPolicyActivation":1,"corsAllow_Headers":"*","cspScript":"'self'","passwordPolicyMinUpper":0,"contextSwitchingIdRule":1,"webauthn2fAttestation":"none","portalRequireOldPassword":1,"webauthnAuthnLevel":3,"casAppMetaDataOptions":{},"oidcStorageOptions":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","customAddParams":{},"singleUserByIP":0,"oidcOPMetaDataJSON":{},"openIdIDPList":"0;","scrollTop":400,"samlMetadataForceUTF8":1,"rememberAuthChoiceRule":0,"totp2fInterval":30,"oidcRPMetaDataMacros":null,"post":{"auth.llng.localhost":{},"manager.llng.localhost":{},"test2.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"target":"/index.pl","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt","formSelector":"#test"}}},"sfRequired":0,"radiusExportedVars":{},"oidcServiceOldKeyTypeEnc":"RSA","proxyAuthServiceChoiceParam":"lmAuth","facebookAuthnLevel":1,"twitterUserField":"screen_name","activeTimer":1,"timeoutActivity":0,"sfExtra":{},"passwordPolicySpecialChar":"__ALL__","issuerDBGetRule":1,"ldapGroupAttributeNameGroup":"dn","totp2fSelfRegistration":1,"lwpOpts":{"timeout":10},"portalDisplayLogout":1,"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","samlOrganizationName":"Example","oidcServiceMetaDataTokenURI":"token","SMTPServer":"","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","rememberDefaultChecked":0,"customFunctions":"My::hello My::get_additional_arg"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-7.json b/dev/conf/lmConf-7.json
deleted file mode 100644
index 18a88928c..000000000
--- a/dev/conf/lmConf-7.json
+++ /dev/null
@@ -1 +0,0 @@
-{"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","sfOnlyUpgrade":1,"oidcServiceKeyTypeSig":"RSA","portalErrorOnExpiredSession":1,"proxyAuthnLevel":2,"ldapTimeout":10,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","persistentStorage":"Apache::Session::File","newLocationWarningLocationAttribute":"ipAddr","cookieName":"lemonldap","dbiExportedVars":{},"authChoiceModules":{"1_Demo":"Demo;Demo;Demo;;1;{}","2_Github":"GitHub;Null;Null;;1;{}"},"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","corsAllow_Credentials":"true","notifyDeleted":1,"mail2fCodeRegex":"\\d{6}","SMTPTLS":"","issuerDBJitsiMeetTokensPath":"^/jitsi/","oidcOPMetaDataOptions":{},"portal":"http://auth.llng.localhost:8080/","openIdSreg_timezone":"_timezone","stayConnectedBypassFG":0,"githubUserField":"login","passwordPolicyMinDigit":0,"captchaOptions":{},"singleSession":0,"nullAuthnLevel":0,"cfgLog":"","cfgVersion":"2.19.2","slaveExportedVars":{},"checkUserHiddenHeaders":{},"ldapPwdEnc":"utf-8","checkHIBPRequired":1,"checkUserDisplayEmptyValues":0,"githubScope":"user:email","crowdsecAction":"reject","jitsiExpiration":"300","trustedBrowserRule":1,"pamAuthnLevel":2,"samlSPMetaDataMacros":null,"findUserSearchingAttributes":{},"logoutServices":{},"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","applicationList":{"0004-cat":{"0008-app":{"options":{"name":"2FA Sessions Explorer","display":"auto","uri":"http://manager.llng.localhost:8080/2ndfa.html","logo":"database.png","description":"Explore WebSSO 2FA sessions"},"type":"application"},"type":"category","catname":"Administration","0006-app":{"type":"application","options":{"name":"Notifications Explorer","display":"auto","logo":"database.png","uri":"http://manager.llng.localhost:8080/notifications.html","description":"Explore WebSSO notifications"}},"0007-app":{"type":"application","options":{"description":"Explore WebSSO sessions","uri":"http://manager.llng.localhost:8080/sessions.html","logo":"database.png","display":"auto","name":"Sessions Explorer"}},"0005-app":{"options":{"name":"WebSSO Manager","uri":"http://manager.llng.localhost:8080/manager.html","display":"auto","logo":"configure.png","description":"Configure LemonLDAP::NG WebSSO"},"type":"application"}},"0008-cat":{"catname":"Documentation","0010-app":{"type":"application","options":{"description":"Official LemonLDAP::NG Website","logo":"network.png","display":"on","uri":"https://lemonldap-ng.org/","name":"Official Website"}},"type":"category","0009-app":{"type":"application","options":{"description":"Documentation supplied with LemonLDAP::NG","uri":"http://manager.llng.localhost:8080/doc/","logo":"help.png","display":"on","name":"Local documentation"}}},"0001-cat":{"0003-app":{"type":"application","options":{"name":"Application Test 2","uri":"http://test2.llng.localhost:8080/","logo":"thumbnail.png","display":"auto","description":"The same simple application displaying authenticated user"}},"type":"category","0002-app":{"type":"application","options":{"logo":"demo.png","display":"auto","uri":"http://test1.llng.localhost:8080/","name":"Application Test 1","description":"A simple application displaying authenticated user"}},"catname":"Sample applications"}},"portalFavicon":"common/favicon.ico","upgradeSession":1,"globalLogoutRule":0,"checkDevOpsCheckSessionAttributes":1,"oidcServiceDynamicRegistrationExportedVars":{},"samlSPMetaDataExportedAttributes":null,"combModules":{},"samlIDPMetaDataXML":{},"rest2fVerifyArgs":{},"samlSPSSODescriptorWantAssertionsSigned":1,"samlOrganizationURL":"http://www.example.com","cfgAuthorIP":"10.0.2.100","checkUserIdRule":1,"impersonationMergeSSOgroups":0,"oidcServiceMetaDataIntrospectionURI":"introspect","sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","issuerDBOpenIDRule":1,"password2fSelfRegistration":0,"oidcServiceMetaDataRegistrationURI":"register","impersonationRule":0,"webIDAuthnLevel":1,"casSrvMetaDataOptions":{},"checkDevOpsDisplayNormalizedHeaders":1,"samlOverrideIDPEntityID":"","grantSessionRules":{},"stayConnectedTimeout":2592000,"samlIDPMetaDataOptions":{},"oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-1":1,"loa-3":3,"loa-4":4,"loa-2":2},"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","yubikey2fSelfRegistration":0,"oidcAuthnLevel":1,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","linkedInFields":"id,first-name,last-name,email-address","webauthn2fUserVerification":"preferred","cspFormAction":"*","krbAuthnLevel":3,"managerDn":"","oidcServiceMetaDataFrontChannelURI":"flogout","casStorageOptions":{},"requireToken":1,"samlAuthnContextMapPasswordProtectedTransport":3,"portalMainLogo":"common/logos/logo_llng_400px.png","cspStyle":"'self'","bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","userDB":"Same","rememberCookieTimeout":31536000,"oidcRPMetaDataOptionsExtraClaims":null,"portalUserAttr":"_user","radius2fRequestAttributes":{},"checkUserDisplayPersistentInfo":0,"ldapUsePasswordResetAttribute":1,"issuerDBSAMLRule":1,"findUserExcludingAttributes":{},"notificationStorage":"File","oidcServiceAllowAuthorizationCodeFlow":1,"casSrvMetaDataExportedVars":{},"SSLVarIf":{},"demoExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"totp2fUserCanRemoveKey":1,"oidcRPMetaDataScopeRules":null,"remoteGlobalStorageOptions":{"ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","proxy":"http://auth.example.com/sessions"},"oidcServiceMetaDataBackChannelURI":"blogout","radius2fTimeout":20,"SSLAuthnLevel":5,"casTicketExpiration":0,"checkDevOpsDownload":1,"timeoutActivityInterval":60,"oidcServiceAccessTokenExpiration":3600,"twitterAuthnLevel":1,"ldapGroupAttributeName":"member","samlNameIDFormatMapEmail":"mail","port":-1,"portalAntiFrame":1,"samlNameIDFormatMapX509":"mail","reloadTimeout":5,"notificationStorageOptions":{"dirName":"/app/dev"},"corsExpose_Headers":"*","newLocationWarningMaxValues":"0","samlSPSSODescriptorAuthnRequestsSigned":1,"facebookUserField":"id","locationRules":{"test1.llng.localhost":{"default":"accept","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","^/logout":"logout_sso","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/saml":"unprotect"},"manager.llng.localhost":{"(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\""},"auth.llng.localhost":{"(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\"","default":"accept","(?#errors)^/lmerror/":"accept"},"test2.llng.localhost":{"default":"accept","^/logout":"logout_sso"}},"ldapAuthnLevel":2,"certificateResetByMailCeaAttribute":"description","samlOrganizationDisplayName":"Example","passwordPolicyMaxSize":0,"portalForceAuthnInterval":5,"oidcServiceMetaDataCheckSessionURI":"checksession.html","webauthn2fActivation":0,"timeout":72000,"jitsiSigningAlg":"RS256","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","samlEntityID":"#PORTAL#/saml/metadata","openIdSreg_fullname":"cn","portalSkinRules":{},"oidcOPMetaDataExportedVars":null,"mailFrom":"noreply at example.com","failedLoginNumber":5,"samlServiceSignatureMethod":"RSA_SHA256","githubAuthnLevel":1,"casAuthnLevel":1,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"issuerDBGetPath":"^/get/","registerDB":"Demo","exportedVars":{},"sfRemovedNotifRef":"RemoveSF","stayConnectedCookieName":"llngconnection","reloadUrls":{},"cfgDate":1727796418,"mailCharset":"utf-8","hideOldPassword":1,"confirmFormMethod":"post","registerTimeout":0,"sfManagerRule":1,"captcha_mail_enabled":1,"oidcServiceOfflineSessionExpiration":2592000,"notificationServerSentAttributes":"uid reference date title subtitle text check","localSessionStorage":"Cache::FileCache","impersonationSkipEmptyValues":1,"checkXSS":1,"linkedInUserField":"emailAddress","password2fActivation":0,"bruteForceProtectionMaxAge":300,"corsAllow_Methods":"POST,GET","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","passwordPolicyMinSpeChar":0,"infoFormMethod":"get","globalStorage":"Apache::Session::File","ldapSearchDeref":"find","ldapGroupAttributeNameSearch":"cn","ext2fCodeActivation":"\\d{6}","oidcServiceMetaDataAuthorizeURI":"authorize","oidcRPMetaDataOptions":{},"samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","formTimeout":120,"issuerDBOpenIDConnectRule":1,"webauthn2fSelfRegistration":0,"oidcServiceAuthorizationCodeExpiration":60,"domain":"llng.localhost","redirectFormMethod":"get","hiddenAttributes":"_password _2fDevices","samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","portalDisplayGeneratePassword":1,"newLocationWarningLocationDisplayAttribute":"","corsAllow_Origin":"*","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","loginHistoryEnabled":1,"totp2fAuthnLevel":"4","ldapPasswordResetAttribute":"pwdReset","totp2fEncryptSecret":0,"samlAuthnContextMapTLSClient":5,"samlIDPMetaDataExportedAttributes":null,"issuerDBCASRule":1,"checkUserDisplayEmptyHeaders":0,"vhostOptions":{"test1.llng.localhost":{"vhostType":"Main","vhostHttps":-1,"vhostAccessToTrace":"","vhostMaintenance":0,"vhostServiceTokenTTL":-1,"vhostAliases":"","vhostComment":"","vhostAuthnLevel":"4","vhostPort":-1},"manager.llng.localhost":{"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostMaintenance":0,"vhostType":"Main","vhostHttps":-1,"vhostPort":-1,"vhostAliases":"","vhostServiceTokenTTL":-1},"auth.llng.localhost":{},"test2.llng.localhost":{}},"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock","Directory":"/app/dev/sessions"},"password2fUserCanRemoveKey":1,"authChoiceParam":"lmAuth","passwordDB":"Choice","ldapServer":"ldap://localhost","githubClientID":"cd5857b36056d0bf968b","webauthnAppId":1,"remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","rememberTimer":0,"stayConnectedSingleSession":0,"portalDisplayAppslist":1,"checkUserDisplayHiddenAttributes":0,"portalSkin":"bootstrap","corsEnabled":1,"SSLVar":"SSL_CLIENT_S_DN_Email","ldapBase":"dc=example,dc=com","passwordPolicyMinSize":0,"totp2fDigits":6,"rememberCookieName":"llngrememberauthchoice","gpgAuthnLevel":5,"totp2fActivation":1,"casAppMetaDataMacros":null,"captcha_register_enabled":1,"jsRedirect":0,"oidcServiceIDTokenExpiration":3600,"oidcOPMetaDataJWKS":{},"oidcServiceMetaDataUserInfoURI":"userinfo","groups":{},"ext2fActivation":0,"sfRemovedNotifTitle":"Second factor notification","webauthn2fUserCanRemoveKey":1,"oidcRPStateTimeout":600,"krbRemoveDomain":1,"ldapGroupObjectClass":"groupOfNames","mail2fActivation":0,"whatToTrace":"_whatToTrace","yubikey2fUserCanRemoveKey":1,"autoSigninRules":{},"cspDefault":"'self'","ADPwdMaxAge":0,"issuerDBOpenIDPath":"^/openidserver/","checkHIBPURL":"https://api.pwnedpasswords.com/range/","samlNameIDFormatMapKerberos":"uid","restClockTolerance":15,"samlSPMetaDataOptions":{},"webIDExportedVars":{},"pamService":"login","cspFrameAncestors":"","customToTrace":"mail","cfgAuthor":"dwho","persistentStorageOptions":{"Directory":"/app/dev/sessions/persistents","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock"},"nginxCustomHandlers":{},"authentication":"Choice","sameSite":"","ldapPasswordResetAttributeValue":"TRUE","key":"qwertyui","passwordPolicyMinLower":0,"oidcServiceEncAlgorithmEnc":"A256GCM","githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","openIdSreg_email":"mail","ldapVersion":3,"messageBrokerOptions":{},"singleIP":0,"ldapVerify":"require","ldapExportedVars":{"mail":"mail","uid":"uid","cn":"cn"},"useRedirectAjaxOnUnauthorized":1,"openIdSPList":"0;","samlAuthnContextMapExtra":{},"samlAuthnContextMapKerberos":4,"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","corsMax_Age":"86400","eventQueueName":"llng_events","localSessionStorageOptions":{"default_expires_in":600,"cache_depth":3,"cache_root":"/app/dev/sessions/","namespace":"lemonldap-ng-sessions","directory_umask":"007"},"checkUserDisplayNormalizedHeaders":0,"adaptativeAuthenticationLevelRules":{},"rest2fActivation":0,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","apacheAuthnLevel":3,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","issuerDBOpenIDConnectPath":"^/oauth2/","trustedBrowserUseTotp":1,"notification":1,"SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","ldapIOTimeout":10,"useRedirectOnError":1,"cspImg":"'self' data:","portalDisplayLoginHistory":1,"portalCheckLogins":1,"exportedHeaders":{"manager.llng.localhost":{},"auth.llng.localhost":{},"test2.llng.localhost":{"Auth-User":"$uid"},"test1.llng.localhost":{"Auth-User":"$uid","Uri":"$ENV{REQUEST_URI}","Ip-Addr":"$ipAddr","Base64":"encode_base64('a:b','')","Hello":"hello()","Additional-Arg":"get_additional_arg('header-added')","Macro-Uri":"$UA"}},"casAccessControlPolicy":"none","impersonationHiddenAttributes":"_2fDevices, _loginHistory","restAuthnLevel":2,"linkedInScope":"r_liteprofile r_emailaddress","managerPassword":"","notificationDefaultCond":"","bruteForceProtectionMaxFailed":3,"samlStorageOptions":{},"casAttributes":{},"contextSwitchingStopWithLogout":1,"oidcServiceKeyTypeEnc":"RSA","displaySessionId":1,"slaveAuthnLevel":2,"showLanguages":1,"cspConnect":"'self'","successLoginNumber":5,"portalDisplayRegister":1,"stayConnected":0,"customPluginsParams":{},"facebookExportedVars":{},"multiValuesSeparator":"; ","notificationServerPOST":1,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"lwpSslOpts":{},"oidcServiceDynamicRegistrationExtraClaims":{},"issuersTimeout":120,"samlSPMetaDataXML":null,"mailTimeout":0,"bruteForceProtectionMaxLockTime":900,"issuerDBSAMLPath":"^/saml/","macros":{"UA":"$ENV{HTTP_USER_AGENT}","_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\""},"locationDetectGeoIpLanguages":"en, fr","certificateResetByMailValidityDelay":0,"radius2fActivation":0,"openIdSreg_nickname":"uid","checkUserDisplayComputedSession":1,"mailSessionKey":"mail","ADPwdExpireWarning":0,"https":0,"totp2fRange":1,"sfRemovedMsgRule":0,"httpOnly":1,"yubikey2fPublicIDSize":12,"rest2fInitArgs":{},"useSafeJail":1,"dbiAuthnLevel":2,"oidcServiceNewKeyTypeSig":"RSA","contextSwitchingRule":0,"openIdExportedVars":{},"casAppMetaDataExportedVars":{},"gpgDb":"","oidcRPCallbackGetParam":"openidconnectcallback","certificateResetByMailCertificateAttribute":"userCertificate;binary","notificationWildcard":"allusers","bruteForceProtectionTempo":30,"samlRelayStateTimeout":600,"portalDisplayRefreshMyRights":1,"oidcServiceMetaDataJWKSURI":"jwks","findUserWildcard":"*","oidcServiceOldKeyTypeSig":"RSA","samlNameIDFormatMapWindows":"uid","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","impersonationIdRule":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","globalLogoutTimer":1,"findUserControl":"^[*\\w]+$","issuerDBJitsiMeetTokensRule":1,"issuerDBCASPath":"^/cas/","securedCookie":0,"radiusAuthnLevel":3,"yubikey2fActivation":0,"captcha_size":6,"checkUserDisplayHistory":0,"decryptValueRule":0,"corsAllow_Headers":"*","passwordPolicyActivation":1,"openIdAuthnLevel":1,"captcha_login_enabled":0,"cfgNum":7,"ldapGroupAttributeNameUser":"dn","passwordResetAllowedRetries":3,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","cspFont":"'self'","okta2fActivation":0,"portalPingInterval":60000,"sessionDataToRemember":{},"oidcRPMetaDataExportedVars":{},"oidcServiceMetaDataEndSessionURI":"logout","linkedInAuthnLevel":1,"samlMetadataForceUTF8":1,"scrollTop":400,"openIdIDPList":"0;","rememberAuthChoiceRule":1,"customAddParams":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","oidcOPMetaDataJSON":{},"singleUserByIP":0,"webauthnAuthnLevel":3,"oidcStorageOptions":{},"casAppMetaDataOptions":{},"portalRequireOldPassword":1,"cspScript":"'self'","passwordPolicyMinUpper":0,"webauthn2fAttestation":"none","contextSwitchingIdRule":1,"activeTimer":1,"oidcServiceOldKeyTypeEnc":"RSA","facebookAuthnLevel":1,"proxyAuthServiceChoiceParam":"lmAuth","twitterUserField":"screen_name","sfRequired":0,"post":{"test1.llng.localhost":{"/form.html":{"vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","buttonSelector":"#bt","formSelector":"#test","target":"/index.pl"}},"test2.llng.localhost":{},"manager.llng.localhost":{},"auth.llng.localhost":{}},"radiusExportedVars":{},"totp2fInterval":30,"oidcRPMetaDataMacros":null,"rememberDefaultChecked":1,"customFunctions":"My::hello My::get_additional_arg","oidcServiceMetaDataTokenURI":"token","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","SMTPServer":"","totp2fSelfRegistration":1,"portalDisplayLogout":1,"lwpOpts":{"timeout":10},"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","samlOrganizationName":"Example","sfExtra":{},"passwordPolicySpecialChar":"__ALL__","issuerDBGetRule":1,"timeoutActivity":0,"ldapGroupAttributeNameGroup":"dn"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-8.json b/dev/conf/lmConf-8.json
deleted file mode 100644
index 0fa78c08f..000000000
--- a/dev/conf/lmConf-8.json
+++ /dev/null
@@ -1 +0,0 @@
-{"checkHIBPURL":"https://api.pwnedpasswords.com/range/","samlNameIDFormatMapKerberos":"uid","restClockTolerance":15,"cspDefault":"'self'","ADPwdMaxAge":0,"issuerDBOpenIDPath":"^/openidserver/","pamService":"login","cspFrameAncestors":"","samlSPMetaDataOptions":{},"webIDExportedVars":{},"oidcServiceIDTokenExpiration":3600,"jsRedirect":0,"webauthn2fUserCanRemoveKey":1,"oidcRPStateTimeout":600,"krbRemoveDomain":1,"ldapGroupObjectClass":"groupOfNames","mail2fActivation":0,"whatToTrace":"_whatToTrace","yubikey2fUserCanRemoveKey":1,"autoSigninRules":{},"oidcOPMetaDataJWKS":{},"oidcServiceMetaDataUserInfoURI":"userinfo","groups":{},"sfRemovedNotifTitle":"Second factor notification","ext2fActivation":0,"ldapVerify":"require","messageBrokerOptions":{},"singleIP":0,"openIdSPList":"0;","ldapExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"useRedirectAjaxOnUnauthorized":1,"persistentStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/persistents/lock","Directory":"/app/dev/sessions/persistents"},"nginxCustomHandlers":{},"authentication":"Choice","sameSite":"","ldapPasswordResetAttributeValue":"TRUE","customToTrace":"mail","cfgAuthor":"dwho","oidcServiceEncAlgorithmEnc":"A256GCM","githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","openIdSreg_email":"mail","ldapVersion":3,"key":"qwertyui","passwordPolicyMinLower":0,"cspImg":"'self' data:","portalDisplayLoginHistory":1,"portalCheckLogins":1,"exportedHeaders":{"test1.llng.localhost":{"Additional-Arg":"get_additional_arg('header-added')","Macro-Uri":"$UA","Uri":"$ENV{REQUEST_URI}","Auth-User":"$uid","Ip-Addr":"$ipAddr","Hello":"hello()","Base64":"encode_base64('a:b','')"},"test2.llng.localhost":{"Auth-User":"$uid"},"auth.llng.localhost":{},"manager.llng.localhost":{}},"SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","ldapIOTimeout":10,"useRedirectOnError":1,"managerPassword":"","notificationDefaultCond":"","casAccessControlPolicy":"none","impersonationHiddenAttributes":"_2fDevices, _loginHistory","restAuthnLevel":2,"linkedInScope":"r_liteprofile r_emailaddress","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","corsMax_Age":"86400","eventQueueName":"llng_events","samlAuthnContextMapExtra":{},"samlAuthnContextMapKerberos":4,"randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","apacheAuthnLevel":3,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","issuerDBOpenIDConnectPath":"^/oauth2/","trustedBrowserUseTotp":1,"notification":1,"localSessionStorageOptions":{"default_expires_in":600,"directory_umask":"007","namespace":"lemonldap-ng-sessions","cache_root":"/app/dev/sessions/","cache_depth":3},"checkUserDisplayNormalizedHeaders":0,"adaptativeAuthenticationLevelRules":{},"rest2fActivation":0,"portalDisplayRegister":1,"stayConnected":0,"customPluginsParams":{},"facebookExportedVars":{},"multiValuesSeparator":"; ","oidcServiceDynamicRegistrationExtraClaims":{},"notificationServerPOST":1,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"lwpSslOpts":{},"contextSwitchingStopWithLogout":1,"oidcServiceKeyTypeEnc":"RSA","bruteForceProtectionMaxFailed":3,"samlStorageOptions":{},"casAttributes":{},"showLanguages":1,"cspConnect":"'self'","successLoginNumber":5,"displaySessionId":1,"slaveAuthnLevel":2,"dbiAuthnLevel":2,"oidcServiceNewKeyTypeSig":"RSA","contextSwitchingRule":0,"openIdExportedVars":{},"rest2fInitArgs":{},"useSafeJail":1,"oidcRPCallbackGetParam":"openidconnectcallback","casAppMetaDataExportedVars":{},"gpgDb":"","certificateResetByMailValidityDelay":0,"radius2fActivation":0,"openIdSreg_nickname":"uid","issuersTimeout":120,"samlSPMetaDataXML":null,"mailTimeout":0,"bruteForceProtectionMaxLockTime":900,"macros":{"_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\"","UA":"$ENV{HTTP_USER_AGENT}"},"issuerDBSAMLPath":"^/saml/","locationDetectGeoIpLanguages":"en, fr","totp2fRange":1,"https":0,"sfRemovedMsgRule":0,"httpOnly":1,"yubikey2fPublicIDSize":12,"checkUserDisplayComputedSession":1,"mailSessionKey":"mail","ADPwdExpireWarning":0,"samlNameIDFormatMapWindows":"uid","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","impersonationIdRule":1,"findUserWildcard":"*","oidcServiceOldKeyTypeSig":"RSA","issuerDBJitsiMeetTokensRule":1,"issuerDBCASPath":"^/cas/","securedCookie":0,"radiusAuthnLevel":3,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","globalLogoutTimer":1,"findUserControl":"^[*\\w]+$","notificationWildcard":"allusers","bruteForceProtectionTempo":30,"samlRelayStateTimeout":600,"certificateResetByMailCertificateAttribute":"userCertificate;binary","portalDisplayRefreshMyRights":1,"oidcServiceMetaDataJWKSURI":"jwks","SSLIssuerVar":"SSL_CLIENT_I_DN","customAddParams":{},"oidcOPMetaDataJSON":{},"singleUserByIP":0,"samlMetadataForceUTF8":1,"scrollTop":400,"openIdIDPList":"0;","rememberAuthChoiceRule":1,"passwordPolicyMinUpper":0,"cspScript":"'self'","webauthn2fAttestation":"none","contextSwitchingIdRule":1,"webauthnAuthnLevel":3,"oidcStorageOptions":{},"casAppMetaDataOptions":{},"portalRequireOldPassword":1,"cfgNum":8,"ldapGroupAttributeNameUser":"dn","passwordResetAllowedRetries":3,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","cspFont":"'self'","yubikey2fActivation":0,"captcha_size":6,"decryptValueRule":0,"checkUserDisplayHistory":0,"corsAllow_Headers":"*","passwordPolicyActivation":1,"openIdAuthnLevel":1,"captcha_login_enabled":0,"oidcRPMetaDataExportedVars":{},"oidcServiceMetaDataEndSessionURI":"logout","linkedInAuthnLevel":1,"okta2fActivation":0,"portalPingInterval":60000,"sessionDataToRemember":{},"oidcServiceMetaDataTokenURI":"token","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","SMTPServer":"","rememberDefaultChecked":1,"customFunctions":"My::hello My::get_additional_arg","sfExtra":{},"issuerDBGetRule":1,"passwordPolicySpecialChar":"__ALL__","timeoutActivity":0,"ldapGroupAttributeNameGroup":"dn","totp2fSelfRegistration":1,"portalDisplayLogout":1,"lwpOpts":{"timeout":10},"samlOrganizationName":"Example","samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","oidcServiceOldKeyTypeEnc":"RSA","proxyAuthServiceChoiceParam":"lmAuth","facebookAuthnLevel":1,"twitterUserField":"screen_name","activeTimer":1,"totp2fInterval":30,"oidcRPMetaDataMacros":null,"sfRequired":0,"post":{"test2.llng.localhost":{},"auth.llng.localhost":{},"manager.llng.localhost":{},"test1.llng.localhost":{"/form.html":{"target":"/index.pl","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"buttonSelector":"#bt","formSelector":"#test"}}},"radiusExportedVars":{},"corsAllow_Credentials":"true","notifyDeleted":1,"mail2fCodeRegex":"\\d{6}","dbiExportedVars":{},"authChoiceModules":{"2_Github":"GitHub;Null;Null;;1;{}","1_Null":"Null;Null;Null;;;{}","1_Demo":"Demo;Demo;Demo;;1;{}"},"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","portal":"http://auth.llng.localhost:8080/","SMTPTLS":"","issuerDBJitsiMeetTokensPath":"^/jitsi/","oidcOPMetaDataOptions":{},"proxyAuthnLevel":2,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","sfOnlyUpgrade":1,"oidcServiceKeyTypeSig":"RSA","portalErrorOnExpiredSession":1,"persistentStorage":"Apache::Session::File","newLocationWarningLocationAttribute":"ipAddr","cookieName":"lemonldap","ldapTimeout":10,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","ldapPwdEnc":"utf-8","checkHIBPRequired":1,"checkUserDisplayEmptyValues":0,"githubScope":"user:email","checkUserHiddenHeaders":{},"samlSPMetaDataMacros":null,"findUserSearchingAttributes":{},"logoutServices":{},"crowdsecAction":"reject","jitsiExpiration":"300","trustedBrowserRule":1,"pamAuthnLevel":2,"captchaOptions":{},"singleSession":0,"nullAuthnLevel":0,"cfgLog":"","openIdSreg_timezone":"_timezone","stayConnectedBypassFG":0,"githubUserField":"login","passwordPolicyMinDigit":0,"cfgVersion":"2.19.2","slaveExportedVars":{},"oidcServiceMetaDataRegistrationURI":"register","issuerDBOpenIDRule":1,"password2fSelfRegistration":0,"checkDevOpsDisplayNormalizedHeaders":1,"samlOverrideIDPEntityID":"","grantSessionRules":{},"impersonationRule":0,"webIDAuthnLevel":1,"casSrvMetaDataOptions":{},"oidcServiceDynamicRegistrationExportedVars":{},"samlSPMetaDataExportedAttributes":null,"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","applicationList":{"0001-cat":{"0002-app":{"type":"application","options":{"name":"Application Test 1","display":"auto","uri":"http://test1.llng.localhost:8080/","logo":"demo.png","description":"A simple application displaying authenticated user"}},"catname":"Sample applications","type":"category","0003-app":{"type":"application","options":{"uri":"http://test2.llng.localhost:8080/","display":"auto","logo":"thumbnail.png","name":"Application Test 2","description":"The same simple application displaying authenticated user"}}},"0004-cat":{"catname":"Administration","0006-app":{"type":"application","options":{"description":"Explore WebSSO notifications","display":"auto","uri":"http://manager.llng.localhost:8080/notifications.html","logo":"database.png","name":"Notifications Explorer"}},"0008-app":{"type":"application","options":{"name":"2FA Sessions Explorer","display":"auto","logo":"database.png","uri":"http://manager.llng.localhost:8080/2ndfa.html","description":"Explore WebSSO 2FA sessions"}},"type":"category","0007-app":{"type":"application","options":{"description":"Explore WebSSO sessions","name":"Sessions Explorer","uri":"http://manager.llng.localhost:8080/sessions.html","display":"auto","logo":"database.png"}},"0005-app":{"options":{"description":"Configure LemonLDAP::NG WebSSO","display":"auto","logo":"configure.png","uri":"http://manager.llng.localhost:8080/manager.html","name":"WebSSO Manager"},"type":"application"}},"0008-cat":{"0009-app":{"options":{"uri":"http://manager.llng.localhost:8080/doc/","display":"on","logo":"help.png","name":"Local documentation","description":"Documentation supplied with LemonLDAP::NG"},"type":"application"},"0010-app":{"type":"application","options":{"uri":"https://lemonldap-ng.org/","logo":"network.png","display":"on","name":"Official Website","description":"Official LemonLDAP::NG Website"}},"type":"category","catname":"Documentation"}},"portalFavicon":"common/favicon.ico","upgradeSession":1,"checkDevOpsCheckSessionAttributes":1,"globalLogoutRule":0,"checkUserIdRule":1,"impersonationMergeSSOgroups":0,"oidcServiceMetaDataIntrospectionURI":"introspect","sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","combModules":{},"samlIDPMetaDataXML":{},"rest2fVerifyArgs":{},"samlSPSSODescriptorWantAssertionsSigned":1,"samlOrganizationURL":"http://www.example.com","cfgAuthorIP":"10.0.2.100","oidcRPMetaDataOptionsExtraClaims":null,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","userDB":"Same","rememberCookieTimeout":31536000,"notificationStorage":"File","oidcServiceAllowAuthorizationCodeFlow":1,"casSrvMetaDataExportedVars":{},"SSLVarIf":{},"portalUserAttr":"_user","checkUserDisplayPersistentInfo":0,"radius2fRequestAttributes":{},"ldapUsePasswordResetAttribute":1,"issuerDBSAMLRule":1,"findUserExcludingAttributes":{},"yubikey2fSelfRegistration":0,"oidcAuthnLevel":1,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","linkedInFields":"id,first-name,last-name,email-address","webauthn2fUserVerification":"preferred","cspFormAction":"*","krbAuthnLevel":3,"samlIDPMetaDataOptions":{},"stayConnectedTimeout":2592000,"oidcServiceMetaDataAuthnContext":{"loa-2":2,"loa-4":4,"loa-1":1,"loa-3":3,"loa-5":5},"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","requireToken":1,"samlAuthnContextMapPasswordProtectedTransport":3,"portalMainLogo":"common/logos/logo_llng_400px.png","cspStyle":"'self'","managerDn":"","oidcServiceMetaDataFrontChannelURI":"flogout","casStorageOptions":{},"ldapAuthnLevel":2,"samlOrganizationDisplayName":"Example","certificateResetByMailCeaAttribute":"description","passwordPolicyMaxSize":0,"portalForceAuthnInterval":5,"corsExpose_Headers":"*","newLocationWarningMaxValues":"0","samlSPSSODescriptorAuthnRequestsSigned":1,"facebookUserField":"id","locationRules":{"test1.llng.localhost":{"^/saml":"unprotect","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1","^/logout":"logout_sso","^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","default":"accept"},"manager.llng.localhost":{"default":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"},"auth.llng.localhost":{"default":"accept","(?#errors)^/lmerror/":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\""}},"samlEntityID":"#PORTAL#/saml/metadata","openIdSreg_fullname":"cn","portalSkinRules":{},"oidcOPMetaDataExportedVars":null,"failedLoginNumber":5,"mailFrom":"noreply at example.com","samlServiceSignatureMethod":"RSA_SHA256","oidcServiceMetaDataCheckSessionURI":"checksession.html","webauthn2fActivation":0,"timeout":72000,"jitsiSigningAlg":"RS256","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","SSLAuthnLevel":5,"casTicketExpiration":0,"checkDevOpsDownload":1,"demoExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"totp2fUserCanRemoveKey":1,"oidcRPMetaDataScopeRules":null,"remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"radius2fTimeout":20,"oidcServiceMetaDataBackChannelURI":"blogout","portalAntiFrame":1,"reloadTimeout":5,"samlNameIDFormatMapX509":"mail","notificationStorageOptions":{"dirName":"/app/dev"},"timeoutActivityInterval":60,"ldapGroupAttributeName":"member","oidcServiceAccessTokenExpiration":3600,"twitterAuthnLevel":1,"port":-1,"samlNameIDFormatMapEmail":"mail","confirmFormMethod":"post","sfManagerRule":1,"registerTimeout":0,"captcha_mail_enabled":1,"oidcServiceOfflineSessionExpiration":2592000,"notificationServerSentAttributes":"uid reference date title subtitle text check","localSessionStorage":"Cache::FileCache","impersonationSkipEmptyValues":1,"mailCharset":"utf-8","hideOldPassword":1,"corsAllow_Methods":"POST,GET","samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","passwordPolicyMinSpeChar":0,"checkXSS":1,"linkedInUserField":"emailAddress","password2fActivation":0,"bruteForceProtectionMaxAge":300,"samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"issuerDBGetPath":"^/get/","registerDB":"Demo","githubAuthnLevel":1,"casAuthnLevel":1,"exportedVars":{},"sfRemovedNotifRef":"RemoveSF","stayConnectedCookieName":"llngconnection","cfgDate":1727797635,"reloadUrls":{},"oidcServiceAuthorizationCodeExpiration":60,"domain":"llng.localhost","redirectFormMethod":"get","hiddenAttributes":"_password _2fDevices","samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","formTimeout":120,"issuerDBOpenIDConnectRule":1,"webauthn2fSelfRegistration":0,"corsAllow_Origin":"*","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","portalDisplayGeneratePassword":1,"newLocationWarningLocationDisplayAttribute":"","ldapGroupAttributeNameSearch":"cn","ext2fCodeActivation":"\\d{6}","oidcServiceMetaDataAuthorizeURI":"authorize","infoFormMethod":"get","globalStorage":"Apache::Session::File","ldapSearchDeref":"find","samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcRPMetaDataOptions":{},"stayConnectedSingleSession":0,"portalDisplayAppslist":1,"checkUserDisplayHiddenAttributes":0,"portalSkin":"bootstrap","corsEnabled":1,"SSLVar":"SSL_CLIENT_S_DN_Email","passwordDB":"Choice","ldapServer":"ldap://localhost","githubClientID":"cd5857b36056d0bf968b","rememberTimer":0,"remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","webauthnAppId":1,"gpgAuthnLevel":5,"totp2fActivation":1,"casAppMetaDataMacros":null,"captcha_register_enabled":1,"ldapBase":"dc=example,dc=com","passwordPolicyMinSize":0,"totp2fDigits":6,"rememberCookieName":"llngrememberauthchoice","samlIDPMetaDataExportedAttributes":null,"issuerDBCASRule":1,"loginHistoryEnabled":1,"totp2fEncryptSecret":0,"ldapPasswordResetAttribute":"pwdReset","totp2fAuthnLevel":"4","samlAuthnContextMapTLSClient":5,"globalStorageOptions":{"LockDirectory":"/app/dev/sessions/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions"},"password2fUserCanRemoveKey":1,"authChoiceParam":"lmAuth","checkUserDisplayEmptyHeaders":0,"vhostOptions":{"test2.llng.localhost":{},"manager.llng.localhost":{"vhostMaintenance":0,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace","vhostType":"Main","vhostHttps":-1,"vhostPort":-1,"vhostServiceTokenTTL":-1,"vhostAliases":""},"auth.llng.localhost":{},"test1.llng.localhost":{"vhostMaintenance":0,"vhostAccessToTrace":"","vhostHttps":-1,"vhostType":"Main","vhostPort":-1,"vhostAuthnLevel":"4","vhostComment":"","vhostServiceTokenTTL":-1,"vhostAliases":""}},"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;"}
\ No newline at end of file
diff --git a/dev/conf/lmConf-9.json b/dev/conf/lmConf-9.json
deleted file mode 100644
index 7699ff4e7..000000000
--- a/dev/conf/lmConf-9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"autoSigninRules":{},"whatToTrace":"_whatToTrace","yubikey2fUserCanRemoveKey":1,"ldapGroupObjectClass":"groupOfNames","mail2fActivation":0,"webauthn2fUserCanRemoveKey":1,"krbRemoveDomain":1,"oidcRPStateTimeout":600,"groups":{},"ext2fActivation":0,"sfRemovedNotifTitle":"Second factor notification","oidcServiceMetaDataUserInfoURI":"userinfo","oidcOPMetaDataJWKS":{},"oidcServiceIDTokenExpiration":3600,"jsRedirect":0,"cspFrameAncestors":"","pamService":"login","webIDExportedVars":{},"samlSPMetaDataOptions":{},"restClockTolerance":15,"checkHIBPURL":"https://api.pwnedpasswords.com/range/","samlNameIDFormatMapKerberos":"uid","issuerDBOpenIDPath":"^/openidserver/","cspDefault":"'self'","ADPwdMaxAge":0,"ldapVersion":3,"oidcServiceEncAlgorithmEnc":"A256GCM","githubClientSecret":"90f2fc1d13848bfb84865d0e5c83668d2b3cca52","openIdSreg_email":"mail","passwordPolicyMinLower":0,"key":"qwertyui","sameSite":"","ldapPasswordResetAttributeValue":"TRUE","nginxCustomHandlers":{},"authentication":"Choice","persistentStorageOptions":{"LockDirectory":"/app/dev/sessions/persistents/lock","generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","Directory":"/app/dev/sessions/persistents"},"cfgAuthor":"dwho","customToTrace":"mail","openIdSPList":"0;","useRedirectAjaxOnUnauthorized":1,"ldapExportedVars":{"mail":"mail","cn":"cn","uid":"uid"},"ldapVerify":"require","singleIP":0,"messageBrokerOptions":{},"trustedBrowserUseTotp":1,"notification":1,"issuerDBOpenIDConnectPath":"^/oauth2/","randomPasswordRegexp":"[A-Z]{3}[a-z]{5}.\\d{2}","apacheAuthnLevel":3,"samlIDPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","rest2fActivation":0,"adaptativeAuthenticationLevelRules":{},"checkUserDisplayNormalizedHeaders":0,"localSessionStorageOptions":{"default_expires_in":600,"cache_depth":3,"namespace":"lemonldap-ng-sessions","directory_umask":"007","cache_root":"/app/dev/sessions/"},"eventQueueName":"llng_events","corsMax_Age":"86400","samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlAuthnContextMapExtra":{},"samlAuthnContextMapKerberos":4,"notificationDefaultCond":"","managerPassword":"","linkedInScope":"r_liteprofile r_emailaddress","impersonationHiddenAttributes":"_2fDevices, _loginHistory","restAuthnLevel":2,"casAccessControlPolicy":"none","exportedHeaders":{"test1.llng.localhost":{"Uri":"$ENV{REQUEST_URI}","Auth-User":"$uid","Ip-Addr":"$ipAddr","Base64":"encode_base64('a:b','')","Hello":"hello()","Additional-Arg":"get_additional_arg('header-added')","Macro-Uri":"$UA"},"test2.llng.localhost":{"Auth-User":"$uid"},"manager.llng.localhost":{},"auth.llng.localhost":{}},"portalCheckLogins":1,"cspImg":"'self' data:","portalDisplayLoginHistory":1,"useRedirectOnError":1,"ldapIOTimeout":10,"SMTPTLSOpts":{},"portalDisplayOrder":"Appslist ChangePassword LoginHistory OidcConsents Logout","successLoginNumber":5,"cspConnect":"'self'","showLanguages":1,"slaveAuthnLevel":2,"displaySessionId":1,"oidcServiceKeyTypeEnc":"RSA","contextSwitchingStopWithLogout":1,"casAttributes":{},"samlStorageOptions":{},"bruteForceProtectionMaxFailed":3,"oidcServiceDynamicRegistrationExtraClaims":{},"lwpSslOpts":{},"notificationServerPOST":1,"issuerDBGetParameters":{},"radiusRequestAttributes":{},"multiValuesSeparator":"; ","stayConnected":0,"portalDisplayRegister":1,"facebookExportedVars":{},"customPluginsParams":{},"sfRemovedMsgRule":0,"httpOnly":1,"yubikey2fPublicIDSize":12,"https":0,"totp2fRange":1,"ADPwdExpireWarning":0,"checkUserDisplayComputedSession":1,"mailSessionKey":"mail","openIdSreg_nickname":"uid","radius2fActivation":0,"certificateResetByMailValidityDelay":0,"macros":{"_whatToTrace":"$_auth eq 'SAML' ? \"$_user\\@$_idpConfKey\" : $_auth eq 'OpenIDConnect' ? \"$_user\\@$_oidc_OP\" : \"$_user\"","UA":"$ENV{HTTP_USER_AGENT}"},"locationDetectGeoIpLanguages":"en, fr","issuerDBSAMLPath":"^/saml/","bruteForceProtectionMaxLockTime":900,"issuersTimeout":120,"samlSPMetaDataXML":null,"mailTimeout":0,"oidcRPCallbackGetParam":"openidconnectcallback","gpgDb":"","casAppMetaDataExportedVars":{},"openIdExportedVars":{},"contextSwitchingRule":0,"oidcServiceNewKeyTypeSig":"RSA","dbiAuthnLevel":2,"useSafeJail":1,"rest2fInitArgs":{},"oidcServiceMetaDataJWKSURI":"jwks","portalDisplayRefreshMyRights":1,"samlRelayStateTimeout":600,"bruteForceProtectionTempo":30,"notificationWildcard":"allusers","certificateResetByMailCertificateAttribute":"userCertificate;binary","radiusAuthnLevel":3,"securedCookie":0,"issuerDBJitsiMeetTokensRule":1,"issuerDBCASPath":"^/cas/","findUserControl":"^[*\\w]+$","globalLogoutTimer":1,"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","impersonationIdRule":1,"samlNameIDFormatMapWindows":"uid","samlSPSSODescriptorAssertionConsumerServiceHTTPPost":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","oidcServiceOldKeyTypeSig":"RSA","findUserWildcard":"*","linkedInAuthnLevel":1,"oidcRPMetaDataExportedVars":{},"oidcServiceMetaDataEndSessionURI":"logout","sessionDataToRemember":{},"okta2fActivation":0,"portalPingInterval":60000,"cspFont":"'self'","passwordResetAllowedRetries":3,"portalDisplayOidcConsents":"$_oidcConsents && $_oidcConsents =~ /\\w+/","ldapGroupAttributeNameUser":"dn","cfgNum":9,"openIdAuthnLevel":1,"captcha_login_enabled":0,"corsAllow_Headers":"*","passwordPolicyActivation":1,"decryptValueRule":0,"checkUserDisplayHistory":0,"yubikey2fActivation":0,"captcha_size":6,"contextSwitchingIdRule":1,"webauthn2fAttestation":"none","cspScript":"'self'","passwordPolicyMinUpper":0,"portalRequireOldPassword":1,"webauthnAuthnLevel":3,"oidcStorageOptions":{},"casAppMetaDataOptions":{},"singleUserByIP":0,"oidcOPMetaDataJSON":{},"SSLIssuerVar":"SSL_CLIENT_I_DN","customAddParams":{},"rememberAuthChoiceRule":1,"openIdIDPList":"0;","samlMetadataForceUTF8":1,"scrollTop":400,"oidcRPMetaDataMacros":null,"totp2fInterval":30,"radiusExportedVars":{},"post":{"test1.llng.localhost":{"/form.html":{"buttonSelector":"#bt","jqueryUrl":"http://manager.llng.localhost:8080/static/bwr/jquery/dist/jquery.js","vars":[["postuid","$_user"],["postmail","'x at x.org'"],["poststatic","'static content'"]],"formSelector":"#test","target":"/index.pl"}},"auth.llng.localhost":{},"manager.llng.localhost":{},"test2.llng.localhost":{}},"sfRequired":0,"twitterUserField":"screen_name","oidcServiceOldKeyTypeEnc":"RSA","facebookAuthnLevel":1,"proxyAuthServiceChoiceParam":"lmAuth","activeTimer":1,"ldapGroupAttributeNameGroup":"dn","timeoutActivity":0,"sfExtra":{},"passwordPolicySpecialChar":"__ALL__","issuerDBGetRule":1,"samlOrganizationName":"Example","samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","totp2fSelfRegistration":1,"portalDisplayLogout":1,"lwpOpts":{"timeout":10},"SMTPServer":"","samlAttributeAuthorityDescriptorAttributeServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","oidcServiceMetaDataTokenURI":"token","rememberDefaultChecked":1,"customFunctions":"My::hello My::get_additional_arg","cookieName":"lemonldap","persistentStorage":"Apache::Session::File","newLocationWarningLocationAttribute":"ipAddr","ldapTimeout":10,"checkUserHiddenAttributes":"_loginHistory, _session_id, hGroups","proxyAuthnLevel":2,"oidcServiceKeyTypeSig":"RSA","portalErrorOnExpiredSession":1,"portalSkinBackground":"1280px-Cedar_Breaks_National_Monument_partially.jpg","sfOnlyUpgrade":1,"portal":"http://auth.llng.localhost:8080/","oidcOPMetaDataOptions":{},"issuerDBJitsiMeetTokensPath":"^/jitsi/","SMTPTLS":"","mail2fCodeRegex":"\\d{6}","corsAllow_Credentials":"true","notifyDeleted":1,"portalDisplayChangePassword":"$_auth =~ /^(LDAP|DBI|Demo)$/","authChoiceModules":{"1_Null":"Null;Null;Null;;;{}","2_Github":"GitHub;Null;Null;;1;{}","1_Demo":"Demo;Demo;Demo;;1;{}"},"dbiExportedVars":{},"slaveExportedVars":{},"cfgVersion":"2.19.2","cfgLog":"","captchaOptions":{},"nullAuthnLevel":0,"singleSession":0,"passwordPolicyMinDigit":0,"openIdSreg_timezone":"_timezone","stayConnectedBypassFG":0,"githubUserField":"login","logoutServices":{},"findUserSearchingAttributes":{},"samlSPMetaDataMacros":null,"pamAuthnLevel":2,"jitsiExpiration":"300","trustedBrowserRule":1,"crowdsecAction":"reject","githubScope":"user:email","checkHIBPRequired":1,"checkUserDisplayEmptyValues":0,"ldapPwdEnc":"utf-8","checkUserHiddenHeaders":{},"sfRemovedNotifMsg":"_removedSF_ expired second factor(s) has/have been removed (_nameSF_)!","oidcServiceMetaDataIntrospectionURI":"introspect","checkUserIdRule":1,"impersonationMergeSSOgroups":0,"cfgAuthorIP":"10.0.2.100","samlOrganizationURL":"http://www.example.com","samlIDPMetaDataXML":{},"samlSPSSODescriptorWantAssertionsSigned":1,"rest2fVerifyArgs":{},"combModules":{},"oidcServiceDynamicRegistrationExportedVars":{},"samlSPMetaDataExportedAttributes":null,"globalLogoutRule":0,"checkDevOpsCheckSessionAttributes":1,"applicationList":{"0001-cat":{"type":"category","catname":"Sample applications","0002-app":{"options":{"logo":"demo.png","display":"auto","uri":"http://test1.llng.localhost:8080/","name":"Application Test 1","description":"A simple application displaying authenticated user"},"type":"application"},"0003-app":{"type":"application","options":{"logo":"thumbnail.png","display":"auto","uri":"http://test2.llng.localhost:8080/","name":"Application Test 2","description":"The same simple application displaying authenticated user"}}},"0008-cat":{"catname":"Documentation","0009-app":{"options":{"description":"Documentation supplied with LemonLDAP::NG","display":"on","logo":"help.png","uri":"http://manager.llng.localhost:8080/doc/","name":"Local documentation"},"type":"application"},"type":"category","0010-app":{"type":"application","options":{"display":"on","uri":"https://lemonldap-ng.org/","logo":"network.png","name":"Official Website","description":"Official LemonLDAP::NG Website"}}},"0004-cat":{"type":"category","0008-app":{"type":"application","options":{"description":"Explore WebSSO 2FA sessions","display":"auto","uri":"http://manager.llng.localhost:8080/2ndfa.html","logo":"database.png","name":"2FA Sessions Explorer"}},"0006-app":{"options":{"uri":"http://manager.llng.localhost:8080/notifications.html","logo":"database.png","display":"auto","name":"Notifications Explorer","description":"Explore WebSSO notifications"},"type":"application"},"catname":"Administration","0005-app":{"type":"application","options":{"description":"Configure LemonLDAP::NG WebSSO","name":"WebSSO Manager","uri":"http://manager.llng.localhost:8080/manager.html","logo":"configure.png","display":"auto"}},"0007-app":{"options":{"display":"auto","logo":"database.png","uri":"http://manager.llng.localhost:8080/sessions.html","name":"Sessions Explorer","description":"Explore WebSSO sessions"},"type":"application"}}},"samlSPSSODescriptorSingleLogoutServiceSOAP":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","portalFavicon":"common/favicon.ico","upgradeSession":1,"samlOverrideIDPEntityID":"","grantSessionRules":{},"checkDevOpsDisplayNormalizedHeaders":1,"casSrvMetaDataOptions":{},"webIDAuthnLevel":1,"impersonationRule":0,"oidcServiceMetaDataRegistrationURI":"register","password2fSelfRegistration":0,"issuerDBOpenIDRule":1,"portalMainLogo":"common/logos/logo_llng_400px.png","cspStyle":"'self'","samlAuthnContextMapPasswordProtectedTransport":3,"requireToken":1,"casStorageOptions":{},"oidcServiceMetaDataFrontChannelURI":"flogout","managerDn":"","cspFormAction":"*","webauthn2fUserVerification":"preferred","krbAuthnLevel":3,"oidcServiceEncAlgorithmAlg":"RSA-OAEP","oidcAuthnLevel":1,"linkedInFields":"id,first-name,last-name,email-address","yubikey2fSelfRegistration":0,"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","oidcServiceMetaDataAuthnContext":{"loa-5":5,"loa-1":1,"loa-3":3,"loa-2":2,"loa-4":4},"samlIDPMetaDataOptions":{},"stayConnectedTimeout":2592000,"SSLVarIf":{},"oidcServiceAllowAuthorizationCodeFlow":1,"casSrvMetaDataExportedVars":{},"notificationStorage":"File","findUserExcludingAttributes":{},"issuerDBSAMLRule":1,"radius2fRequestAttributes":{},"checkUserDisplayPersistentInfo":0,"ldapUsePasswordResetAttribute":1,"portalUserAttr":"_user","oidcRPMetaDataOptionsExtraClaims":null,"rememberCookieTimeout":31536000,"bruteForceProtectionLockTimes":"15, 30, 60, 300, 600","userDB":"Same","notificationStorageOptions":{"dirName":"/app/dev"},"reloadTimeout":5,"samlNameIDFormatMapX509":"mail","portalAntiFrame":1,"samlNameIDFormatMapEmail":"mail","port":-1,"ldapGroupAttributeName":"member","oidcServiceAccessTokenExpiration":3600,"twitterAuthnLevel":1,"timeoutActivityInterval":60,"casTicketExpiration":0,"SSLAuthnLevel":5,"checkDevOpsDownload":1,"remoteGlobalStorageOptions":{"proxy":"http://auth.example.com/sessions","ns":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService"},"oidcServiceMetaDataBackChannelURI":"blogout","radius2fTimeout":20,"oidcRPMetaDataScopeRules":null,"demoExportedVars":{"cn":"cn","uid":"uid","mail":"mail"},"totp2fUserCanRemoveKey":1,"samlServiceSignatureMethod":"RSA_SHA256","mailFrom":"noreply at example.com","oidcOPMetaDataExportedVars":null,"failedLoginNumber":5,"openIdSreg_fullname":"cn","portalSkinRules":{},"samlEntityID":"#PORTAL#/saml/metadata","samlSPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","jitsiSigningAlg":"RS256","timeout":72000,"oidcServiceMetaDataCheckSessionURI":"checksession.html","webauthn2fActivation":0,"portalForceAuthnInterval":5,"passwordPolicyMaxSize":0,"ldapAuthnLevel":2,"certificateResetByMailCeaAttribute":"description","samlOrganizationDisplayName":"Example","newLocationWarningMaxValues":"0","facebookUserField":"id","samlSPSSODescriptorAuthnRequestsSigned":1,"locationRules":{"test1.llng.localhost":{"^/index.pl\\?logout_all$":"logout_app_sso http://lemonldap-ng.org/welcome/","default":"accept","^/saml":"unprotect","^/logout":"logout_sso","^/index.pl\\?logout_app$":"logout_app http://test1.llng.localhost:8080/index.pl?foo=1"},"auth.llng.localhost":{"default":"accept","(?#errors)^/lmerror/":"accept","(?#checkDevOps)^/checkdevops":"$uid eq \"dwho\"","(?#checkUser)^/checkuser":"$uid eq \"dwho\""},"manager.llng.localhost":{"(?#Sessions)^/sessions":"$uid eq \"dwho\" or $uid eq \"rtyler\"","(?#Configuration)^/(manager\\.html|conf|$)":"$uid eq \"dwho\"","(?#Notifications)^/notifications":"$uid eq \"dwho\" or $uid eq \"rtyler\"","default":"$uid eq \"dwho\" or $uid eq \"rtyler\""},"test2.llng.localhost":{"^/logout":"logout_sso","default":"accept"}},"corsExpose_Headers":"*","reloadUrls":{},"cfgDate":1727797742,"stayConnectedCookieName":"llngconnection","sfRemovedNotifRef":"RemoveSF","exportedVars":{},"registerDB":"Demo","issuerDBGetPath":"^/get/","samlIDPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","samlIDPSSODescriptorWantAuthnRequestsSigned":1,"casAuthnLevel":1,"githubAuthnLevel":1,"passwordPolicyMinSpeChar":0,"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","corsAllow_Methods":"POST,GET","linkedInUserField":"emailAddress","checkXSS":1,"bruteForceProtectionMaxAge":300,"password2fActivation":0,"notificationServerSentAttributes":"uid reference date title subtitle text check","localSessionStorage":"Cache::FileCache","impersonationSkipEmptyValues":1,"oidcServiceOfflineSessionExpiration":2592000,"captcha_mail_enabled":1,"confirmFormMethod":"post","sfManagerRule":1,"registerTimeout":0,"hideOldPassword":1,"mailCharset":"utf-8","samlIDPSSODescriptorArtifactResolutionServiceArtifact":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","oidcRPMetaDataOptions":{},"oidcServiceMetaDataAuthorizeURI":"authorize","ext2fCodeActivation":"\\d{6}","ldapGroupAttributeNameSearch":"cn","ldapSearchDeref":"find","globalStorage":"Apache::Session::File","infoFormMethod":"get","samlSPSSODescriptorSingleLogoutServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","corsAllow_Origin":"*","portalDisplayGeneratePassword":1,"newLocationWarningLocationDisplayAttribute":"","redirectFormMethod":"get","hiddenAttributes":"_password _2fDevices","samlAuthnContextMapPassword":2,"userControl":"^[\\w\\.\\-@]+$","domain":"llng.localhost","oidcServiceAuthorizationCodeExpiration":60,"issuerDBOpenIDConnectRule":1,"webauthn2fSelfRegistration":0,"formTimeout":120,"authChoiceParam":"lmAuth","globalStorageOptions":{"generateModule":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","LockDirectory":"/app/dev/sessions/lock","Directory":"/app/dev/sessions"},"password2fUserCanRemoveKey":1,"samlIDPSSODescriptorSingleSignOnServiceHTTPPost":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","vhostOptions":{"test1.llng.localhost":{"vhostComment":"","vhostAliases":"","vhostServiceTokenTTL":-1,"vhostPort":-1,"vhostAuthnLevel":"4","vhostHttps":-1,"vhostType":"Main","vhostAccessToTrace":"","vhostMaintenance":0},"auth.llng.localhost":{},"test2.llng.localhost":{},"manager.llng.localhost":{"vhostServiceTokenTTL":-1,"vhostAliases":"","vhostPort":-1,"vhostHttps":-1,"vhostType":"Main","vhostMaintenance":0,"vhostAccessToTrace":"My::accessToTrace, Doctor, Who, _whatToTrace"}},"checkUserDisplayEmptyHeaders":0,"samlIDPMetaDataExportedAttributes":null,"issuerDBCASRule":1,"samlAuthnContextMapTLSClient":5,"ldapPasswordResetAttribute":"pwdReset","totp2fEncryptSecret":0,"totp2fAuthnLevel":"4","loginHistoryEnabled":1,"captcha_register_enabled":1,"casAppMetaDataMacros":null,"gpgAuthnLevel":5,"totp2fActivation":1,"totp2fDigits":6,"rememberCookieName":"llngrememberauthchoice","passwordPolicyMinSize":0,"ldapBase":"dc=example,dc=com","corsEnabled":1,"SSLVar":"SSL_CLIENT_S_DN_Email","portalSkin":"bootstrap","checkUserDisplayHiddenAttributes":0,"stayConnectedSingleSession":0,"portalDisplayAppslist":1,"webauthnAppId":1,"remoteGlobalStorage":"Lemonldap::NG::Common::Apache::Session::SOAP","githubClientID":"cd5857b36056d0bf968b","rememberTimer":5,"ldapServer":"ldap://localhost","passwordDB":"Choice"}
\ No newline at end of file
diff --git a/dev/sessions/d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d b/dev/sessions/d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d
new file mode 100644
index 000000000..442d2936e
--- /dev/null
+++ b/dev/sessions/d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d
@@ -0,0 +1 @@
+{"_appsListOrder":"sort_2,sort_3,sort_1","_userDB":"Demo","_startTime":"20250411123316","uid":"dwho","_whatToTrace":"dwho","cn":"Doctor Who","_session_kind":"SSO","UA":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0","_choice":"1_Demo","_2fDevices":"[{\"name\":\"MyTOTP\",\"epoch\":\"1726654110\",\"_secret\":\"j67pboexylkw74vsc5nydavvimhe2cw2\",\"type\":\"TOTP\"}]","_auth":"Demo","_session_id":"d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d","groups":"users; timelords","_user":"dwho","_updateTime":"20250411123321","ipAddr":"10.0.2.100","mail":"dwho at badwolf.org","authenticationLevel":1,"_utime":1744374796,"_lastAuthnUTime":1744374796,"_language":"fr","_loginHistory":{"failedLogin":[{"ipAddr":"10.0.2.100","error":"5","_utime":1743669312}],"successLogin":[{"_utime":1744374796,"ipAddr":"10.0.2.100"},{"ipAddr":"10.0.2.100","error":"-4","_utime":1743669389},{"_utime":1743669316,"ipAddr":"10.0.2.100"},{"ipAddr":"10.0.2.100","_utime":1742889133},{"_utime":1736837664,"ipAddr":"10.0.2.100"}]},"hGroups":{"users":{"name":"users"},"timelords":{"name":"timelords"}}}
\ No newline at end of file
diff --git a/dev/sessions/fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1 b/dev/sessions/fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1
new file mode 100644
index 000000000..2cc7cc6e7
--- /dev/null
+++ b/dev/sessions/fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1
@@ -0,0 +1 @@
+{"_2fDevices":"[{\"name\":\"MyTOTP\",\"epoch\":\"1726654110\",\"_secret\":\"j67pboexylkw74vsc5nydavvimhe2cw2\",\"type\":\"TOTP\"}]","_whatToTrace":"dwho","_userDB":"Demo","_loginHistory":{"failedLogin":[{"error":"5","ipAddr":"10.0.2.100","_utime":1745598234},{"error":"5","ipAddr":"10.0.2.100","_utime":1743669312}],"successLogin":[{"_utime":1746534198,"ipAddr":"10.0.2.100"},{"_utime":1744374796,"ipAddr":"10.0.2.100"},{"_utime":1743669389,"ipAddr":"10.0.2.100","error":"-4"},{"_utime":1743669316,"ipAddr":"10.0.2.100"},{"_utime":1742889133,"ipAddr":"10.0.2.100"}]},"UA":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0","_lastAuthnUTime":1746534198,"cn":"Doctor Who","_session_kind":"SSO","ipAddr":"10.0.2.100","_session_id":"fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1","_appsListOrder":"sort_2,sort_3,sort_1","_language":"fr","_auth":"Demo","authenticationLevel":1,"_user":"dwho","_startTime":"20250506122318","mail":"dwho at badwolf.org","_choice":"1_Demo","_utime":1746534198,"uid":"dwho","groups":"timelords; users","hGroups":{"timelords":{"name":"timelords"},"users":{"name":"users"}},"_updateTime":"20250506122318"}
\ No newline at end of file
diff --git a/dev/sessions/lemonldap-ng-sessions/0/6/2/062e1d6abf4f5a5811b01cf3d0eeabfa70add1f7 b/dev/sessions/lemonldap-ng-sessions/0/6/2/062e1d6abf4f5a5811b01cf3d0eeabfa70add1f7
new file mode 100644
index 000000000..5f683af3b
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/0/6/2/062e1d6abf4f5a5811b01cf3d0eeabfa70add1f7 differ
diff --git a/dev/sessions/lemonldap-ng-sessions/1/0/a/10ac37f9e1cf7a5253ec9ce4caee6bf68e5658e2 b/dev/sessions/lemonldap-ng-sessions/1/0/a/10ac37f9e1cf7a5253ec9ce4caee6bf68e5658e2
new file mode 100644
index 000000000..e8abc0370
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/1/0/a/10ac37f9e1cf7a5253ec9ce4caee6bf68e5658e2 differ
diff --git a/dev/sessions/lemonldap-ng-sessions/3/1/b/31b5dba733b3aeb3d905caf91b95b665cbd0070c b/dev/sessions/lemonldap-ng-sessions/3/1/b/31b5dba733b3aeb3d905caf91b95b665cbd0070c
new file mode 100644
index 000000000..5f907b797
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/3/1/b/31b5dba733b3aeb3d905caf91b95b665cbd0070c differ
diff --git a/dev/sessions/lemonldap-ng-sessions/6/7/b/67b07f4269f4748251e5278a86a54c5e29d5854c b/dev/sessions/lemonldap-ng-sessions/6/7/b/67b07f4269f4748251e5278a86a54c5e29d5854c
new file mode 100644
index 000000000..20f00a379
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/6/7/b/67b07f4269f4748251e5278a86a54c5e29d5854c differ
diff --git a/dev/sessions/lemonldap-ng-sessions/b/3/e/b3e3aa1000e770894a3679017d3e383a90575fd8 b/dev/sessions/lemonldap-ng-sessions/b/3/e/b3e3aa1000e770894a3679017d3e383a90575fd8
new file mode 100644
index 000000000..f4ebefeb8
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/b/3/e/b3e3aa1000e770894a3679017d3e383a90575fd8 differ
diff --git a/dev/sessions/lemonldap-ng-sessions/c/a/6/ca6599e35f41eb809e6d5b62a459c3e526ee64c3 b/dev/sessions/lemonldap-ng-sessions/c/a/6/ca6599e35f41eb809e6d5b62a459c3e526ee64c3
new file mode 100644
index 000000000..7cd7caed0
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/c/a/6/ca6599e35f41eb809e6d5b62a459c3e526ee64c3 differ
diff --git a/dev/sessions/lemonldap-ng-sessions/e/2/1/e211985b434f7f014afc929f8e45f3cd2a5937ab b/dev/sessions/lemonldap-ng-sessions/e/2/1/e211985b434f7f014afc929f8e45f3cd2a5937ab
new file mode 100644
index 000000000..a8681c0e2
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/e/2/1/e211985b434f7f014afc929f8e45f3cd2a5937ab differ
diff --git a/dev/sessions/lemonldap-ng-sessions/e/5/1/e513d9135ffc3b8599e3c33886ff1c01d00d49c8 b/dev/sessions/lemonldap-ng-sessions/e/5/1/e513d9135ffc3b8599e3c33886ff1c01d00d49c8
new file mode 100644
index 000000000..54b29e5fd
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/e/5/1/e513d9135ffc3b8599e3c33886ff1c01d00d49c8 differ
diff --git a/dev/sessions/lemonldap-ng-sessions/e/7/a/e7aaa33e66f8cff364103e544c96ee1a647ba231 b/dev/sessions/lemonldap-ng-sessions/e/7/a/e7aaa33e66f8cff364103e544c96ee1a647ba231
new file mode 100644
index 000000000..28dc587b7
Binary files /dev/null and b/dev/sessions/lemonldap-ng-sessions/e/7/a/e7aaa33e66f8cff364103e544c96ee1a647ba231 differ
diff --git a/dev/sessions/lock/Apache-Session-367c6c4bd7f807906a0ed70735e5a1dd424f20db7bbd426f7a45840562bd5c1e.lock b/dev/sessions/lock/Apache-Session-367c6c4bd7f807906a0ed70735e5a1dd424f20db7bbd426f7a45840562bd5c1e.lock
new file mode 100644
index 000000000..e69de29bb
diff --git a/dev/sessions/lock/Apache-Session-696c6d81a8c5fccf9552c0b7774a38de3b8c884f3229bdd0da647ef5b694167a.lock b/dev/sessions/lock/Apache-Session-696c6d81a8c5fccf9552c0b7774a38de3b8c884f3229bdd0da647ef5b694167a.lock
new file mode 100644
index 000000000..e69de29bb
diff --git a/dev/sessions/lock/Apache-Session-d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d.lock b/dev/sessions/lock/Apache-Session-d7d06d712d3026d4ba8cbd018b9052349b7775aaf91f55f36fb1d67c8c54008d.lock
new file mode 100644
index 000000000..e69de29bb
diff --git a/dev/sessions/lock/Apache-Session-fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1.lock b/dev/sessions/lock/Apache-Session-fcb678456801e814c59662d26607c4391d24b3ac6b6acab8a4ea366c054bf8a1.lock
new file mode 100644
index 000000000..e69de29bb
diff --git a/dev/sessions/persistents/294de3557d9d00b3d2d8a1e6aab028cf b/dev/sessions/persistents/294de3557d9d00b3d2d8a1e6aab028cf
index 9a756a1cf..690ffcb91 100644
--- a/dev/sessions/persistents/294de3557d9d00b3d2d8a1e6aab028cf
+++ b/dev/sessions/persistents/294de3557d9d00b3d2d8a1e6aab028cf
@@ -1 +1 @@
-{"_utime":1727797647,"_loginHistory":{"successLogin":[{"ipAddr":"10.0.2.100","_utime":1727889136},{"ipAddr":"10.0.2.100","_utime":1727886288},{"ipAddr":"10.0.2.100","_utime":1727886183},{"ipAddr":"10.0.2.100","_utime":1727886178},{"ipAddr":"10.0.2.100","_utime":1727885195}]},"_session_id":"294de3557d9d00b3d2d8a1e6aab028cf","_session_kind":"Persistent","_session_uid":"anonymous","_updateTime":"20241002171216"}
\ No newline at end of file
+{"_utime":1727797647,"_updateTime":"20250425162329","_loginHistory":{"successLogin":[{"ipAddr":"10.0.2.100","_utime":1745598209},{"ipAddr":"10.0.2.100","_utime":1745598205},{"_utime":1727889136,"ipAddr":"10.0.2.100"},{"_utime":1727886288,"ipAddr":"10.0.2.100"},{"ipAddr":"10.0.2.100","_utime":1727886183}]},"_session_id":"294de3557d9d00b3d2d8a1e6aab028cf","_session_uid":"anonymous","_session_kind":"Persistent"}
\ No newline at end of file
diff --git a/dev/sessions/persistents/5efe8af397fc3577e05b483aca964f1b b/dev/sessions/persistents/5efe8af397fc3577e05b483aca964f1b
index 0d6df00c9..1b69e66c8 100644
--- a/dev/sessions/persistents/5efe8af397fc3577e05b483aca964f1b
+++ b/dev/sessions/persistents/5efe8af397fc3577e05b483aca964f1b
@@ -1 +1 @@
-{"_utime":1726653861,"_loginHistory":{"failedLogin":[{"_utime":1743669312,"ipAddr":"10.0.2.100","error":"5"}],"successLogin":[{"ipAddr":"10.0.2.100","error":"-4","_utime":1743669389},{"ipAddr":"10.0.2.100","_utime":1743669316},{"_utime":1742889133,"ipAddr":"10.0.2.100"},{"_utime":1736837664,"ipAddr":"10.0.2.100"},{"_utime":1727960361,"ipAddr":"10.0.2.100"}]},"_session_uid":"dwho","_appsListOrder":"sort_3,sort_1,sort_2","_updateTime":"20250403083629","_2fDevices":"[{\"name\":\"MyTOTP\",\"epoch\":\"1726654110\",\"_secret\":\"j67pboexylkw74vsc5nydavvimhe2cw2\",\"type\":\"TOTP\"}]","_session_id":"5efe8af397fc3577e05b483aca964f1b","_session_kind":"Persistent"}
\ No newline at end of file
+{"_updateTime":"20250506122318","_session_id":"5efe8af397fc3577e05b483aca964f1b","_session_kind":"Persistent","_loginHistory":{"failedLogin":[{"error":"5","ipAddr":"10.0.2.100","_utime":1745598234},{"error":"5","ipAddr":"10.0.2.100","_utime":1743669312}],"successLogin":[{"_utime":1746534198,"ipAddr":"10.0.2.100"},{"_utime":1744374796,"ipAddr":"10.0.2.100"},{"_utime":1743669389,"ipAddr":"10.0.2.100","error":"-4"},{"_utime":1743669316,"ipAddr":"10.0.2.100"},{"_utime":1742889133,"ipAddr":"10.0.2.100"}]},"_appsListOrder":"sort_2,sort_3,sort_1","_utime":1726653861,"_session_uid":"dwho","_2fDevices":"[{\"name\":\"MyTOTP\",\"epoch\":\"1726654110\",\"_secret\":\"j67pboexylkw74vsc5nydavvimhe2cw2\",\"type\":\"TOTP\"}]"}
\ No newline at end of file
diff --git a/doc/sources/admin/configvhost.rst b/doc/sources/admin/configvhost.rst
index 7c978a507..ca67641ea 100644
--- a/doc/sources/admin/configvhost.rst
+++ b/doc/sources/admin/configvhost.rst
@@ -37,6 +37,8 @@ Example of a protected virtual host for a local application:
 
    </VirtualHost>
 
+.. _vhostapachereverse:
+
 Reverse-Proxy
 ~~~~~~~~~~~~~
 
diff --git a/doc/sources/admin/documentation.rst b/doc/sources/admin/documentation.rst
index e9cddb78d..0e5d4dcda 100644
--- a/doc/sources/admin/documentation.rst
+++ b/doc/sources/admin/documentation.rst
@@ -30,13 +30,19 @@ Installation and configuration
    -  `Version 2.0 </documentation/2.0/>`__ (stable)
    -  `Version 1.9 </documentation/1.9/>`__ (oldstable)
 
--  Archived versions (unmaintained by LL::NG Team )
+Long Term Support
+~~~~~~~~~~~~~~~~~
+
+LL::NG Team maintains these versions following a "Long Term Support" policy:
+these versions are maintained without software updates by transposing only
+security fixes.
 
-   -  `Version 1.4 </documentation/1.4/>`__
-   -  `Version 1.3 </documentation/1.3/>`__
-   -  `Version 1.2 </documentation/1.2/>`__
-   -  `Version 1.1 </documentation/1.1/>`__
-   -  `Version 1.0 </documentation/1.0/>`__
+=========== ======= =========
+Version LTS Secured Limit
+=========== ======= =========
+**2.16.x**  |clean| June 2028
+**2.21.x**  |clean| June 2030
+=========== ======= =========
 
 Packaged versions
 ~~~~~~~~~~~~~~~~~
@@ -51,19 +57,19 @@ Debian
    Following Debian Policy, LL::NG packages are never upgraded in published distributions. However, security patches are backported by maintenance teams *(except some minor ones)*.
    See `Security tracker <https://security-tracker.debian.org/tracker/source-package/lemonldap-ng>`__
 
-=========== ========================== ======================================== ====================================================== ============================================================ =================================== =============================================================
-Debian dist                            LL::NG version                             Secured                                                Maintenance                                                  LTS Limit                           `Extended LTS <https://wiki.debian.org/LTS/Extended>`__ Limit
-=========== ========================== ======================================== ====================================================== ============================================================ =================================== =============================================================
-*6*         *Squeeze*                  *0.9.4.1*                                |maybe| minor issues: CVE-2020-16093                   *None*                                                       *February 2016*                     *April 2019*
-*7*         *Wheezy*                   *1.1.2*                                  |maybe| minor issues: CVE-2020-16093                   *None*                                                       *May 2018*                          *June 2020*
-*8*         *Jessie*                   *1.3.3*                                  |maybe| minor issues: CVE-2019-19791, CVE-2020-16093   *None*                                                       *June 2020*                         *Possibly 2024*
-*9*         *Stretch*                  *1.9.7*                                  |maybe| minor issues: CVE-2020-16093                   *None*  [1]_                                                 *June 2022*                         *Possibly 2025*
-*10*        *Buster*                   `2.0.2 </documentation/2.0/>`__          |clean|                                                *None*  [1]_                                                 *June 2024*                         Possibly 2026
-**11**      Bullseye                   `2.0.11 </documentation/2.0/>`__         |clean|                                                `Debian Security Team <https://security-team.debian.org/>`__ August 2026                         Possibly 2028
-**12**      Bookworm                   `2.16.1 </documentation/2.0/>`__         |clean|                                                `Debian Security Team <https://security-team.debian.org/>`__ June 2028                           Possibly 2030
-\           Bookworm-backports         `Latest </documentation/2.0/>`__         |clean|                                                LL::NG Team, "best effort" [3]_                              July 2026
-**Next**    Testing/Unstable           Latest  [5]_                             |clean|                                                LL::NG Team
-=========== ========================== ======================================== ====================================================== ============================================================ =================================== =============================================================
+=========== ========================== ======================================== ===================================================================================================== ============================================================ =================================== =============================================================
+N?          Debian name                LL::NG version                           Secured                                                                                               Maintenance                                                  LTS Limit                           `Extended LTS <https://wiki.debian.org/LTS/Extended>`__ Limit
+=========== ========================== ======================================== ===================================================================================================== ============================================================ =================================== =============================================================
+*6*         *Squeeze*                  *0.9.4.1*                                |maybe| *minor issues*                                                                                *None*                                                       *February 2016*
+*7*         *Wheezy*                   *1.1.2*                                  |maybe| *minor issues*                                                                                *None*                                                       *May 2018*
+*8*         *Jessie*                   *1.3.3*                                  |maybe| `minor issues <https://deb.freexian.com/extended-lts/tracker/source-package/lemonldap-ng>`__  *None*                                                       *June 2020*
+*9*         *Stretch*                  *1.9.7*                                  |maybe| `minor issues <https://deb.freexian.com/extended-lts/tracker/source-package/lemonldap-ng>`__  *None*  [1]_                                                 *June 2022*
+*10*        *Buster*                   `2.0.2 </documentation/2.0/>`__          |maybe| `minor issues <https://deb.freexian.com/extended-lts/tracker/source-package/lemonldap-ng>`__  *None*  [1]_                                                 *June 2024*                         Possibly 2026
+**11**      Bullseye                   `2.0.11 </documentation/2.0/>`__         |clean|                                                                                               `Debian LTS Team <https://wiki.debian.org/LTS/Team>`__       August 2026                         Possibly 2028
+**12**      Bookworm                   `2.16.1 </documentation/2.0/>`__         |clean|                                                                                               `Debian Security Team <https://security-team.debian.org/>`__ June 2028                           Possibly 2030
+\           Bookworm-backports         `Latest </documentation/2.0/>`__ [3]_    |clean|                                                                                               LL::NG Team, "best effort" [2]_                              July 2026
+**Next**    Testing/Unstable           Latest  [3]_                             |clean|                                                                                               LL::NG Team
+=========== ========================== ======================================== ===================================================================================================== ============================================================ =================================== =============================================================
 
 See `Debian Security
 Tracker <https://security-tracker.debian.org/tracker/source-package/lemonldap-ng>`__
@@ -75,21 +81,20 @@ Ubuntu
 
 .. attention::
 
-   Ubuntu version are included in "universe" branch [8]_, so not really security maintained. Prefer to use our repositories or Debian ones
-
-=========== ============= ================================ ============================================================================================== ===========
-Ubuntu dist               LL::NG version                     Secured                                                                                      Maintenance
-=========== ============= ================================ ============================================================================================== ===========
-*12.04*     *Precise*     `1.1.2 </documentation/1.1/>`__  |maybe| minor issue: CVE-2020-16093                                                            None
-*14.04*     *Trusty*      `1.2.5 </documentation/1.2/>`__  |maybe| minor issue: CVE-2020-16093                                                            None
-*16.04*     *Xenial*      `1.4.6 </documentation/1.4/>`__  |bad| **CVE-2019-12046**, CVE-2019-13031                                                       None
-*18.04*     *Bionic*      `1.9.16 </documentation/1.9/>`__ |bad| **CVE-2019-12046**, CVE-2019-13031, **CVE-2020-24660**, CVE-2023-44469                   None
-20.04       Focal  [9]_   `2.0.7 </documentation/2.0/>`__  |bad| **CVE-2020-24660**, **CVE-2021-35472**, CVE-2021-35473, CVE-2021-40874, CVE-2023-44469   None
-22.04       Jammy  [9]_   `2.0.13 </documentation/2.0/>`__ |maybe| minor issues: CVE-2021-40874, CVE-2023-28862, CVE-2023-44469                           None
-23.04       Lunar         `2.0.16 </documentation/2.0/>`__ |maybe| minor issues: CVE-2023-28862, CVE-2023-44469                                           None
-23.10       Mantic        `2.16.2 </documentation/2.0/>`__ |maybe| minor issue: CVE-2023-44469                                                            None
-24.04       Noble         `2.18.2 </documentation/2.0/>`__ |maybe| minor issue: CVE-2024-48933                                                            None
-=========== ============= ================================ ============================================================================================== ===========
+   Ubuntu version are included in "universe" branch [4]_, so not really security maintained. Prefer to use our repositories or Debian ones
+
+=========== ============= ================================ ==================================================================================================================================== ===========
+Ubuntu dist               LL::NG version                     Secured                                                                                                                            Maintenance
+=========== ============= ================================ ==================================================================================================================================== ===========
+*12.04*     *Precise*     *1.1.2*                          |maybe| minor issues                                                                                                                 None
+*14.04*     *Trusty*      *1.2.5*                          |maybe| minor issues                                                                                                                 None
+*16.04*     *Xenial*      *1.4.6*                          |bad| **CVE-2019-12046**, ...                                                                                                        None
+*18.04*     *Bionic*      `1.9.16 </documentation/1.9/>`__ |bad| **CVE-2019-12046**, **CVE-2020-24660**, ...                                                                                    None
+*20.04*     *Focal*       `2.0.7 </documentation/2.0/>`__  |bad| **CVE-2020-24660**, **CVE-2021-35472**, ...                                                                                    None
+22.04       Jammy *(LTS)* `2.0.13 </documentation/2.0/>`__ |maybe| minor issues: CVE-2021-40874, CVE-2023-28862, CVE-2023-44469, CVE-2024-52946, CVE-2024-52947, CVE-2024-52948, CVE-2025-31510 None
+24.04       Noble *(LTS)* `2.18.2 </documentation/2.0/>`__ |maybe| minor issues: CVE-2024-45160, CVE-2024-48933, CVE-2024-52946, CVE-2024-52947, CVE-2024-52948, CVE-2025-31510                 None
+25.04       Plucky        `2.20.2 </documentation/2.0/>`__ |maybe| minor issue: CVE-2025-31510                                                                                                  None
+=========== ============= ================================ ==================================================================================================================================== ===========
 
 Bug report
 ----------
@@ -135,24 +140,21 @@ Other
 .. [1]
    Possible `Extended LTS <https://wiki.debian.org/LTS/Extended>`__
 
-.. [3]
+.. [2]
    updated by `LL::NG Team </team>`__ until dependencies are compatible.
    Don't use backports unless you plan to update your system because
    backports are not covered by Debian Security Policy
 
-.. [5]
+.. [3]
    few days after release
 
-.. [8]
+.. [4]
    Ubuntu universe/multiverse branches are community maintained *(so not
    maintained by Canonical)*, but in fact nobody considers LL::NG security
    issues. See `this
    issue <https://bugs.launchpad.net/ubuntu/+source/lemonldap-ng/+bug/1829016>`__
    for example
 
-.. [9]
-   LTS
-
 .. |clean| image:: /icons/clean.png
    :width: 20px
 .. |bad| image:: /icons/bad.png
diff --git a/doc/sources/admin/parameterlist.rst b/doc/sources/admin/parameterlist.rst
index 846245332..a6719d867 100644
--- a/doc/sources/admin/parameterlist.rst
+++ b/doc/sources/admin/parameterlist.rst
@@ -25,7 +25,7 @@ SMTPPort                                                Fix SMTP port
 SMTPServer                                              SMTP Server                                                                          ?
 SMTPTLS                                                 TLS protocol to use with SMTP                                                        ?
 SMTPTLSOpts                                             TLS/SSL options for SMTP                                                             ?
-SSLAuthnLevel                                           SSL authentication level                                                             ?
+SSLAuthnLevel                                           Mutual TLS authentication level                                                      ?
 SSLIssuerVar                                                                                                                                 ?
 SSLVar                                                                                                                                       ?
 SSLVarIf                                                                                                                                     ?
@@ -335,7 +335,7 @@ lokiTenantHeader                                        Loki Tenant Header name
 lokiUrl                                                 Loki API                                                                             ?      ?       ?       ?
 lokiUserService                                         Loki (userLogger context)                                                            ?      ?       ?       ?
 lwpOpts                                                 Options passed to LWP::UserAgent                                                     ?
-lwpSslOpts                                              SSL options passed to LWP::UserAgent                                                 ?
+lwpSslOpts                                              TLS/SSL options passed to LWP::UserAgent                                             ?
 macros                                                  Macros                                                                               ?
 mail2fActivation                                        Mail second factor activation                                                        ?
 mail2fAuthnLevel                                        Authentication level for users authenticated by Mail second factor                   ?
@@ -701,8 +701,8 @@ slaveUserHeader
 soapConfigServer                                        Enable SOAP config server                                                            ?
 soapProxyUrn                                            SOAP URN for Proxy                                                                   ?                      ?
 soapSessionServer                                       Enable SOAP session server                                                           ?
-sslByAjax                                               Use Ajax request for SSL                                                             ?
-sslHost                                                 URL for SSL Ajax request                                                             ?
+sslByAjax                                               Use Ajax request for Mutual TLS Authentication                                       ?
+sslHost                                                 URL for Mutual TLS Authentication Ajax request                                       ?
 staticPrefix                                            Prefix of static files for HTML templates                                            ?                      ?
 statusQueueName                                         Status channel name                                                                         ?               ?
 stayConnected                                           Stay connected activation rule                                                       ?
diff --git a/doc/sources/admin/upgrade_2_x.rst b/doc/sources/admin/upgrade_2_x.rst
index 139c132f2..81950e3c6 100644
--- a/doc/sources/admin/upgrade_2_x.rst
+++ b/doc/sources/admin/upgrade_2_x.rst
@@ -15,7 +15,23 @@ Known issues
 Known regressions in the latest released version
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-No known issues.
+Because of an issue in LemonLDAP::NG 2.21.0, your CAS applications might have
+been erroneously created under the "CAS Servers" section as well.
+
+If you use both CAS applications and CAS servers on your LemonLDAP::NG install,
+we recommend waiting for 2.21.1 to be released.
+
+2.21.1
+------
+
+Make sure no bogus CAS servers have been created
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Because of an issue in LemonLDAP::NG 2.21.0, your CAS applications might have
+been erroneously created under the "CAS Servers" section as well.
+
+Remove all unwanted **CAS Servers** entries from the manager after upgrading to
+version 2.21.1 (or above) if this is the case.
 
 2.21.0
 ------
diff --git a/doc/sources/admin/websocketapplications.rst b/doc/sources/admin/websocketapplications.rst
index 64ab6ba75..33c3d5f42 100644
--- a/doc/sources/admin/websocketapplications.rst
+++ b/doc/sources/admin/websocketapplications.rst
@@ -17,6 +17,17 @@ The server response contains the answer to this challenge.
 Then, if everything is successful, the communication continues on top of TCP. The client and server can send requests from both side.
 
 
+Webserver configuration
+-----------------------
+
+Nginx does not require any specific configuration to handle WebSocket connections.
+
+If you use Apache, you need a recent version (2.4.47), and you need to add ``upgrade=websocket`` to the ``ProxyPass`` directive ::
+
+    ProxyPass / http://private-name/ upgrade=websocket
+
+Refer to :ref:`vhostapachereverse` for more details
+
 Protection by LemonLDAP::NG
 ---------------------------
 
@@ -28,10 +39,6 @@ The handler is set up as an HTTP/TCP reverse-proxy in front of the websocket app
 
 You can configure the :doc:`access rules and headers<writingrulesand_headers>` as usual.
 
-.. note::
-
-    This scenario has been tested with Nginx.
-
 - Only the initial HTTP handshake (request and response) is protected by LemonLDAP::NG. Later TCP traffic pass directly through Nginx reverse-proxy
 - LemonLDAP::NG access rules are evaluated during the initial HTTP handshake (request and response) that upgrades the communication to websocket
 - LemonLDAP::NG headers are sent during the initial HTTP handshake (request and response) that upgrades the communication to websocket
@@ -44,7 +51,7 @@ Be careful of the following scenario :
 
 The unprotected page must manage the 302 return code sent by the SSO portal
 
- 
+
 Load-testing
 ------------
 
diff --git a/e2e-tests/lemonldap-ng-ldap.ini b/e2e-tests/lemonldap-ng-ldap.ini
index a676fe2d4..909698a15 100644
--- a/e2e-tests/lemonldap-ng-ldap.ini
+++ b/e2e-tests/lemonldap-ng-ldap.ini
@@ -17,7 +17,7 @@ ldapBindPassword = admin
 checkXSS = 0
 portalSkin = bootstrap
 staticPrefix = /static
-languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe
+languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe, sk
 templateDir  = __pwd__/lemonldap-ng-portal/site/templates
 portalStatus = 1
 ;totp2fActivation = 1
diff --git a/e2e-tests/lemonldap-ng-sql.ini b/e2e-tests/lemonldap-ng-sql.ini
index 0fac08862..08732f16a 100644
--- a/e2e-tests/lemonldap-ng-sql.ini
+++ b/e2e-tests/lemonldap-ng-sql.ini
@@ -14,7 +14,7 @@ dbiChain = dbi:SQLite:dbname=__pwd__/e2e-tests/conf/config.db
 checkXSS = 0
 portalSkin = bootstrap
 staticPrefix = /static
-languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe
+languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe, sk
 templateDir  = __pwd__/lemonldap-ng-portal/site/templates
 portalStatus = 1
 ;totp2fActivation = 1
diff --git a/e2e-tests/lemonldap-ng.ini b/e2e-tests/lemonldap-ng.ini
index 2d0a6269b..aac86bb7d 100644
--- a/e2e-tests/lemonldap-ng.ini
+++ b/e2e-tests/lemonldap-ng.ini
@@ -23,7 +23,7 @@ dirName=__pwd__/e2e-tests/conf
 checkXSS = 1
 portalSkin = bootstrap
 staticPrefix = /static
-languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe
+languages    = fr, en, vi, it, ar, de, zh, es, pt, tr, zh_TW, pt_BR, he, ru, mfe, sk
 templateDir  = __pwd__/lemonldap-ng-portal/site/templates
 portalStatus = 1
 totp2fActivation = 1
diff --git a/lemonldap-ng-common/META.json b/lemonldap-ng-common/META.json
index dbe0495e8..64b2e5c91 100644
--- a/lemonldap-ng-common/META.json
+++ b/lemonldap-ng-common/META.json
@@ -31,6 +31,7 @@
             "Digest::HMAC_SHA1" : "0",
             "Email::Address::XS" : "0",
             "IO::String" : "0",
+            "LWP::Protocol::PSGI" : "0",
             "LWP::Protocol::https" : "0",
             "MIME::Entity" : "0",
             "Net::LDAP" : "0",
@@ -97,6 +98,6 @@
       ],
       "x_MailingList" : "mailto:lemonldap-ng-dev at ow2.org"
    },
-   "version" : "v2.21.0",
+   "version" : "v2.21.1",
    "x_serialization_backend" : "JSON::PP version 4.16"
 }
diff --git a/lemonldap-ng-common/META.yml b/lemonldap-ng-common/META.yml
index 686dd2eff..ceb5edd0f 100644
--- a/lemonldap-ng-common/META.yml
+++ b/lemonldap-ng-common/META.yml
@@ -12,6 +12,7 @@ build_requires:
   Digest::HMAC_SHA1: '0'
   Email::Address::XS: '0'
   IO::String: '0'
+  LWP::Protocol::PSGI: '0'
   LWP::Protocol::https: '0'
   MIME::Entity: '0'
   Net::LDAP: '0'
@@ -73,5 +74,5 @@ resources:
   bugtracker: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues
   homepage: https://lemonldap-ng.org/
   license: http://opensource.org/licenses/GPL-2.0
-version: v2.21.0
+version: v2.21.1
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/lemonldap-ng-common/Makefile.PL b/lemonldap-ng-common/Makefile.PL
index 341c14325..def2d0803 100644
--- a/lemonldap-ng-common/Makefile.PL
+++ b/lemonldap-ng-common/Makefile.PL
@@ -46,6 +46,7 @@ WriteMakefile(
         'Email::Address::XS'          => 0,
         'IO::String'                  => 0,
         'LWP::Protocol::https'        => 0,
+        'LWP::Protocol::PSGI'         => 0,
         'MIME::Entity'                => 0,
         'Net::LDAP'                   => 0,
         'SOAP::Lite'                  => 0,
diff --git a/lemonldap-ng-common/lemonldap-ng.ini b/lemonldap-ng-common/lemonldap-ng.ini
index 9505e0778..67846247f 100644
--- a/lemonldap-ng-common/lemonldap-ng.ini
+++ b/lemonldap-ng-common/lemonldap-ng.ini
@@ -194,7 +194,7 @@ staticPrefix = __PORTALSTATICDIR__
 templateDir  = __PORTALTEMPLATESDIR__
 
 ; languages: available languages for portal interface
-languages    = en, fr, vi, it, ar, de, fi, tr, pl, zh_TW, es, pt_BR, he, ru, mfe
+languages    = en, fr, vi, it, ar, de, fi, tr, pl, zh_TW, es, pt_BR, he, ru, mfe, sk
 
 ; II - Optional parameters (overwrite configuration)
 
@@ -377,7 +377,7 @@ staticPrefix = __MANAGERSTATICDIR__
 ; docPrefix: relative (or URL) location of embedded documentation
 docPrefix = __MANAGERDOCDIR__
 
-; instanceName: Display LLNG instance name 
+; instanceName: Display LLNG instance name
 ;instanceName = Demo
 ; customCSS: CSS file to customize Manager
 ;customCSS = css/custom.css
diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common.pm
index e6645aa89..b553eab93 100644
--- a/lemonldap-ng-common/lib/Lemonldap/NG/Common.pm
+++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common.pm
@@ -1,6 +1,6 @@
 package Lemonldap::NG::Common;
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 
 1;
 __END__
diff --git a/lemonldap-ng-common/scripts/encryptTotpSecrets b/lemonldap-ng-common/scripts/encryptTotpSecrets
index fd0c7c225..41aa204de 100755
--- a/lemonldap-ng-common/scripts/encryptTotpSecrets
+++ b/lemonldap-ng-common/scripts/encryptTotpSecrets
@@ -24,6 +24,8 @@ GetOptions(
 eval {
     POSIX::setgid( scalar( getgrnam('www-data') ) );
     POSIX::setuid( scalar( getpwnam('www-data') ) );
+    my (undef, undef, undef, undef, undef, undef, undef, $homedir, undef) = getpwnam('www-data');
+    $ENV{HOME} = $homedir if $homedir;
 };
 
 sub verbose {
diff --git a/lemonldap-ng-common/scripts/lemonldap-ng-cli b/lemonldap-ng-common/scripts/lemonldap-ng-cli
index d71b21b92..8866d966b 100755
--- a/lemonldap-ng-common/scripts/lemonldap-ng-cli
+++ b/lemonldap-ng-common/scripts/lemonldap-ng-cli
@@ -18,6 +18,8 @@ my $action;
 eval {
     POSIX::setgid( scalar( getgrnam($opt_group) ) );
     POSIX::setuid( scalar( getpwnam($opt_user) ) );
+    my (undef, undef, undef, undef, undef, undef, undef, $homedir, undef) = getpwnam($opt_user);
+    $ENV{HOME} = $homedir if $homedir;
 };
 
 for ( my $i = 0 ; $i < @ARGV ; $i++ ) {
diff --git a/lemonldap-ng-common/scripts/lemonldap-ng-sessions b/lemonldap-ng-common/scripts/lemonldap-ng-sessions
index 55caa714e..975e42a22 100755
--- a/lemonldap-ng-common/scripts/lemonldap-ng-sessions
+++ b/lemonldap-ng-common/scripts/lemonldap-ng-sessions
@@ -42,6 +42,8 @@ eval {
     no warnings;
     POSIX::setgid( scalar( getgrnam($opt_group) ) );
     POSIX::setuid( scalar( getpwnam($opt_user) ) );
+    my (undef, undef, undef, undef, undef, undef, undef, $homedir, undef) = getpwnam($opt_user);
+    $ENV{HOME} = $homedir if $homedir;
 };
 
 my $action = shift @ARGV;
diff --git a/lemonldap-ng-common/scripts/rotateOidcKeys b/lemonldap-ng-common/scripts/rotateOidcKeys
index 389e44e1e..799e83bd5 100755
--- a/lemonldap-ng-common/scripts/rotateOidcKeys
+++ b/lemonldap-ng-common/scripts/rotateOidcKeys
@@ -35,6 +35,8 @@ eval {
     no warnings;
     POSIX::setgid( scalar( getgrnam($opt_group) ) );
     POSIX::setuid( scalar( getpwnam($opt_user) ) );
+    my (undef, undef, undef, undef, undef, undef, undef, $homedir, undef) = getpwnam($opt_user);
+    $ENV{HOME} = $homedir if $homedir;
 };
 
 my $debug = $opts->{debug};
diff --git a/lemonldap-ng-handler/META.json b/lemonldap-ng-handler/META.json
index c2260aa12..e883cbd0e 100644
--- a/lemonldap-ng-handler/META.json
+++ b/lemonldap-ng-handler/META.json
@@ -45,7 +45,7 @@
          },
          "requires" : {
             "LWP::UserAgent" : "0",
-            "Lemonldap::NG::Common" : "v2.21.0",
+            "Lemonldap::NG::Common" : "v2.21.1",
             "Mouse" : "0",
             "URI" : "0"
          }
@@ -63,6 +63,6 @@
       ],
       "x_MailingList" : "mailto:lemonldap-ng-dev at ow2.org"
    },
-   "version" : "v2.21.0",
+   "version" : "v2.21.1",
    "x_serialization_backend" : "JSON::PP version 4.16"
 }
diff --git a/lemonldap-ng-handler/META.yml b/lemonldap-ng-handler/META.yml
index c41b1a86c..7d70dc42a 100644
--- a/lemonldap-ng-handler/META.yml
+++ b/lemonldap-ng-handler/META.yml
@@ -30,7 +30,7 @@ recommends:
   SOAP::Lite: '0'
 requires:
   LWP::UserAgent: '0'
-  Lemonldap::NG::Common: v2.21.0
+  Lemonldap::NG::Common: v2.21.1
   Mouse: '0'
   URI: '0'
 resources:
@@ -39,5 +39,5 @@ resources:
   bugtracker: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues
   homepage: https://lemonldap-ng.org/
   license: http://opensource.org/licenses/GPL-2.0
-version: v2.21.0
+version: v2.21.1
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/lemonldap-ng-handler/Makefile.PL b/lemonldap-ng-handler/Makefile.PL
index a09ab6588..6d7762ded 100644
--- a/lemonldap-ng-handler/Makefile.PL
+++ b/lemonldap-ng-handler/Makefile.PL
@@ -39,7 +39,7 @@ WriteMakefile(
         },
     },
     PREREQ_PM => {
-        'Lemonldap::NG::Common' => '2.21.0',
+        'Lemonldap::NG::Common' => '2.21.1',
         'LWP::UserAgent'        => 0,
         'Mouse'                 => 0,
         'URI'                   => 0,
diff --git a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler.pm b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler.pm
index 961eca5ee..81d23f29f 100644
--- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler.pm
+++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler.pm
@@ -3,7 +3,7 @@ package Lemonldap::NG::Handler;
 # Use the appropriate handler
 # For Apache, use Lemonldap::NG::Handler::ApacheMP2
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 
 1;
 
diff --git a/lemonldap-ng-manager/META.json b/lemonldap-ng-manager/META.json
index 8cfc54e99..4128c3567 100644
--- a/lemonldap-ng-manager/META.json
+++ b/lemonldap-ng-manager/META.json
@@ -45,8 +45,8 @@
             "Convert::PEM" : "0",
             "Crypt::OpenSSL::RSA" : "0",
             "LWP::UserAgent" : "0",
-            "Lemonldap::NG::Common" : "v2.21.0",
-            "Lemonldap::NG::Handler" : "v2.21.0"
+            "Lemonldap::NG::Common" : "v2.21.1",
+            "Lemonldap::NG::Handler" : "v2.21.1"
          }
       }
    },
@@ -62,6 +62,6 @@
       ],
       "x_MailingList" : "mailto:lemonldap-ng-dev at ow2.org"
    },
-   "version" : "v2.21.0",
+   "version" : "v2.21.1",
    "x_serialization_backend" : "JSON::PP version 4.16"
 }
diff --git a/lemonldap-ng-manager/META.yml b/lemonldap-ng-manager/META.yml
index b0fb19b14..673800499 100644
--- a/lemonldap-ng-manager/META.yml
+++ b/lemonldap-ng-manager/META.yml
@@ -30,13 +30,13 @@ requires:
   Convert::PEM: '0'
   Crypt::OpenSSL::RSA: '0'
   LWP::UserAgent: '0'
-  Lemonldap::NG::Common: v2.21.0
-  Lemonldap::NG::Handler: v2.21.0
+  Lemonldap::NG::Common: v2.21.1
+  Lemonldap::NG::Handler: v2.21.1
 resources:
   MailingList: mailto:lemonldap-ng-dev at ow2.org
   X_twitter: https://twitter.com/lemonldapng
   bugtracker: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues
   homepage: https://lemonldap-ng.org/
   license: http://opensource.org/licenses/GPL-2.0
-version: v2.21.0
+version: v2.21.1
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/lemonldap-ng-manager/Makefile.PL b/lemonldap-ng-manager/Makefile.PL
index 930c54e18..196f94a0a 100644
--- a/lemonldap-ng-manager/Makefile.PL
+++ b/lemonldap-ng-manager/Makefile.PL
@@ -38,8 +38,8 @@ WriteMakefile(
     PREREQ_PM => {
         'Convert::PEM'           => 0,
         'Crypt::OpenSSL::RSA'    => 0,
-        'Lemonldap::NG::Common'  => '2.21.0',
-        'Lemonldap::NG::Handler' => '2.21.0',
+        'Lemonldap::NG::Common'  => '2.21.1',
+        'Lemonldap::NG::Handler' => '2.21.1',
         'LWP::UserAgent'         => 0,
     },    # e.g., Module::Name => 1.1
     (
diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager.pm
index 863c0294a..2081e73cb 100644
--- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager.pm
+++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager.pm
@@ -17,7 +17,7 @@ use JSON;
 use Lemonldap::NG::Common::Conf::Constants;
 use Lemonldap::NG::Common::PSGI::Constants;
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 
 extends qw(
   Lemonldap::NG::Handler::PSGI::Router
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 abab81db6..b11dabc6b 100644
--- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm
+++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm
@@ -1463,7 +1463,7 @@ sub attributes {
         },
         lwpSslOpts => {
             type          => 'keyTextContainer',
-            documentation => 'SSL options passed to LWP::UserAgent',
+            documentation => 'TLS/SSL options passed to LWP::UserAgent',
         },
 
         # CrowdSec plugin
@@ -3800,7 +3800,7 @@ sub attributes {
                 { k => 'PAM',         v => 'PAM' },
                 { k => 'Radius',      v => 'Radius' },
                 { k => 'REST',        v => 'REST' },
-                { k => 'SSL',         v => 'SSL' },
+                { k => 'SSL',         v => 'mTLS' },
                 { k => 'Twitter',     v => 'Twitter' },
                 { k => 'WebID',       v => 'WebID (deprecated)' },
                 { k => 'WebAuthn',    v => 'WebAuthn' },
@@ -4163,7 +4163,7 @@ m{^(?:ldapi://[^/]*/?|\w[\w\-\.]*(?::\d{1,5})?|ldap(?:s|\+tls)?://\w[\w\-\.]*(?:
         SSLAuthnLevel => {
             type          => 'int',
             default       => 5,
-            documentation => 'SSL authentication level',
+            documentation => 'Mutual TLS authentication level',
         },
         SSLVar => {
             type    => 'text',
@@ -4181,11 +4181,11 @@ m{^(?:ldapi://[^/]*/?|\w[\w\-\.]*(?::\d{1,5})?|ldap(?:s|\+tls)?://\w[\w\-\.]*(?:
         sslByAjax => {
             type          => 'bool',
             default       => 0,
-            documentation => 'Use Ajax request for SSL',
+            documentation => 'Use Ajax request for Mutual TLS Authentication',
         },
         sslHost => {
             type          => 'url',
-            documentation => 'URL for SSL Ajax request',
+            documentation => 'URL for Mutual TLS Authentication Ajax request',
         },
 
         # CAS
@@ -4619,7 +4619,7 @@ m{^(?:ldapi://[^/]*/?|\w[\w\-\.]*(?::\d{1,5})?|ldap(?:s|\+tls)?://\w[\w\-\.]*(?:
                     { k => 'Remote',        v => 'Remote' },
                     { k => 'SAML',          v => 'SAML v2' },
                     { k => 'Slave',         v => 'Slave' },
-                    { k => 'SSL',           v => 'SSL' },
+                    { k => 'SSL',           v => 'mTLS' },
                     { k => 'Twitter',       v => 'Twitter' },
                     { k => 'WebID',         v => 'WebID (deprecated)' },
                     { k => 'WebAuthn',      v => 'WebAuthn' },
@@ -4682,7 +4682,7 @@ m{^(?:ldapi://[^/]*/?|\w[\w\-\.]*(?::\d{1,5})?|ldap(?:s|\+tls)?://\w[\w\-\.]*(?:
                 { k => 'PAM',      v => 'PAM' },
                 { k => 'Radius',   v => 'Radius' },
                 { k => 'REST',     v => 'REST' },
-                { k => 'SSL',      v => 'SSL' },
+                { k => 'SSL',      v => 'mTLS' },
                 { k => 'Twitter',  v => 'Twitter' },
                 { k => 'WebID',    v => 'WebID (deprecated)' },
                 { k => 'WebAuthn', v => 'WebAuthn' },
diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/CTrees.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/CTrees.pm
index c8543afdb..4ec3c69e5 100644
--- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/CTrees.pm
+++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/CTrees.pm
@@ -347,6 +347,7 @@ sub cTrees {
                     'casSrvMetaDataOptionsUrl',
                     'casSrvMetaDataOptionsRenew',
                     'casSrvMetaDataOptionsGateway',
+                    'casSrvMetaDataOptionsSamlValidate',
                     'casSrvMetaDataOptionsComment'
                 ]
             },
@@ -371,7 +372,6 @@ sub cTrees {
                     'casAppMetaDataOptionsService',
                     'casAppMetaDataOptionsUserAttribute',
                     'casAppMetaDataOptionsAllowProxy',
-                    'casSrvMetaDataOptionsSamlValidate',
                     'casAppMetaDataOptionsLogout',
                     'casAppMetaDataOptionsAuthnLevel',
                     'casAppMetaDataOptionsRule',
diff --git a/lemonldap-ng-manager/scripts/lmConfigEditor b/lemonldap-ng-manager/scripts/lmConfigEditor
index 05f32a84b..21d1d64db 100755
--- a/lemonldap-ng-manager/scripts/lmConfigEditor
+++ b/lemonldap-ng-manager/scripts/lmConfigEditor
@@ -29,6 +29,8 @@ GetOptions(
 eval {
     setgid( ( getgrnam($opt_group) )[2] );
     setuid( ( getpwnam($opt_user) )[2] );
+    my (undef, undef, undef, undef, undef, undef, undef, $homedir, undef) = getpwnam($opt_user);
+    $ENV{HOME} = $homedir if $homedir;
     print STDERR "Running as uid $EUID and gid $EGID\n";
 };
 
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/ar.json b/lemonldap-ng-manager/site/htdocs/static/languages/ar.json
index 872e6c7a7..fdeb94c78 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/ar.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/ar.json
@@ -227,7 +227,7 @@
 "checkUserIdRule":"Identities use rule",
 "checkUserSearchAttributes":"Attributes used for searching sessions",
 "checkUserUnrestrictedUsersRule":"Unrestricted users rule",
-"checkUsers":"Check user SSO profile",
+"checkUsers":"?????? ?? ??? ????? SSO ???????? ",
 "checkXSS":"???? ?? ????? XSS",
 "checkboxes":"Checkboxes",
 "choiceParams":"???????????????",
@@ -273,7 +273,7 @@
 "create":"????",
 "crossOrigineResourceSharing":"Cross-Origin Resource Sharing",
 "crowdsec":"?????",
-"crowdsecAction":"Action",
+"crowdsecAction":"?????",
 "crowdsecIgnoreFailures":"Ignore Crowdsec failures",
 "crowdsecKey":"????? ?? API",
 "crowdsecUrl":"Base URL of local API",
@@ -336,7 +336,7 @@
 "demoParams":"????? ????????",
 "description":"????????",
 "dest":"Recipient",
-"devOpsCheck":"Check DevOps handler file",
+"devOpsCheck":"?????? ?? ??? DevOps",
 "diffViewer":"??????? ???????",
 "diffWithPrevious":"????? ?? ??????",
 "disablePersistentStorage":"Disable storage",
@@ -405,7 +405,7 @@
 "githubParams":"GitHub Parameters",
 "githubScope":"????",
 "githubUserField":"Field containing user identifier",
-"globalLogout":"Global logout",
+"globalLogout":"????? ???? ?????",
 "globalLogoutCustomParam":"Custom parameter",
 "globalLogoutRule":"?????",
 "globalLogoutTimer":"???? ?????? ?????",
@@ -572,7 +572,8 @@
 "logout":"????? ??????",
 "logoutServices":"????? ?????? ???????",
 "lwpOpts":"?????? ?????? ??????",
-"lwpSslOpts":"?????? ??? ?????? ??????",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"?????",
 "mail2f":"Mail second factor",
 "mail2fActivation":"?????",
@@ -689,7 +690,7 @@
 "offlineSessions":"Offline sessions",
 "oidcAttribute":"?????? OIDC",
 "oidcAuthnLevel":"????? ????? ??????",
-"oidcConsents":"OpenID Connect consents",
+"oidcConsents":"??????? OpenID Connect",
 "oidcDropCspHeaders":"Drop CSP headers from OIDC responses",
 "oidcOP":" ????? ???? ?????? ???????",
 "oidcOPMetaDataExportedVars":"?????? ???????",
@@ -937,7 +938,7 @@
 "portalDisplayGeneratePassword":"Display generate password box",
 "portalDisplayLoginHistory":"??? ????? ??????",
 "portalDisplayLogout":"????? ??????",
-"portalDisplayOidcConsents":"OIDC consents",
+"portalDisplayOidcConsents":"??????? OIDC",
 "portalDisplayOrder":"Display order",
 "portalDisplayPasswordPolicy":"Display policy in password form",
 "portalDisplayRefreshMyRights":"Display rights refresh link",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"????? ????",
 "sslByAjax":"??????? ??? ?????",
-"sslHost":"????? ??? ?? ?? ??",
-"sslParams":"?????? ? ? ? ",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"????? ?????",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/en.json b/lemonldap-ng-manager/site/htdocs/static/languages/en.json
index f7c6ee956..94de1e9ca 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/en.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/en.json
@@ -572,7 +572,8 @@
 "logout":"Logout",
 "logoutServices":"Logout forward",
 "lwpOpts":"Options for server requests",
-"lwpSslOpts":"SSL options for server requests",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macros",
 "mail2f":"Mail second factor",
 "mail2fActivation":"Activation",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"Special rule",
 "sslByAjax":"Use Ajax request",
-"sslHost":"Ajax SSL URL",
-"sslParams":"SSL parameters",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"SSO sessions",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/es.json b/lemonldap-ng-manager/site/htdocs/static/languages/es.json
index 3b5941ea0..94d2337ba 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/es.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/es.json
@@ -7,7 +7,7 @@
 "AuthLDAPFilter":"Filtro de autentificaci?n",
 "Configuration":"Configuraci?n",
 "CrowdSecPlugin":"CrowdSec Bouncer",
-"Entropycheck":"Check password entropy",
+"Entropycheck":"Verificar la entrop?a de la contrase?a ",
 "HIBPcheck":"Check HIBP API",
 "LDAPFilter":"Filtro por defecto",
 "OpenIDConnect":"OpenID Connect",
@@ -48,25 +48,25 @@
 "_user":"Conexi?n",
 "_userDB":"Usuario",
 "_utime":"Sello de tiempo de la sesi?n",
-"activationrule":"Activation rule",
+"activationrule":"Regla de activaci?n ",
 "activeTimer":"Hora de autoaceptaci?n",
 "actives":"Habilitado",
 "adParams":"Par?metros del Directorio Activo",
-"adaptativeAuthenticationLevelRules":"Adaptative authentication rules",
+"adaptativeAuthenticationLevelRules":"Reglas de autentificaci?n adaptativas ",
 "addAppCasPartner":"A?adir aplicaci?n CAS",
 "addIDPSamlPartner":"A?adir IDP SAML",
 "addOidcAttribute":"A?adir atributo",
 "addOidcOp":"A?adir OpenID Connect Provider",
-"addOidcRp":"Add OpenID Connect Relying Party",
-"addSPSamlPartner":"Add SAML SP",
+"addOidcRp":"Agregar OpenID Connect Relying Party",
+"addSPSamlPartner":"Agregar SAML SP",
 "addSamlAttribute":"A?adir atributo",
 "addSrvCasPartner":"A?adir servidor CAS",
 "addTOTPKey":"A?adir clave TOTP",
 "addVhost":"A?adir virtualhost",
 "advancedParams":"Par?metros avanzados",
-"algorithms":"Algorithms",
+"algorithms":"Algoritmos ",
 "allowedMarkups":"Marcas permitidas:",
-"always":"Always",
+"always":"Siempre",
 "apacheAuthnLevel":"Nivel de autentificaci?n",
 "apacheParams":"Par?metros Apache",
 "api":"API",
@@ -76,14 +76,14 @@
 "applicationList":"Categor?as y aplicaciones",
 "applyResult":"Resultado de la solicitud",
 "appsInThisCat":"Aplicaciones en esta categor?a",
-"array":"Array",
+"array":"Matriz",
 "attributeName":"Attribute name",
 "attributesAndMacros":"Atributos y Macros",
 "authAndUserdb":"Authz and user DB",
 "authChain":"Cadena de autentificaci?n",
 "authChoice":"Opci?n de autentificaci?n",
-"authChoiceAuthBasic":"Choice used for password authentication",
-"authChoiceFindUser":"Choice used for searching user account",
+"authChoiceAuthBasic":"Opci?n utilizada para autentificarse v?a la contrase?a ",
+"authChoiceFindUser":"Opci?n utilizada para buscar la cuenta del usuario ",
 "authChoiceModules":"M?dulos permitidos",
 "authChoiceParam":"Par?metro URL",
 "authChoiceSelectOnly":"Auto-select only method",
@@ -572,7 +572,8 @@
 "logout":"Desconexi?n",
 "logoutServices":"Logout forward",
 "lwpOpts":"Opciones para solicitudes de servidor",
-"lwpSslOpts":"Opciones SSL para solicitudes de servidor",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macros",
 "mail2f":"Correo segundo factor",
 "mail2fActivation":"Activaci?n",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"Regla especial",
 "sslByAjax":"Usar solicitud Ajax",
-"sslHost":"URL SSL Ajax",
-"sslParams":"Par?metros SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Sesiones SSO",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/fr.json b/lemonldap-ng-manager/site/htdocs/static/languages/fr.json
index e0473063f..ff18a414f 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/fr.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/fr.json
@@ -572,7 +572,8 @@
 "logout":"D?connexion",
 "logoutServices":"Transfert de la d?connexion",
 "lwpOpts":"Options pour les requ?tes serveur",
-"lwpSslOpts":"Options SSL pour les requ?tes serveur",
+"lwpSslOpts":"Options TLS/SSL pour les requ?tes serveur",
+"mTLS":"Authentification mutuelle par TLS",
 "macros":"Macros",
 "mail2f":"Second facteur par mail",
 "mail2fActivation":"Activation",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Serveur de sessions",
 "specialRule":"R?gle sp?cifique",
 "sslByAjax":"Utiliser une requ?te Ajax",
-"sslHost":"URL SSL pour Ajax",
-"sslParams":"Param?tres SSL",
+"sslHost":"URL mTLS pour Ajax",
+"sslParams":"Param?tres mTLS",
 "ssoSessions":"Sessions SSO",
 "stateCheck":"V?rification de l'?tat",
 "stayConnect":"Navigateur de confiance",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/he.json b/lemonldap-ng-manager/site/htdocs/static/languages/he.json
index 981935f31..336f367a4 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/he.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/he.json
@@ -572,7 +572,8 @@
 "logout":"?????",
 "logoutServices":"Logout forward",
 "lwpOpts":"???????? ?????? ???",
-"lwpSslOpts":"???????? SSL ?????? ???",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"?????? ?????",
 "mail2f":"Mail second factor",
 "mail2fActivation":"?????",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"??? ?????",
 "specialRule":"??? ?????",
 "sslByAjax":"?????? ????? Ajax",
-"sslHost":"Ajax SSL URL",
-"sslParams":"????? SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"SSO sessions",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/it.json b/lemonldap-ng-manager/site/htdocs/static/languages/it.json
index 0945d5f1b..40e4c273a 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/it.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/it.json
@@ -572,7 +572,8 @@
 "logout":"Logout",
 "logoutServices":"Trasmissione logout",
 "lwpOpts":"Opzioni per le richieste del server",
-"lwpSslOpts":"Opzioni SSL per le richieste del server",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macro",
 "mail2f":"Mail secondo fattore",
 "mail2fActivation":"Attivazione",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"Regola speciale",
 "sslByAjax":"Utilizzare la richiesta Ajax",
-"sslHost":"URL di Ajax SSL",
-"sslParams":"Parametri SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Sessioni SSO",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/pl.json b/lemonldap-ng-manager/site/htdocs/static/languages/pl.json
index 7fe77cc8e..ea159230c 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/pl.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/pl.json
@@ -572,7 +572,8 @@
 "logout":"Wyloguj",
 "logoutServices":"Przekazywanie wylogowania",
 "lwpOpts":"Opcje ??da? serwera",
-"lwpSslOpts":"Opcje SSL dla ??da? serwera",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Makra",
 "mail2f":"Drugi czynnik e-mail",
 "mail2fActivation":"Aktywacja",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Serwer sesji",
 "specialRule":"Regu?a specjalna",
 "sslByAjax":"U?yj ??dania Ajax",
-"sslHost":"Ajax SSL URL",
-"sslParams":"Parametry SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Sesje jednokrotnego logowania",
 "stateCheck":"Sprawd? stan",
 "stayConnect":"Zaufana przegl?darka",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/pt.json b/lemonldap-ng-manager/site/htdocs/static/languages/pt.json
index dae4559d8..2942d48a1 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/pt.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/pt.json
@@ -572,7 +572,8 @@
 "logout":"Sair",
 "logoutServices":"Encaminhamento do Logout",
 "lwpOpts":"Op??es para requisi??es ao servidor",
-"lwpSslOpts":"Op??es SSL para as requisi??es ao servidor",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macros",
 "mail2f":"Segundo fator por correio",
 "mail2fActivation":"Ativa??o",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Servidor de sess?o",
 "specialRule":"Regra especial",
 "sslByAjax":"Use requisi??o AJAX",
-"sslHost":"Ajax SSL URL",
-"sslParams":"Par?metros SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Sess?es SSO",
 "stateCheck":"Verificar situa??o",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/pt_BR.json b/lemonldap-ng-manager/site/htdocs/static/languages/pt_BR.json
index 1b32cb1b1..4d11d1063 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/pt_BR.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/pt_BR.json
@@ -572,7 +572,8 @@
 "logout":"Sair",
 "logoutServices":"Encaminhamento do Logout",
 "lwpOpts":"Op??es para requisi??es ao servidor",
-"lwpSslOpts":"Op??es SSL para as requisi??es ao servidor",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macros",
 "mail2f":"Segundo fator por correio",
 "mail2fActivation":"Ativa??o",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Servidor de sess?o",
 "specialRule":"Regra especial",
 "sslByAjax":"Use requisi??o AJAX",
-"sslHost":"Ajax SSL URL",
-"sslParams":"Par?metros SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Sess?es SSO",
 "stateCheck":"Verificar situa??o",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/ru.json b/lemonldap-ng-manager/site/htdocs/static/languages/ru.json
index bfe7658f8..5329dba04 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/ru.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/ru.json
@@ -572,7 +572,8 @@
 "logout":"?????",
 "logoutServices":"????? ?? ???????",
 "lwpOpts":"???????? ???????? ? ???????",
-"lwpSslOpts":"????????? SSL ??? ???????? ? ???????",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"???????",
 "mail2f":"?????? ?????? ?????",
 "mail2fActivation":"?????????",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"?????? ???????",
 "specialRule":"?????? ???????",
 "sslByAjax":"???????????? ?????? Ajax",
-"sslHost":"Ajax SSL URL",
-"sslParams":"????????? SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"?????? SSO",
 "stateCheck":"????????? ??????",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/tr.json b/lemonldap-ng-manager/site/htdocs/static/languages/tr.json
index 6c3003c4c..9b1fa250c 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/tr.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/tr.json
@@ -572,7 +572,8 @@
 "logout":"??k?? Yap",
 "logoutServices":"??k?? yap",
 "lwpOpts":"Sunucu istekleri i?in se?enekler",
-"lwpSslOpts":"Sunucu istekleri i?in SSL se?enekleri",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Makrolar",
 "mail2f":"E-posta ile ikinci fakt?r",
 "mail2fActivation":"Aktivasyon",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Oturum sunucusu",
 "specialRule":"?zel kural",
 "sslByAjax":"Ajax iste?i kullan",
-"sslHost":"Ajax SSL URL",
-"sslParams":"SSL parametreleri",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"TOA oturumlar?",
 "stateCheck":"Durum kontrol?",
 "stayConnect":"G?venilir taray?c?",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/vi.json b/lemonldap-ng-manager/site/htdocs/static/languages/vi.json
index 1aef08c09..88bf7048c 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/vi.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/vi.json
@@ -572,7 +572,8 @@
 "logout":"??ng xu?t",
 "logoutServices":"Chuy?n ti?p ??ng xu?t",
 "lwpOpts":"T?y ch?n cho y?u c?u m?y ch?",
-"lwpSslOpts":"T?y ch?n SSL cho y?u c?u m?y ch?",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"Macros",
 "mail2f":"Th? y?u t? th? hai",
 "mail2fActivation":"K?ch ho?t",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"m?y ch? phi?n",
 "specialRule":"Quy t?c ??c bi?t",
 "sslByAjax":"S? d?ng y?u c?u Ajax",
-"sslHost":"URL c?a Ajax SSL",
-"sslParams":"Tham s? SSL",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"Phi?n SSO",
 "stateCheck":"ki?m tra tr?ng th?i",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/zh.json b/lemonldap-ng-manager/site/htdocs/static/languages/zh.json
index 37b198d87..bf37f03b3 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/zh.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/zh.json
@@ -572,7 +572,8 @@
 "logout":"????",
 "logoutServices":"????",
 "lwpOpts":"????????",
-"lwpSslOpts":"?????? SSL ??",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"??",
 "mail2f":"??????",
 "mail2fActivation":"??",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"????",
 "sslByAjax":"?? Ajax ??",
-"sslHost":"Ajax SSL URL",
-"sslParams":"SSL ??",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"SSO ????",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/zh_TW.json b/lemonldap-ng-manager/site/htdocs/static/languages/zh_TW.json
index f5e6f1737..b072a48a6 100644
--- a/lemonldap-ng-manager/site/htdocs/static/languages/zh_TW.json
+++ b/lemonldap-ng-manager/site/htdocs/static/languages/zh_TW.json
@@ -572,7 +572,8 @@
 "logout":"??",
 "logoutServices":"????",
 "lwpOpts":"????????",
-"lwpSslOpts":"?????? SSL ??",
+"lwpSslOpts":"TLS/SSL options for server requests",
+"mTLS":"Mutual TLS authentication",
 "macros":"??",
 "mail2f":"??????",
 "mail2fActivation":"??",
@@ -1281,8 +1282,8 @@
 "soapSessionServer":"Session server",
 "specialRule":"????",
 "sslByAjax":"?? Ajax ??",
-"sslHost":"Ajax SSL URL",
-"sslParams":"SSL ??",
+"sslHost":"Ajax mTLS URL",
+"sslParams":"mTLS parameters",
 "ssoSessions":"SSO ????",
 "stateCheck":"Check state",
 "stayConnect":"Trusted browser",
diff --git a/lemonldap-ng-portal/MANIFEST b/lemonldap-ng-portal/MANIFEST
index 68d2b46cd..1f058d9bd 100644
--- a/lemonldap-ng-portal/MANIFEST
+++ b/lemonldap-ng-portal/MANIFEST
@@ -419,6 +419,7 @@ site/htdocs/static/common/pt.png
 site/htdocs/static/common/pt_BR.png
 site/htdocs/static/common/ro.png
 site/htdocs/static/common/ru.png
+site/htdocs/static/common/sk.png
 site/htdocs/static/common/tr.png
 site/htdocs/static/common/vi.png
 site/htdocs/static/common/zh.png
@@ -436,6 +437,7 @@ site/htdocs/static/languages/pl.json
 site/htdocs/static/languages/pt.json
 site/htdocs/static/languages/pt_BR.json
 site/htdocs/static/languages/ru.json
+site/htdocs/static/languages/sk.json
 site/htdocs/static/languages/tr.json
 site/htdocs/static/languages/vi.json
 site/htdocs/static/languages/zh.json
@@ -553,6 +555,7 @@ site/templates/common/mail/pl.json
 site/templates/common/mail/pt.json
 site/templates/common/mail/pt_BR.json
 site/templates/common/mail/ru.json
+site/templates/common/mail/sk.json
 site/templates/common/mail/tr.json
 site/templates/common/mail/vi.json
 site/templates/common/mail/zh.json
@@ -759,6 +762,7 @@ t/32-OIDC-OP-claims-in-idtoken.t
 t/32-OIDC-Opaque-Token.t
 t/32-OIDC-Password-Grant-with-Bruteforce-and-Choice.t
 t/32-OIDC-Password-Grant.t
+t/32-OIDC-prompt-none.t
 t/32-OIDC-redirect_uri-filter.t
 t/32-OIDC-Refresh-Token.t
 t/32-OIDC-Register-with-bad-redirect-uri.t
diff --git a/lemonldap-ng-portal/META.json b/lemonldap-ng-portal/META.json
index b803d7e77..c76f12e56 100644
--- a/lemonldap-ng-portal/META.json
+++ b/lemonldap-ng-portal/META.json
@@ -94,7 +94,7 @@
          },
          "requires" : {
             "Clone" : "0",
-            "Lemonldap::NG::Handler" : "v2.21.0",
+            "Lemonldap::NG::Handler" : "v2.21.1",
             "Regexp::Assemble" : "0"
          }
       }
@@ -111,6 +111,6 @@
       ],
       "x_MailingList" : "mailto:lemonldap-ng-dev at ow2.org"
    },
-   "version" : "v2.21.0",
+   "version" : "v2.21.1",
    "x_serialization_backend" : "JSON::PP version 4.16"
 }
diff --git a/lemonldap-ng-portal/META.yml b/lemonldap-ng-portal/META.yml
index 39f955173..183e03d10 100644
--- a/lemonldap-ng-portal/META.yml
+++ b/lemonldap-ng-portal/META.yml
@@ -79,7 +79,7 @@ recommends:
   Web::ID: '0'
 requires:
   Clone: '0'
-  Lemonldap::NG::Handler: v2.21.0
+  Lemonldap::NG::Handler: v2.21.1
   Regexp::Assemble: '0'
 resources:
   MailingList: mailto:lemonldap-ng-dev at ow2.org
@@ -87,5 +87,5 @@ resources:
   bugtracker: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues
   homepage: https://lemonldap-ng.org/
   license: http://opensource.org/licenses/GPL-2.0
-version: v2.21.0
+version: v2.21.1
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff --git a/lemonldap-ng-portal/Makefile.PL b/lemonldap-ng-portal/Makefile.PL
index 6301cec55..dcf0090c5 100644
--- a/lemonldap-ng-portal/Makefile.PL
+++ b/lemonldap-ng-portal/Makefile.PL
@@ -88,7 +88,7 @@ WriteMakefile(
     },
     PREREQ_PM => {
         'Clone'                  => 0,
-        'Lemonldap::NG::Handler' => '2.21.0',
+        'Lemonldap::NG::Handler' => '2.21.1',
         'Regexp::Assemble'       => 0,
     },
     (
diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal.pm
index 79aa1b666..64efa2e27 100644
--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal.pm
+++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal.pm
@@ -1,7 +1,7 @@
 # Alias for Lemonldap::NG::Portal::Main
 package Lemonldap::NG::Portal;
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 use Lemonldap::NG::Portal::Main;
 use base 'Lemonldap::NG::Portal::Main';
 
diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm
index a50ca6758..185b3b590 100644
--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm
+++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm
@@ -303,7 +303,7 @@ sub run {
     return PE_ERROR;
 }
 
-sub _authorizeEndpoint {
+sub _checkErrorsInAuthorizeEndpoint {
     my ( $self, $req ) = @_;
 
     # Get and save parameters
@@ -569,6 +569,38 @@ sub _authorizeEndpoint {
         );
     }
 
+    # Check scope validity
+    # We use a slightly more relaxed version of
+    # https://tools.ietf.org/html/rfc6749#appendix-A.4
+    # To be tolerant of user error (trailing spaces, etc.)
+    # Scope names are restricted to printable ASCII characters,
+    # excluding double quote and backslash
+    unless ( $oidc_request->{'scope'} =~ /^[\x20\x21\x23-\x5B\x5D-\x7E]*$/ ) {
+        return $self->_failAuthorize( $req,
+            msg => "Submitted scope is not valid" );
+    }
+
+    # Check openid scope
+    unless ( $self->_hasScope( 'openid', $oidc_request->{'scope'} ) ) {
+        return $self->_failAuthorize( $req, msg => "No openid scope found" );
+    }
+    $req->data->{_oidc_request} = $oidc_request;
+    $req->data->{_oidc_rp}      = $rp;
+    $req->data->{_oidc_flow}    = $flow;
+    return ();
+}
+
+sub _authorizeEndpoint {
+    my ( $self, $req ) = @_;
+
+    my $res = $self->_checkErrorsInAuthorizeEndpoint($req);
+    return $res if $res;
+    my $oidc_request  = $req->data->{_oidc_request};
+    my $rp            = $req->data->{_oidc_rp};
+    my $flow          = $req->data->{_oidc_flow};
+    my $client_id     = $oidc_request->{client_id};
+    my $response_type = $oidc_request->{'response_type'};
+
     my $spAuthnLevel = $self->rpLevelRules->{$rp}->( $req, $req->sessionInfo );
     $self->rpOptions->{$rp}->{oidcRPMetaDataOptionsAuthnLevel} || 0;
 
@@ -604,22 +636,6 @@ sub _authorizeEndpoint {
         return $self->reAuth($req);
     }
 
-    # Check scope validity
-    # We use a slightly more relaxed version of
-    # https://tools.ietf.org/html/rfc6749#appendix-A.4
-    # To be tolerant of user error (trailing spaces, etc.)
-    # Scope names are restricted to printable ASCII characters,
-    # excluding double quote and backslash
-    unless ( $oidc_request->{'scope'} =~ /^[\x20\x21\x23-\x5B\x5D-\x7E]*$/ ) {
-        return $self->_failAuthorize( $req,
-            msg => "Submitted scope is not valid" );
-    }
-
-    # Check openid scope
-    unless ( $self->_hasScope( 'openid', $oidc_request->{'scope'} ) ) {
-        return $self->_failAuthorize( $req, msg => "No openid scope found" );
-    }
-
     # Check id_token_hint
     my $id_token_hint = $oidc_request->{'id_token_hint'};
     if ($id_token_hint) {
@@ -2727,6 +2743,12 @@ sub metadata {
 sub exportRequestParameters {
     my ( $self, $req ) = @_;
 
+    if ( my $p = $req->param('prompt') ) {
+        if ( $p eq 'none' ) {
+            return $self->_unauthPromptNone($req);
+        }
+    }
+
     foreach my $param (
         qw/response_type scope client_id state redirect_uri nonce
         response_mode display prompt max_age ui_locales id_token_hint
@@ -2783,6 +2805,23 @@ sub exportRequestParameters {
     return PE_OK;
 }
 
+sub _unauthPromptNone {
+    my ( $self, $req ) = @_;
+    my $res = $self->_checkErrorsInAuthorizeEndpoint($req);
+    return $res if $res;
+
+    my $oidc_request = $req->data->{_oidc_request};
+    my $uri          = $oidc_request->{redirect_uri};
+    $uri =
+        $uri
+      . ( $uri =~ /\?/ ? '&' : '?' )
+      . build_urlencoded(
+        error => 'login_required',
+        ( $oidc_request->{state} ? ( state => $oidc_request->{state} ) : () ),
+      );
+    return $self->_redirectToUrl( $req, $uri );
+}
+
 sub _hasScope {
     my ( $self, $scope, $scopelist ) = @_;
     return scalar grep { $_ eq $scope } ( split /\s+/, $scopelist );
diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/Code2F.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/Code2F.pm
index 6c35835a8..4faaeb1ec 100644
--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/Code2F.pm
+++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/Code2F.pm
@@ -117,8 +117,7 @@ sub _resend {
             type         => $self->prefix,
         );
 
-        eval { $self->setSecurity($req) };
-        $req->mustRedirect(1);
+        $req->noLoginDisplay(1);
         return $self->p->do( $req, [ sub { PE_NOTOKEN } ] );
     }
 
@@ -135,7 +134,7 @@ sub _resend {
             portal_error => portalConsts->{PE_TOKENEXPIRED},
             type         => $self->prefix,
         );
-        $self->setSecurity($req);
+        $req->noLoginDisplay(1);
         return $self->p->do( $req, [ sub { PE_TOKENEXPIRED } ] );
     }
 
diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/OpenIDConnect.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/OpenIDConnect.pm
index 1fae29250..4ca9fd897 100644
--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/OpenIDConnect.pm
+++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/OpenIDConnect.pm
@@ -28,7 +28,7 @@ use URI;
 use Lemonldap::NG::Portal::Main::Constants
   qw(PE_OK PE_REDIRECT PE_ERROR portalConsts);
 
-our $VERSION = '2.21.0';
+our $VERSION = '2.21.1';
 
 use constant oidcErrorLevel => {
     server_error     => 'error',
@@ -453,11 +453,16 @@ sub buildAuthorizationCodeAuthnRequest {
     };
     my $authorize_request_params = {
         %$authorize_request_oauth2_params,
-        ( defined $display    ? ( display    => $display )    : () ),
-        ( defined $prompt     ? ( prompt     => $prompt )     : () ),
-        ( $max_age            ? ( max_age    => $max_age )    : () ),
-        ( defined $ui_locales ? ( ui_locales => $ui_locales ) : () ),
-        ( defined $acr_values ? ( acr_values => $acr_values ) : () )
+        ( $display    ? ( display    => $display )    : () ),
+        ( $prompt     ? ( prompt     => $prompt )     : () ),
+        ( $ui_locales ? ( ui_locales => $ui_locales ) : () ),
+        (
+            defined($max_age) && length($max_age) ? ( max_age => $max_age ) : ()
+        ),
+        (
+            defined($acr_values)
+              && length($acr_values) ? ( acr_values => $acr_values ) : ()
+        )
     };
 
     # Call oidcGenerateAuthenticationRequest
diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm
index 7387401e1..d1bad932d 100644
--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm
+++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm
@@ -6,8 +6,8 @@ package Lemonldap::NG::Portal::Main;
 
 use strict;
 use MIME::Base64;
-use POSIX qw(strftime);
-use Lemonldap::NG::Common::Util qw(isHiddenAttr);
+use POSIX                                  qw(strftime);
+use Lemonldap::NG::Common::Util            qw(isHiddenAttr);
 use Lemonldap::NG::Portal::Main::Constants qw(portalConsts);
 use URI;
 
@@ -173,9 +173,9 @@ sub controlUrl {
         if ( $tmp and ( $tmp !~ URIRE ) ) {
             $self->auditLog(
                 $req,
-                message  => "Bad URL $tmp",
-                code     => "UNAUTHORIZED_REDIRECT",
-                url      => $tmp,
+                message => "Bad URL $tmp",
+                code    => "UNAUTHORIZED_REDIRECT",
+                url     => $tmp,
             );
             delete $req->{urldc};
             return PE_BADURL;
@@ -215,8 +215,8 @@ sub controlUrl {
                         "URL contains an unprotected host (param: urldc"
                       . " | value: $tmp | alias: $vhost)"
                 ),
-                code     => "UNAUTHORIZED_REDIRECT",
-                url      => $tmp,
+                code => "UNAUTHORIZED_REDIRECT",
+                url  => $tmp,
             );
             delete $req->{urldc};
             return PE_UNPROTECTEDURL;
@@ -468,10 +468,7 @@ sub authenticate {
     my ( $self, $req ) = @_;
     my $ret = $req->authResult( $self->_authentication->authenticate($req) );
     $self->logger->debug( " -> authResult = " . $req->authResult );
-    if ( $ret == PE_OK ) {
-        $req->{sessionInfo}->{_lastAuthnUTime} = time();
-        return $ret;
-    }
+    return $ret if $ret == PE_OK;
 
     # Store failed login into history
     $req->steps( [
@@ -492,6 +489,7 @@ sub authenticate {
 
 sub setAuthSessionInfo {
     my ( $self, $req ) = @_;
+    $req->{sessionInfo}->{_lastAuthnUTime} = time();
     my $ret = $self->_authentication->setAuthSessionInfo($req);
     if ( $ret == PE_OK
         and not( defined $req->sessionInfo->{authenticationLevel} ) )
diff --git a/lemonldap-ng-portal/scripts/purgeCentralCache b/lemonldap-ng-portal/scripts/purgeCentralCache
index ce7c59e05..4bed16f06 100755
--- a/lemonldap-ng-portal/scripts/purgeCentralCache
+++ b/lemonldap-ng-portal/scripts/purgeCentralCache
@@ -27,6 +27,14 @@ my $force     = $opt_f;
 my $nb_purged = 0;
 my $nb_error  = 0;
 
+sub debug {
+    if ($debug) {
+        local $/ = "\n";
+        local $\ = "\n";
+        print STDERR @_;
+    }
+}
+
 #=============================================================================
 # Load configuration
 #=============================================================================
@@ -40,12 +48,12 @@ if ($localconf) {
     $conf->{$_} = $localconf->{$_} foreach ( keys %$localconf );
 }
 
-print "Configuration loaded\n" if $debug;
+debug "Configuration loaded";
 
 #=============================================================================
 # Timeout
 #=============================================================================
-print "Timeout value: " . $conf->{timeout} . "\n" if $debug;
+debug "Timeout value: " . $conf->{timeout};
 
 #=============================================================================
 # Apache::Session backends
@@ -65,7 +73,7 @@ if ( $conf->{globalStorage} ) {
     # Add module in managed backends
     push @backends, $conf->{globalStorageOptions};
 
-    print "Session backend $module will be used\n" if $debug;
+    debug "Session backend $module will be used";
 }
 
 # SAML
@@ -82,7 +90,7 @@ if ( $conf->{samlStorage}
     # Add module in managed backends
     push @backends, $conf->{samlStorageOptions};
 
-    print "SAML backend $module will be used\n" if $debug;
+    debug "SAML backend $module will be used";
 }
 
 # CAS
@@ -99,7 +107,7 @@ if ( $conf->{casStorage}
     # Add module in managed backends
     push @backends, $conf->{casStorageOptions};
 
-    print "CAS backend $module will be used\n" if $debug;
+    debug "CAS backend $module will be used";
 }
 
 # Captcha
@@ -116,7 +124,7 @@ if ( $conf->{captchaStorage}
     # Add module in managed backends
     push @backends, $conf->{captchaStorageOptions};
 
-    print "Captcha backend $module will be used\n" if $debug;
+    debug "Captcha backend $module will be used";
 }
 
 # OpenIDConnect
@@ -133,7 +141,7 @@ if ( $conf->{oidcStorage}
     # Add module in managed backends
     push @backends, $conf->{oidcStorageOptions};
 
-    print "OIDC backend $module will be used\n" if $debug;
+    debug "OIDC backend $module will be used";
 }
 
 #=============================================================================
@@ -144,6 +152,7 @@ for my $options (@backends) {
     next if ( $options->{backend} eq "Apache::Session::Memcached" );
     my @t;
     if ( $options->{backend}->can('deleteIfLowerThan') ) {
+        debug "Found deleteIfLowerThan() in backend, using it";
         my ( $success, $rows ) = $options->{backend}->deleteIfLowerThan(
             $options,
             {
@@ -175,13 +184,12 @@ for my $options (@backends) {
             my $id    = shift;
             my $time  = time;
 
-            print "Check session $id\n" if $debug;
+            debug "Check session $id";
 
             # Empty session need to be removed
             unless ($entry) {
                 push @t, $id;
-                print "Session $id is empty (corrupted?), delete forced\n"
-                  if $debug;
+                debug "Session $id is empty (corrupted?), delete forced";
             }
 
             # Do net check sessions without _utime
@@ -193,7 +201,7 @@ for my $options (@backends) {
             # Session expired
             if ( $time - $entry->{_utime} > $conf->{timeout} ) {
                 push @t, $id;
-                print "Session $id expired\n" if $debug;
+                debug "Session $id expired";
             }
 
             # User has no activity, so considere the session has expired
@@ -202,7 +210,7 @@ for my $options (@backends) {
                 and $time - $entry->{_lastSeen} > $conf->{timeoutActivity} )
             {
                 push @t, $id;
-                print "Session $id inactive\n" if $debug;
+                debug "Session $id inactive";
             }
             undef;
         }
@@ -221,7 +229,7 @@ for my $options (@backends) {
         );
 
         unless ( $session->data ) {
-            print "Error while opening session $id\n" if $debug;
+            debug "Error while opening session $id";
             print STDERR "Error on session $id\n";
             $nb_error++;
             push @errors, $id;
@@ -229,13 +237,13 @@ for my $options (@backends) {
         }
 
         unless ( $session->remove ) {
-            print "Error while deleting session $id\n" if $debug;
+            debug "Error while deleting session $id";
             print STDERR "Error on session $id\n";
             $nb_error++;
             push @errors, $id;
             next;
         }
-        print "Session $id has been purged\n" if $debug;
+        debug "Session $id has been purged\n";
         $nb_purged++;
     }
 
@@ -350,7 +358,7 @@ for my $options (@backends) {
 #=============================================================================
 # Exit
 #=============================================================================
-print "$nb_purged sessions have been purged\n" if $debug;
+debug "$nb_purged sessions have been purged";
 print STDERR
   "$nb_error sessions remaining, try to purge them with force (option -f)\n"
   if $nb_error;
diff --git a/lemonldap-ng-portal/site/htdocs/static/common/sk.png b/lemonldap-ng-portal/site/htdocs/static/common/sk.png
new file mode 100644
index 000000000..115d0dfad
Binary files /dev/null and b/lemonldap-ng-portal/site/htdocs/static/common/sk.png differ
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/ar.json b/lemonldap-ng-portal/site/htdocs/static/languages/ar.json
index 2199d9940..853714e7e 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/ar.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/ar.json
@@ -1,23 +1,23 @@
 {
-"2FDeviceNotFound":"2F device not found",
-"2fRegRequired":"??? ?????? ????? ???????? ?????? ??????.\n??? ????, ?? ?? ??? ???????.",
+"2FDeviceNotFound":"???? 2F ??? ?????",
+"2fRegRequired":"????? ??? ?????? ?????? ???????. ?? ?????? ???? ???? ?? ?? ??? ???????.",
 "PE0":"??? ?????? ????????",
 "PE1":"????? ?????? ???????? ??? ???? ????? ????? ??? ????",
 "PE10":" ???????? ??????? ??? ?????",
-"PE100":"???? ?????? ????? ??? ??? ??? ????? ??.",
-"PE101":"???? ?????? ????? ??? ???? ??? ????? ???.",
-"PE102":"Session must be upgraded",
-"PE103":"No second factors available for your account",
-"PE104":"Bad DevOps handler file",
-"PE105":"??? ??? ?????",
-"PE106":"Error during authentication with OpenID Provider",
+"PE100":"???? ?????? ????? ??? ??? ??? ????? ??",
+"PE101":"???? ?????? ????? ??? ???? ??? ????? ???",
+"PE102":"??? ????? ??????",
+"PE103":"?? ???? ????? ?????? ????? ??????",
+"PE104":"??? DevOps ??? ????",
+"PE105":"????? ??? ?????",
+"PE106":"??? ????? ???????? ?? ???? OpenID",
 "PE107":"??? ??????? ??? ?????",
-"PE108":"Unauthorized URL",
-"PE109":"Not a protected or trusted URL",
-"PE110":"Second factor validation failed, please retry",
-"PE111":"Password too long",
+"PE108":"???? ??? ???? ??",
+"PE109":"??? ???? ???? ?? ????? ??",
+"PE110":"??? ?????? ?? ?????? ??????? ???? ???????? ??? ????",
+"PE111":"???? ?????? ????? ????",
 "PE2":"???? ???????? ????? ?????? ??? ?????",
-"PE20":"No password backend defined",
+"PE20":"?? ???? ????? ?????? ?????? ?????",
 "PE21":"????? ????",
 "PE22":"????? ?????? ???? ??????",
 "PE23":"??????? ??????? ??????",
@@ -33,7 +33,7 @@
 "PE32":"????????? ????????? ??? ???? ?????? ?????? ??!",
 "PE33":"? d ?? ?????? ?? d ?? ??????? ?? d ?? ??????? ?? d ?? ??????? ??? ?????? ?????? ???? ?????? ????????!",
 "PE34":"??? ????? ????? ??????",
-"PE35":"?? ???? ???? ?????? ?????",
+"PE35":"?? ????? ???? ?????? ?????",
 "PE36":"???? ????? ?????",
 "PE37":"?? ?? ?? ???",
 "PE38":"?? ???? ???? ????",
@@ -44,7 +44,7 @@
 "PE42":"???? ???????",
 "PE43":"????? ????? ?????????? ??????",
 "PE44":"????? ??????? ??? ???? ?? ???? ???",
-"PE45":"??? ??? ??? ????? ??????",
+"PE45":"??? ??? ????? ????? ??????",
 "PE46":"?? ????? ????",
 "PE47":"??? ?? ??? ??????",
 "PE48":"??? SAML ??? ?????",
@@ -56,13 +56,13 @@
 "PE53":"???? ????? SAML ??? ?????",
 "PE54":"?? ??? ?????? ???? ????? SAML",
 "PE55":"?? ??? ?????? ???? ?????? ???? ?? ????? ?????? ?????? ????",
-"PE56":"You've been disconnected but an error occured in another application, you should close your browser",
+"PE56":"??? ?? ????? ????? ????? SAML",
 "PE57":"??? ??? ?? ????? ????? ????? SAML",
-"PE58":"??? ??? ????? ??????? ?????????",
+"PE58":"??? ?? ??????? ?? ????? SAML",
 "PE59":"??? ?? ??????? ?? ???? SAML",
 "PE6":"???? ??????? ????? ????",
 "PE60":"????? ??? ????? ???? ??????",
-"PE61":"??? ??? ????? ????? ?????? SAML",
+"PE61":"??? ??? ????? ????? ???? SAML",
 "PE62":"??? ?? ???? ???? ????? ????? ????",
 "PE63":"??? ????? ??????? ???? ???? ???? ????? ?????? ??",
 "PE64":"????? ???????? ??? ??????",
@@ -82,43 +82,43 @@
 "PE77":"???? ????? ??????",
 "PE78":"?????? ????? ????????",
 "PE79":"???? ??????? ??????",
-"PE8":"Session storage module failed",
+"PE8":"??? ???? ????? ??????",
 "PE80":"??? ??????? ??????",
 "PE81":"?????? ????? ?????? ??? ?????",
 "PE82":"?? ????? ???? ????? ??????",
-"PE83":"WebAuthn authentication failed",
+"PE83":"???? ?????? WebAuthn",
 "PE84":"??? ??? ???? ??????? ??? ??? ??????",
 "PE85":" ?????? ?????? ???? ???? ????? (??? ??? ????? ?????? ????? ??????).\n??? ?????? ? ??? ????????",
-"PE86":"Your account is locked. You have to wait",
-"PE87":"You must authenticate again to access to Portal",
-"PE88":"Your account must have an e-mail address in order to use double factor authentication",
-"PE89":"Access not granted on SAML service",
+"PE86":"?? ??? ?????. ??? ???? ????????",
+"PE87":"??? ???? ????? ???????? ?????? ??? ???????",
+"PE88":"??? ?? ????? ????? ??? ????? ???? ???????? ???????? ???????? ???????.",
+"PE89":"?????? ??? ????? ?? ??? ???? SAML",
 "PE9":"????? ????? ??????",
-"PE90":"Access not granted on OIDC service",
-"PE91":"Access not granted on OID service",
-"PE92":"Access not granted on GET service",
-"PE93":"Access not granted on IMPERSONATION service",
-"PE94":"????? ???????? ??? ??????",
-"PE95":"Access not granted on DECRYPT service",
-"PE96":"Invalid verification code",
-"PE97":"Your certificate is invalid or expires soon",
-"PE98":"Please select your new certificate",
-"PE99":"Please select your new certificate",
+"PE90":"?????? ??? ????? ?? ??? ???? OIDC",
+"PE91":"?????? ??? ????? ?? ??? ???? OID",
+"PE92":"?????? ??? ????? ?? ??? ???? GET",
+"PE93":"?????? ??? ????? ?? ??? ???? ?????? ??????",
+"PE94":"??? ?????? ??? ?????",
+"PE95":"?????? ??? ????? ?? ??? ???? ?? ???????",
+"PE96":"??? ?????? ??? ????",
+"PE97":"?????? ??? ????? ?? ?????? ??????",
+"PE98":"???? ?????? ?????? ???????",
+"PE99":"???? ?????? ?????? ???????",
 "SSOSessionInactive":"???? ?????? ?????? ??? ????",
-"UA":"User agent",
-"VHnotFound":"Virtual Host not found",
+"UA":"???? ????????",
+"VHnotFound":"?????? ????????? ??? ?????",
 "accept":"????",
 "accessDenied":"??? ???? ??? ??????? ???? ???????",
 "accountCreated":"?? ????? ????? ? ????? ???? ?????? ??????? ??? ????? ??????????.",
 "accountCreationSuccess":"?? ????? ????? ?????.",
-"action":"Action",
-"activeSessions":"Active SSO sessions",
-"all":"All",
-"allowed":"Access ALLOWED",
+"action":"?????",
+"activeSessions":"????? ?????? ?????? ??????",
+"all":"????",
+"allowed":"?????? ????? ??",
 "anotherInformation":"??????? ????:",
 "areYouSure":"?? ??? ?????",
-"askToRenew":"??? ??????? ????? ??? ?????? ???? ?????. ?? ???? ????? ?????????",
-"askToUpgrade":"??? ??????? ????? ??? ????? ?????? ????. ?? ???? ????? ?????????",
+"askToRenew":"????? ??? ??????? ??? ?????? ???? ?????. ?? ???? ?? ????? ?????????",
+"askToUpgrade":"????? ??? ??????? ??? ????? ?????? ????. ?? ???? ?? ????? ?????????",
 "attributes":"ATTRIBUTES",
 "authLevel":"????? ????? ??????",
 "authPortal":"????? ????? ??????",
@@ -127,27 +127,27 @@
 "autoGlobalLogout":"???? ??????? ?? 30 ?????",
 "back2CasUrl":"??????? ???? ??? ?????? ?????? ??? ???? ?? ???? ???? ?? ???? ?? ?? ??????",
 "back2Portal":"?????? ??? ???????",
-"backToTop":"Back to top",
-"badCode":"Bad code",
-"badName":"Bad name",
+"backToTop":"?????? ??? ??????",
+"badCode":"??? ????",
+"badName":"??? ????",
 "cancel":"?????",
 "captcha":"???? ?????? ?? ???????? ",
-"certificateReset":"Reset my certificate",
+"certificateReset":"????? ????? ??????",
 "changePwd":"??? ???? ?????? ?????? ??",
-"checkDevOps":"Check DevOps handler file",
+"checkDevOps":"?????? ?? ??? DevOps",
 "checkLastLogins":"???? ?? ??? ??????? ???? ?????? ??",
-"checkUser":"Check user SSO profile",
-"checkUserComputedSession":"No SSO session found. Computed data!",
-"checkUserMerged":"Check user SSO profile. Some Real and Spoofed SSO groups are merged!",
-"checkUserNoSessionFound":"No SSO session found",
-"checkentropyLabel":"Password strength",
-"choose2f":"Choose your second factor",
+"checkUser":"?????? ?? ??? ????? SSO ???????? ",
+"checkUserComputedSession":"?? ??? ?????? ??? ?? ???? SSO. ?????? ??????!",
+"checkUserMerged":"?????? ?? ??? ????? SSO ????????. ?? ??? ??? ??????? SSO ???????? ????????!",
+"checkUserNoSessionFound":"?? ??? ?????? ??? ?? ???? SSO",
+"checkentropyLabel":"??? ???? ??????",
+"choose2f":"???? ?????? ?????? ????? ??",
 "chooseApp":"???? ??? ????????? ??????? ?? ??????? ?????",
-"cipheredValue":"Ciphered value",
-"click2Reset":"???? ??? ?????? ????? ???? ??????",
+"cipheredValue":"???? ?????",
+"click2Reset":"???? ??? ?????? ????? ???? ?????? ?????? ??",
 "clickHere":"?????? ????? ???",
-"clickOnYubikey":"Click on your Yubikey",
-"close":"Close",
+"clickOnYubikey":"???? ??? Yubikey ????? ??",
+"close":"?????",
 "closeSSO":"???? ???? ?????? ?????? (???)",
 "code":"??????",
 "confirmLinkSent":"?? ????? ???? ?????? ???? ?????? ???? ???",
@@ -155,27 +155,27 @@
 "confirmation":"???????",
 "connect":"???????",
 "connectedAs":"???? ?",
-"contextSwitching_OFF":"Stop impersonation",
-"contextSwitching_ON":"Impersonate another user",
+"contextSwitching_OFF":"????? ????????",
+"contextSwitching_ON":"?????? ?????? ???",
 "continue":"?????",
 "createAccount":"???? ????",
-"csrfError":"CSRF check failed",
+"csrfError":"??? ?????? ?? CSRF",
 "current":"??????",
 "currentPwd":"???? ?????? ???????",
 "date":"?????",
-"decryptCipheredValue":"Decrypt a ciphered value",
+"decryptCipheredValue":"?? ????? ???? ?????",
 "enterCred":"?????? ????? ?????? ???????? ?????? ??",
 "enterExt2fCode":"?? ????? ??? ????. ?????? ??????",
 "enterMail2fCode":"?? ????? ??? ?????? ??????????. ?????? ??????",
 "enterOpenIDLogin":"?????? ????? ????? ?????? ??????? ???? ????? ??",
 "enterPassword":"???? ???? ?????? ?????? ??",
-"enterRadius2fCode":"Please enter your OTP code",
-"enterRest2fCode":"Please enter your OTP code",
-"enterTotpCode":"Enter TOTP code",
+"enterRadius2fCode":"???? ????? ??? OTP ????? ??",
+"enterRest2fCode":"???? ????? ??? OTP ????? ??",
+"enterTotpCode":"???? ??? TOTP",
 "enterYubikey":"???? ??????? ???? ?? ????? ??",
 "errorMsg":"????? ?????",
-"expired2Fremoved":"%s expired 2F devices have been removed (%s)!",
-"explorer":"?????",
+"expired2Fremoved":"?%s ????? 2F caducadas ??? ??????? (%s)!",
+"explorer":"??????",
 "ext2f":"??? ??????",
 "firstName":"????? ?????",
 "forbidden":"????? ??????",
@@ -183,25 +183,25 @@
 "generatePwd":"????? ???? ?????? ???????",
 "generic":"??????? ???????",
 "generic2fFormatError":"??????? ?????? ??? ?????? ????? ???????",
-"generic2fwelcome":"Register your second factor",
-"genericCheckCode":"A code has been transmitted to you, please input it in the form below",
+"generic2fwelcome":"?? ?????? ???? ?????? ????? ??",
+"genericCheckCode":"?? ????? ??? ????? ???? ?????? ?? ??????? ?????",
 "genericRegisterCode":"???? ????? ???? ????",
-"genericRegisterName":"Name of this contact information",
-"genericRegisterPrompt":"Input your contact information",
-"genericRegisterRegister":"Click this button to finish the registration process",
-"genericRegisterVerify":"Click this button to receive your confirmation code",
-"genericRegistered":"Your contact information has been successfully registered",
-"genericverify":"Verify your contact information",
-"globalLogout":"Global logout",
+"genericRegisterName":"??? ??? ????????? ???????",
+"genericRegisterPrompt":"???? ??????? ??????? ?????? ??",
+"genericRegisterRegister":"???? ??? ??? ???? ?????? ????? ???????",
+"genericRegisterVerify":"???? ??? ??? ???? ????? ??? ??????? ????? ??",
+"genericRegistered":"?? ????? ??????? ??????? ?????? ?? ?????",
+"genericverify":"???? ?? ??????? ??????? ?????? ??",
+"globalLogout":"????? ???? ?????",
 "goToPortal":"????? ??? ???????",
 "gotNewMessages":"???? ??? ??????? ???????",
 "gplSoft":"????????? ????? ???? ?????? ???? GPL",
-"groups_sso":"SSO GROUPS",
-"headers":"HEADERS",
-"hello":"????? ",
+"groups_sso":"??????? SSO",
+"headers":"????",
+"hello":"?????",
 "hide":"?????",
-"home":"Home",
-"id":"Id",
+"home":"????????",
+"id":"????",
 "imSure":"??? ?????",
 "info":"???????",
 "ipAddr":"????? ???? ??",
@@ -212,49 +212,49 @@
 "lastLoginsCaptionLabel":"??? ??????? ????",
 "lastName":"??? ???????",
 "linkValidUntil":"????? ??? ??????? ??? ???? ?????? ????? ???? ??????? ???? ?????? ???? ???",
-"linkValidUntilCertif":"This message contains a link to reset your certificate, this link is valid until ",
+"linkValidUntilCertif":"????? ??? ??????? ??? ???? ?????? ????? ??????? ??? ?????? ???? ??? ",
 "login":"????? ??????",
 "loginHistory":"??? ????? ??????",
 "logout":"????? ??????",
 "logoutConfirm":"?? ???? ????? ???????",
 "logoutFromOtherApp":"????? ?????? ?? ????????? ?????? ...",
-"logoutFromSP":"Logout from service providers ...",
-"macros":"MACROS",
+"logoutFromSP":"????? ?????? ?? ????? ?????? ...",
+"macros":"?????",
 "mail":"??????",
-"mail2f":"Email code",
+"mail2f":"??? ??????",
 "mailSent2":"?? ????? ????? ??? ????? ????? ??????????.",
 "maintenanceMode":"??? ??????? ?? ?????? ???? ?????? ??????? ?? ??? ????",
-"mandatoryField":"* Mandatory field",
-"maxNumberOf2FDevicesReached":"Maximum number of 2F devices reached!",
-"missingCode":"Code is missing",
-"missingPassword":"Password was not entered",
-"myNotification":"My accepted notification",
-"myNotifications":"My accepted notifications",
+"mandatoryField":"* ??? ??????",
+"maxNumberOf2FDevicesReached":"?? ?????? ??? ???? ?????? ???? ????? 2F!",
+"missingCode":"??? ?????",
+"missingPassword":"?? ??? ????? ???? ??????",
+"myNotification":"?????? ???????",
+"myNotifications":"???????? ????????",
 "name":"???",
 "newMessages":"????? ????? (?????)",
 "newPassword":"???? ???? ?????",
 "newPwdSentTo":"?? ????? ????? ??? ????? ????? ??????????.",
-"noAppAllowed":"None appplication allowed!",
+"noAppAllowed":"?? ???? ??????? ????? ???!",
 "noHistory":"??? ?? ??? ?????? ????? ??!",
-"noNotification":"None accepted notification found",
-"noTOTPFound":"No TOTP found",
-"noU2FKeyFound":"No U2F key found",
-"notAnEncryptedValue":"It is not an encrypted value",
-"notAuthorized":"You're not authorized to do this",
-"notAuthorizedAuthLevel":"This action requires a higher authentication level",
+"noNotification":"?? ??? ?????? ??? ????? ?????",
+"noTOTPFound":"?? ??? ?????? ??? TOTP",
+"noU2FKeyFound":"?? ??? ?????? ??? ????? U2F",
+"notAnEncryptedValue":"???? ???? ?????",
+"notAuthorized":"??? ??? ???? ?? ???? ???",
+"notAuthorizedAuthLevel":"????? ??? ??????? ????? ???? ?? ????????",
 "notFound":"?? ??? ??????: ?????? ?????? ??? ???? ??? ??????",
-"notificationNotFound":"Notification not found in DataBase",
-"notificationRetrieveFailed":"Unable to retrieve notification",
-"notificationsExplorer":"Notifications explorer",
-"oidcConsent":"??????? ?s ?? ???? ?? ?????:",
-"oidcConsents":"OIDC consents",
-"oidcConsentsFull":"OpenID Connect consents",
+"notificationNotFound":"?? ??? ?????? ??? ????? ?? ????? ????????",
+"notificationRetrieveFailed":"???? ??????? ???????",
+"notificationsExplorer":"?????? ?????????",
+"oidcConsent":"??????? %s ?? ???? ?? ?????:",
+"oidcConsents":"??????? OIDC",
+"oidcConsentsFull":"??????? OpenID Connect",
 "okta2f":"Okta",
-"okta2fSelectFactor":"Select the Okta module you want to use",
+"okta2fSelectFactor":"???? ???? Okta ???? ???? ?? ?????????",
 "okta2fpush":"Okta Push",
 "okta2fsms":"Okta SMS",
 "okta2ftokensoftwaretotp":"Okta TOTP",
-"oneExpired2Fremoved":"An expired 2F device has been removed (%s)!",
+"oneExpired2Fremoved":"??? ????? ???? 2F ????? ???????? (%s)!",
 "openIdExample":"?????:http://myopenid.org/toto",
 "openSSOSession":"???? ???? ?????? ?????? (???)",
 "openSessionSpace":"??? ??????? ???? ?? ??? ???? ????? ?????? ?????? (???).??? ?????? ??? ?????? ???? ??? ??? ???? ????????? ???? ??? ??? ?????? ????? ??.",
@@ -265,24 +265,24 @@
 "otherSessions":"????? ???? ????",
 "password":"???? ??????",
 "password2f":"???? ??????",
-"passwordCompromised":"Not found in a compromised password database",
-"passwordPolicy":"Please respect the following policy:",
-"passwordPolicyMaxSize":"Maximal size:",
-"passwordPolicyMinDigit":"Minimal digit characters:",
-"passwordPolicyMinLower":"Minimal lower characters:",
-"passwordPolicyMinSize":"Minimal size:",
-"passwordPolicyMinSpeChar":"Minimal special characters:",
-"passwordPolicyMinUpper":"Minimal upper characters:",
-"passwordPolicyNone":"You are free to choose your password!",
-"passwordPolicySamePwd":"You must confirm your new password by entering it twice",
-"passwordPolicySpecialChar":"Allowed special characters:",
-"passwordverify":"Double-check your password",
-"pasteHere":"Paste your file here...",
+"passwordCompromised":"?? ??? ?????? ??? ???? ?????? ?? ????? ?????? ????? ?????? ????????",
+"passwordPolicy":"???? ?????? ??????? ???????:",
+"passwordPolicyMaxSize":"????? ??????:",
+"passwordPolicyMinDigit":"??? ??????? ??????:",
+"passwordPolicyMinLower":"??? ?????? ??????? ??????:",
+"passwordPolicyMinSize":"????? ??????:",
+"passwordPolicyMinSpeChar":"??? ?????? ?????? ??????:",
+"passwordPolicyMinUpper":"??? ?????? ??????? ??????:",
+"passwordPolicyNone":"????? ?????? ???? ?????? ?????? ?? ?????!",
+"passwordPolicySamePwd":"??? ???? ????? ???? ?????? ??????? ???????? ?????",
+"passwordPolicySpecialChar":"?????? ?????? ??????? ???:",
+"passwordverify":"???? ?? ???? ?????? ?????? ??",
+"pasteHere":"???? ???? ???...",
 "ppGrace":"????????? ????????? ??? ???? ?????? ?????? ??!",
 "proxyError":"????? ????: ??? ???? ??? ???????? ??????? ??????",
 "pwd":"???? ??????",
 "pwdChange":"????? ???? ??????",
-"pwdChanged":"Your password has been successfully changed!",
+"pwdChanged":"?? ????? ???? ?????? ?????!",
 "pwdResetAlreadyIssued":"?? ????? ??? ????? ????? ???? ?????? ?? ???",
 "pwdWillExpire":"? s ?? ?????? ?? s ?? ??????? ?? s ?? ??????? ?? s ?? ??????? ??? ?????? ?????? ???? ??????? ?? ????????!",
 "radius2f":"Radius",
@@ -293,99 +293,99 @@
 "reference":"????",
 "refreshrights":"?? ?????? ?????",
 "refuse":"???",
-"register":"Register",
+"register":"?????",
 "registerRequestAlreadyIssued":"?? ????? ??? ????? ???? ?????? ?? ???",
 "rememberChoice":"???? ???????",
-"rememberTimerLabel":"s before automatic authentication",
-"remove2fWarning":"This operation cannot be undone",
+"rememberTimerLabel":"????? ??? ???????? ?????????",
+"remove2fWarning":"?? ???? ??????? ?? ??? ???????",
 "removeOtherSessions":"????? ??????? ??????",
-"renewSession":"Renew session",
-"resendCode":"Re-send code",
+"renewSession":"????? ??????",
+"resendCode":"????? ????? ?????",
 "resendConfirmMail":"?? ???? ????? ????? ????? ????????",
-"resendTooSoon":"Please wait a little longer before trying to re-send the code",
+"resendTooSoon":"???? ???????? ?????? ??? ?????? ????? ????? ?????",
 "resentConfirm":"?? ???? ????? ????? ????? ????????",
 "resetPwd":"????? ????? ???? ?????? ?????? ??",
 "rest2f":"??? ??????",
-"retry":"Retry",
+"retry":"????? ????????",
 "rightsReloadNeedsLogout":" ????? ????? ?????? ????? ??? ????? ?????? ?????? ?????? ??? ????",
-"rules":"RULES",
+"rules":"?????",
 "scope":"????",
-"search":"Search",
-"searchAccount":"Search for account",
-"searchingForm":"Searching form",
-"seconds":"seconds",
+"search":"???",
+"searchAccount":"??? ?? ????",
+"searchingForm":"????? ?????",
+"seconds":"?????",
 "selectIdP":"???? ???? ?????? ????? ??",
-"sendPwd":"Send me a link",
-"serverError":"???? ??? ?? ??????",
-"service":"Service",
+"sendPwd":"???? ?? ??????",
+"serverError":"??? ??? ?? ??????",
+"service":"????",
 "serviceProvidedBy":"?????? ??????? ?? ???",
 "sessionsDeleted":"??????? ??????? ?? ?????",
-"sfaManager":"2ndFA Manager",
-"showhidePasswords":"Show/Hide passwords",
-"spoofId":"Spoofed Id",
+"sfaManager":"???? 2ndFA",
+"showhidePasswords":"?????/????? ????? ??????",
+"spoofId":"???? ????",
 "startTime":"????? ???????",
-"stayConnected":"Trust this device for future logins",
+"stayConnected":"?? ?? ??? ?????? ?????? ?????? ?? ????????",
 "submit":"???",
-"switchContext":"Switch context",
-"totp2f":"OTP App",
-"totpMissingCode":"Please enter the code supplied by your TOTP application",
-"totpOrTouch":"If you see this on your mobile, touch the QR code to open your TOTP application",
-"totpQrCode":"Scan this QR code in your TOTP application",
-"totpRegisterCode":"Input the code provided by your application",
-"totpRegisterName":"Choose a name for this TOTP device",
-"totpSecretKey":"If your TOTP application does not support QR codes, enter the following key instead:",
+"switchContext":"????? ??????",
+"totp2f":"????? OTP",
+"totpMissingCode":"???? ????? ????? ?????? ?? ????? TOTP ????? ??",
+"totpOrTouch":"??? ??? ??? ??? ??? ????? ???????? ???? ??? ??? QR ???? ????? TOTP ????? ??",
+"totpQrCode":"???? ??? QR ??? ?? ????? TOTP ????? ??",
+"totpRegisterCode":"???? ????? ?????? ?? ??????",
+"totpRegisterName":"???? ????? ???? ?????? TOTP",
+"totpSecretKey":"??? ???? ????? TOTP ????? ?? ?? ???? ???? QR? ???? ??????? ?????? ????? ?? ???:",
 "touchU2fDevice":"???? ??? ???? U2F ???? ????.",
-"touchU2fDeviceOrEnterTotp":"Please touch the flashing U2F device or enter TOTP code.",
+"touchU2fDeviceOrEnterTotp":"???? ??? ???? U2F ???? ???? ?? ????? ??? TOTP.",
 "type":"???",
-"u2f":"U2F Key",
+"u2f":"????? U2F",
 "u2fFailed":"??? ?????? ?? U2F. ??? ?????? ??????? ??????? ?? ???? ??",
 "u2fPermission":"?? ??? ??????? ??????? ??????  ??? ?????? ??? ?????? ?????? ?????? ??.??? ??? ?????? ????? ?????? ?? ???????.",
-"u2fWelcome":"U2F device management",
+"u2fWelcome":"????? ???? U2F",
 "unableToGetKey":"???? ?????? ??? ???????. ??? ?????? ??????? ??????? ?? ???? ??",
-"unknownAction":"Unknown action",
-"unknownAttributes":"Unknown attributes",
-"unregister":"Unregister",
+"unknownAction":"????? ??? ?????",
+"unknownAttributes":"???? ??? ??????",
+"unregister":"????? ???????",
 "updateCdc":"????? ??? ????? ?????? ?????? ???????",
 "updateTime":"????? ???????",
 "upgradeSession":"????? ??????",
 "useYubikey":"?????? ?????? ?? ????? ??",
 "user":"????????",
-"validationDate":"Validation date",
+"validationDate":"????? ??????",
 "value":"??????",
 "verify":"??????",
 "wait":"?????",
-"waitFor2f":"Waiting for your second factor activation",
-"waitingmessage":"Authentication in progress, please wait",
+"waitFor2f":"?????? ????? ?????? ??????",
+"waitingmessage":"???????? ?????? ???? ????????",
 "warning":"?????",
-"webAuthnBrowserFailed":"Browser failed to obtain WebAuthn credential",
-"webAuthnBrowserInProgress":"WebAuthn authentication in progress. Please follow your browser's instructions",
-"webAuthnFailed":"WebAuthn authentication failed",
-"webAuthnNoDevice":"No WebAuthn device available for this account",
-"webAuthnRegisterFailed":"WebAuthn registration failed",
-"webAuthnRegisterInProgress":"WebAuthn registration in progress. Please follow your browser's instructions",
-"webAuthnRequired":"WebAuthn authentication required",
-"webAuthnUnsupported":"Your web browser does not support WebAuthn",
+"webAuthnBrowserFailed":"??? ??????? ?? ?????? ??? ?????? ?????? WebAuthn",
+"webAuthnBrowserInProgress":"???? ?????? WebAuthn. ???? ????? ??????? ??????? ????? ??",
+"webAuthnFailed":"???? ?????? WebAuthn",
+"webAuthnNoDevice":"?? ???? ???? WebAuthn ???? ???? ??????",
+"webAuthnRegisterFailed":"???? ????? ????? WebAuthn",
+"webAuthnRegisterInProgress":"???? ????? ????? WebAuthn. ???? ????? ??????? ??????? ????? ??",
+"webAuthnRequired":"????? ???????? WebAuthn",
+"webAuthnUnsupported":"?? ???? ????? ????? ????? ?? WebAuthn",
 "webauthn2f":"WebAuthn",
-"webauthn2fWelcome":"Security device registration",
-"webauthnAlreadyRegistered":"This device is already registered",
-"webauthnResident":"This device can be used as a passkey",
+"webauthn2fWelcome":"????? ???? ??????",
+"webauthnAlreadyRegistered":"?? ????? ??? ?????? ??????",
+"webauthnResident":"???? ??????? ??? ?????? ????? ????",
 "welcomeOnPortal":"????? ?? ??? ????? ????? ?????? ??????.",
 "yesResendMail":"???? ??? ????? ??????",
-"your2faIsRegistered":"Your second factor has been registered",
-"yourAddress":"Know your address",
+"your2faIsRegistered":"?? ????? ?????? ?????? ????? ??",
+"yourAddress":"???? ??? ??????",
 "yourApps":"????????? ?????? ??",
-"yourEmail":"Know your email",
-"yourIdentity":"Know your identity",
+"yourEmail":"???? ??? ????? ??????????",
+"yourIdentity":"???? ??? ?????",
 "yourIdentityIs":"????? ??",
-"yourKeyIsAlreadyRegistered":"Your key is ALREADY registered!",
-"yourKeyIsRegistered":"??????? ????? ?? ?? ??????",
-"yourKeyIsUnregistered":"??? ????? ???????",
-"yourKeyIsVerified":"?? ?????? ??????? ????? ?? ?????",
-"yourNewTotpKey":"Your new TOTP key, please test it and enter the code",
-"yourOffline":"Access your account while you are offline",
-"yourPasswordIsRegistered":"Your password has been registered",
-"yourPhone":"Know your phone number",
-"yourProfile":"Know your profile",
-"yourTotpKey":"Your TOTP key",
+"yourKeyIsAlreadyRegistered":"?????? ???? ??????!",
+"yourKeyIsRegistered":"?????? ????",
+"yourKeyIsUnregistered":"?? ????? ????? ??????",
+"yourKeyIsVerified":"?? ?????? ?? ??????",
+"yourNewTotpKey":"????? TOTP ?????? ????? ??? ???? ??????? ?????? ?????",
+"yourOffline":"?????? ??? ????? ????? ??? ???????",
+"yourPasswordIsRegistered":"?? ????? ???? ?????? ?????? ??",
+"yourPhone":"???? ??? ??? ?????",
+"yourProfile":"???? ??? ???? ??????",
+"yourTotpKey":"????? TOTP ????? ??",
 "yubikey2f":"Yubikey"
 }
\ No newline at end of file
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/de.json b/lemonldap-ng-portal/site/htdocs/static/languages/de.json
index 87ce3d5e1..076915104 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/de.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/de.json
@@ -195,7 +195,7 @@
 "globalLogout":"Global logout",
 "goToPortal":"Zum Portal",
 "gotNewMessages":"Du hast neue Nachrichten",
-"gplSoft":"Freie Software, die von der GPL-Lizenz abgedeckt wird",
+"gplSoft":"Freie Software, die von der GPL-Lizenz abgedeckt wird.",
 "groups_sso":"SSO GROUPS",
 "headers":"HEADERS",
 "hello":"Hallo",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/en.json b/lemonldap-ng-portal/site/htdocs/static/languages/en.json
index 14fe3fa02..f89eaeeb2 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/en.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/en.json
@@ -195,7 +195,7 @@
 "globalLogout":"Global logout",
 "goToPortal":"Go to portal",
 "gotNewMessages":"You have some new messages",
-"gplSoft":"free software covered by the GPL license",
+"gplSoft":"free software covered by the GPL license.",
 "groups_sso":"SSO GROUPS",
 "headers":"HEADERS",
 "hello":"Hello",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/es.json b/lemonldap-ng-portal/site/htdocs/static/languages/es.json
index 922e6cae6..9d1a56c8a 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/es.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/es.json
@@ -195,7 +195,7 @@
 "globalLogout":"Desconexi?n global",
 "goToPortal":"Ir al portal",
 "gotNewMessages":"Tiene mensajes nuevos",
-"gplSoft":"Software libre cubierto bajo licencia GPL",
+"gplSoft":"Software libre cubierto bajo licencia GPL.",
 "groups_sso":"GRUPOS SSO",
 "headers":"ENCABEZADOS",
 "hello":"Hola",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/fi.json b/lemonldap-ng-portal/site/htdocs/static/languages/fi.json
index 26ded5597..4858a8cb4 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/fi.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/fi.json
@@ -127,7 +127,7 @@
 "autoGlobalLogout":"Kirjaudutaan automaattisesti ulos kaikista istunnoista 30 sekunnissa",
 "back2CasUrl":"Sovellus, josta juuri kirjauduit ulos, tarjosi linkin, jota se haluaisi sinun seuraavan",
 "back2Portal":"Palaa takaisin portaaliin",
-"backToTop":"Back to top",
+"backToTop":"Takaisin alkuun",
 "badCode":"Virheellinen koodi",
 "badName":"Virheellinen nimi",
 "cancel":"Peruuta",
@@ -195,12 +195,12 @@
 "globalLogout":"Kirjaudu ulos kaikista istunnoista",
 "goToPortal":"Siirry portaaliin",
 "gotNewMessages":"Sinulla on uusia viestej?",
-"gplSoft":"vapaa GPL-lisenssin alainen ohjelmisto",
+"gplSoft":"vapaa GPL-lisenssin alainen ohjelmisto.",
 "groups_sso":"KERTAKIRJAUTUMISRYHM?T",
 "headers":"OTSIKKOKENT?T",
 "hello":"Hei",
 "hide":"Piilota",
-"home":"Home",
+"home":"Koti",
 "id":"Tunniste",
 "imSure":"Olen varma",
 "info":"Tiedotus",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/fr.json b/lemonldap-ng-portal/site/htdocs/static/languages/fr.json
index 1a730315c..c73b5eda4 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/fr.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/fr.json
@@ -195,7 +195,7 @@
 "globalLogout":"D?connexion globale",
 "goToPortal":"Aller au portail",
 "gotNewMessages":"Vous avez de nouveaux messages",
-"gplSoft":"logiciel libre prot?g? par la licence GPL",
+"gplSoft":"logiciel libre prot?g? par la licence GPL.",
 "groups_sso":"GROUPES SSO",
 "headers":"ENTETES",
 "hello":"Bonjour",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/it.json b/lemonldap-ng-portal/site/htdocs/static/languages/it.json
index bc864422e..7ca907893 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/it.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/it.json
@@ -1,23 +1,23 @@
 {
-"2FDeviceNotFound":"2F device not found",
+"2FDeviceNotFound":"Dispositivo 2F non trovato",
 "2fRegRequired":"Questo servizio richiede un'autenticazione a doppio fattore. Registrare un dispositivo ora, quindi tornare al portale.",
 "PE0":"Utente autenticato",
 "PE1":"La sessione ? scaduta, devi autenticarti di nuovo",
 "PE10":"Certificato non valido",
-"PE100":"Password contains not allowed character",
-"PE101":"Password contains not allowed characters",
-"PE102":"Session must be upgraded",
-"PE103":"No second factors available for your account",
-"PE104":"Bad DevOps handler file",
-"PE105":"File not found",
-"PE106":"Error during authentication with OpenID Provider",
-"PE107":"This application is not known",
-"PE108":"Unauthorized URL",
-"PE109":"Not a protected or trusted URL",
-"PE110":"Second factor validation failed, please retry",
-"PE111":"Password too long",
+"PE100":"La password contiene un carattere non consentito",
+"PE101":"La password contiene dei caratteri non consentiti",
+"PE102":"La sessione deve essere aggiornata",
+"PE103":"Nessun secondo fattore disponibile per il vostro account",
+"PE104":"File gestore DevOps difettoso",
+"PE105":"File non trovato",
+"PE106":"Errore durante l'autenticazione con il provider OpenID",
+"PE107":"Questa applicazione non ? conosciuta",
+"PE108":"URL non autorizzato",
+"PE109":"Non ? un URL protetto o fidato",
+"PE110":"La convalida del secondo fattore non ? riuscita, si prega di riprovare",
+"PE111":"Password troppo lunga",
 "PE2":"ID o password mancante",
-"PE20":"No password backend defined",
+"PE20":"Non ? stato definito un backend per le password",
 "PE21":"Account bloccato",
 "PE22":"Password scaduta",
 "PE23":"Certificato richiesto",
@@ -56,7 +56,7 @@
 "PE53":"Destinazione del messaggio SAML errata",
 "PE54":"Condizioni del messaggio SAML non rispettate",
 "PE55":"L'autenticazione avviata dal provider d'identit? non ? autorizzata",
-"PE56":"You've been disconnected but an error occured in another application, you should close your browser",
+"PE56":"La disconnessione ? avvenuta, ma si ? verificato un errore in un'altra applicazione; ? necessario chiudere il browser",
 "PE57":"Errore durante la gestione della firma del messaggio SAML",
 "PE58":"Si ? verificato un errore durante l'utilizzo di un artefatto SAML",
 "PE59":"Errore di comunicazione con le sessioni SAML",
@@ -66,7 +66,7 @@
 "PE62":"Pagina destinata al server OpenID",
 "PE63":"Stai cercando di utilizzare un'identit? OpenID che non ti appartiene",
 "PE64":"Attributo richiesto non disponibile",
-"PE65":"Federation forbidden by security policy",
+"PE65":"Federazione vietata dalla politica di sicurezza",
 "PE66":"La mail di conferma ? gi? stata inviata",
 "PE67":"Password mancante",
 "PE68":"Acceso no autorizado al servicio CAS",
@@ -82,14 +82,14 @@
 "PE77":"Devi inserire il captcha",
 "PE78":"Inserisci le informazioni",
 "PE79":"Manca un'informazione",
-"PE8":"Session storage module failed",
+"PE8":"Modulo di memorizzazione della sessione non funzionante",
 "PE80":"Questo indirizzo ? gi? utilizzato",
 "PE81":"Tentativo di autenticazione non valido",
 "PE82":"Timeout di autenticazione superato",
-"PE83":"WebAuthn authentication failed",
+"PE83":"Autenticazione WebAuthn fallita",
 "PE84":"Non sei autorizzato ad accedere a questo host",
 "PE85":"Il sito remoto richiede una sessione pi? recente (e il plug-in di UpgradeSession non viene caricato). Disconnetti e riprova",
-"PE86":"Your account is locked. You have to wait",
+"PE86":"Account bloccato. Devi attendere",
 "PE87":"? necessario eseguire nuovamente l'autenticazione per accedere al Portale",
 "PE88":"Il tuo account deve avere un indirizzo e-mail per poter utilizzare l'autenticazione a doppio fattore",
 "PE89":"Accesso non concesso sul servizio SAML",
@@ -101,9 +101,9 @@
 "PE94":"Attributo richiesto non disponibile",
 "PE95":"Accesso non concesso sul servizio DECRYPT",
 "PE96":"Invalid verification code",
-"PE97":"Your certificate is invalid or expires soon",
-"PE98":"Please select your new certificate",
-"PE99":"Please select your new certificate",
+"PE97":"Il certificato non ? valido o scade a breve",
+"PE98":"Selezionare un nuovo certificato",
+"PE99":"Selezionare un nuovo certificato",
 "SSOSessionInactive":"Sessione SSO inattiva",
 "UA":"User agent",
 "VHnotFound":"Host virtuale non trovato",
@@ -112,8 +112,8 @@
 "accountCreated":"Il tuo account ? stato creato, la tua password temporanea ? stata inviata all'indirizzo email.",
 "accountCreationSuccess":"Il tuo account ? stato creato con successo.",
 "action":"Azione",
-"activeSessions":"Active SSO sessions",
-"all":"All",
+"activeSessions":"Sessioni SSO attive",
+"all":"Tutti",
 "allowed":"Accesso CONSENTITO",
 "anotherInformation":"Un'altra informazione:",
 "areYouSure":"Sei sicuro?",
@@ -124,7 +124,7 @@
 "authPortal":"Portale di autenticazione",
 "authRemaining":"Rimangono ancora %s autenticazioni, modifica la password!",
 "autoAccept":"Accetta automaticamente in 30 secondi",
-"autoGlobalLogout":"Automatically global logout in 30 seconds",
+"autoGlobalLogout":"Logout globale automatico in 30 secondi",
 "back2CasUrl":"L'applicazione dalla quale ti sei appena sconnesso ha fornito un link che dovresti seguire",
 "back2Portal":"Torna al portale",
 "backToTop":"Back to top",
@@ -132,20 +132,20 @@
 "badName":"Nome errato",
 "cancel":"Cancella",
 "captcha":"Captcha",
-"certificateReset":"Reset my certificate",
+"certificateReset":"Reimpostare il mio certificato",
 "changePwd":"Cambia la tua password",
-"checkDevOps":"Check DevOps handler file",
+"checkDevOps":"Verificare il file del gestore DevOps",
 "checkLastLogins":"Controllare i miei ultimi accessi",
 "checkUser":"Controlla il profilo SSO dell'utente",
-"checkUserComputedSession":"No SSO session found. Computed data!",
-"checkUserMerged":"Check user SSO profile. Some Real and Spoofed SSO groups are merged!",
-"checkUserNoSessionFound":"No SSO session found",
-"checkentropyLabel":"Password strength",
+"checkUserComputedSession":"Nessuna sessione SSO trovata. Dati calcolati!",
+"checkUserMerged":"Controllare il profilo SSO dell'utente. Alcuni gruppi SSO reali e spoofed sono uniti!",
+"checkUserNoSessionFound":"Sessione SSO non trovata",
+"checkentropyLabel":"Entropia della password",
 "choose2f":"Scegli il tuo secondo fattore",
 "chooseApp":"Scegli un'applicazione alla quale ti ? consentito l'accesso",
-"cipheredValue":"Ciphered value",
+"cipheredValue":"Valore cifrato",
 "click2Reset":"Clicca qui per reimpostare la password",
-"clickHere":"Per favore clicka qui",
+"clickHere":"Per favore clicca qui",
 "clickOnYubikey":"Clicca sulla tua Yubikey",
 "close":"Close",
 "closeSSO":"Chiudi la sessione SSO",
@@ -155,44 +155,44 @@
 "confirmation":"Conferma",
 "connect":"Connetti",
 "connectedAs":"Connesso come",
-"contextSwitching_OFF":"Stop impersonation",
-"contextSwitching_ON":"Impersonate another user",
+"contextSwitching_OFF":"Interrompe l'impersonificazione",
+"contextSwitching_ON":"Impersonificare un altro utente",
 "continue":"Procedi",
 "createAccount":"Crea un account",
-"csrfError":"CSRF check failed",
-"current":"Current",
+"csrfError":"Controllo CSRF fallito",
+"current":"Corrente",
 "currentPwd":"Password attuale",
 "date":"Data",
-"decryptCipheredValue":"Decrypt a ciphered value",
+"decryptCipheredValue":"Decripta un valore cifrato",
 "enterCred":"Inserisci le tue credenziali",
 "enterExt2fCode":"Un codice vi ? stato inviato. Inseritelo",
-"enterMail2fCode":"A code has been sent to your email address. Please enter it",
+"enterMail2fCode":"Un codice ? stato inviato alla vostra casella email. Inseritelo",
 "enterOpenIDLogin":"Inserisci il tuo login OpenID",
-"enterPassword":"Enter your password",
-"enterRadius2fCode":"Please enter your OTP code",
-"enterRest2fCode":"Please enter your OTP code",
-"enterTotpCode":"Inserisci il codice TOTP",
+"enterPassword":"Inserire la password",
+"enterRadius2fCode":"Inserire il codice OTP",
+"enterRest2fCode":"Inserire il codice OTP",
+"enterTotpCode":"Inserire il codice TOTP",
 "enterYubikey":"Utilizza il tuo Yubikey",
 "errorMsg":"Messaggio di errore",
-"expired2Fremoved":"%s expired 2F devices have been removed (%s)!",
+"expired2Fremoved":"%s dispositivi 2F scaduti sono stati rimossi (%s)!",
 "explorer":"Explorer",
-"ext2f":"Verification code",
+"ext2f":"Codice di verifica",
 "firstName":"Nome",
 "forbidden":"Accesso VIETATO",
 "forgotPwd":"Password dimenticata?",
 "generatePwd":"Generare automaticamente la password",
-"generic":"Contact information",
-"generic2fFormatError":"Your contact information does not match the required format",
-"generic2fwelcome":"Register your second factor",
-"genericCheckCode":"A code has been transmitted to you, please input it in the form below",
-"genericRegisterCode":"Input the received code",
-"genericRegisterName":"Name of this contact information",
-"genericRegisterPrompt":"Input your contact information",
-"genericRegisterRegister":"Click this button to finish the registration process",
-"genericRegisterVerify":"Click this button to receive your confirmation code",
-"genericRegistered":"Your contact information has been successfully registered",
-"genericverify":"Verify your contact information",
-"globalLogout":"Global logout",
+"generic":"Informazioni di contatto",
+"generic2fFormatError":"Le informazioni di contatto non corrispondono al formato richiesto",
+"generic2fwelcome":"Registra il Secondo Fattore",
+"genericCheckCode":"Vi ? stato trasmesso un codice, inseritelo nel modulo sottostante",
+"genericRegisterCode":"Inserire il codice ricevuto",
+"genericRegisterName":"Nome di questo contatto",
+"genericRegisterPrompt":"Inserire le informazioni di contatto",
+"genericRegisterRegister":"Clicca il pulsante per terminare il processo di registrazione",
+"genericRegisterVerify":"Clicca il pulsante per ricevere il codice di conferma",
+"genericRegistered":"Le informazioni di contatto sono state registrate con successo",
+"genericverify":"Verifica le informazioni di contatto",
+"globalLogout":"Logout globale",
 "goToPortal":"Vai al portale",
 "gotNewMessages":"Hai dei nuovi messaggi",
 "gplSoft":"Software libero coperto dalla licenza GPL",
@@ -212,7 +212,7 @@
 "lastLoginsCaptionLabel":"Ultimi accessi",
 "lastName":"Cognome",
 "linkValidUntil":"Questo messaggio contiene un link per reimpostare la password, questo link ? valido fino al",
-"linkValidUntilCertif":"This message contains a link to reset your certificate, this link is valid until ",
+"linkValidUntilCertif":"Questo messaggio contiene un link per per reimpostare il vostro certificato, questo link ? valido fino al ",
 "login":"Login",
 "loginHistory":"Cronologia login",
 "logout":"Logout",
@@ -224,37 +224,37 @@
 "mail2f":"Email code",
 "mailSent2":"Vi ? stato inviato un messaggio via mail",
 "maintenanceMode":"Questa applicazione ? in manutenzione, prova a connetterti pi? tardi",
-"mandatoryField":"* Mandatory field",
+"mandatoryField":"* Campo obbligatorio",
 "maxNumberOf2FDevicesReached":"Raggiunto il numero massimo di dispositivi 2F !",
 "missingCode":"Manca il codice",
-"missingPassword":"Password was not entered",
-"myNotification":"My accepted notification",
-"myNotifications":"My accepted notifications",
+"missingPassword":"La password non ? stata inserita",
+"myNotification":"La notifica di accettazione",
+"myNotifications":"Le notifiche di accettazione",
 "name":"Nome",
 "newMessages":"Nuovo(i) messaggio(i)",
 "newPassword":"Nuova password",
 "newPwdSentTo":"Una conferma ? stata inviata all'indirizzo di posta elettronica.",
-"noAppAllowed":"None appplication allowed!",
+"noAppAllowed":"Nessuna applicazione consentita!",
 "noHistory":"Questa ? la tua prima connessione, benvenuto!",
-"noNotification":"None accepted notification found",
+"noNotification":"Nessuna notifica accettata ? stata trovata",
 "noTOTPFound":"Nessun TOTP trovato",
 "noU2FKeyFound":"Nessuna chiave U2F trovata",
-"notAnEncryptedValue":"It is not an encrypted value",
+"notAnEncryptedValue":"Non ? un valore cifrato",
 "notAuthorized":"Non sei autorizzato a farlo",
-"notAuthorizedAuthLevel":"This action requires a higher authentication level",
+"notAuthorizedAuthLevel":"Questa azione richiede un livello di autenticazione superiore",
 "notFound":"Non trovato: si tenta di accedere ad una pagina non disponibile",
 "notificationNotFound":"La notifica non ? stata trovata",
-"notificationRetrieveFailed":"Unable to retrieve notification",
-"notificationsExplorer":"Notifications explorer",
+"notificationRetrieveFailed":"Impossibile recuperare la notifica",
+"notificationsExplorer":"Visualizzatore delle notifiche",
 "oidcConsent":"L'applicazione %s vorrebbe sapere:",
 "oidcConsents":"Consensi OIDC",
 "oidcConsentsFull":"Consensi OpenID Connect",
 "okta2f":"Okta",
-"okta2fSelectFactor":"Select the Okta module you want to use",
+"okta2fSelectFactor":"Selezionare il modulo Okta che si desidera utilizzare",
 "okta2fpush":"Okta Push",
 "okta2fsms":"Okta SMS",
 "okta2ftokensoftwaretotp":"Okta TOTP",
-"oneExpired2Fremoved":"An expired 2F device has been removed (%s)!",
+"oneExpired2Fremoved":"Un dispositivo 2F ? stato rimosso (%s)!",
 "openIdExample":"per esempio:http://myopenid.org/toto",
 "openSSOSession":"Apri la sessione SSO",
 "openSessionSpace":"Questo spazio consente di aprire una sessione SSO. Questo vi aiuter? ad accedere in modo sicuro a tutte le applicazioni autorizzate dal tuo profilo.",
@@ -265,24 +265,24 @@
 "otherSessions":"Altre sessioni attive",
 "password":"Password",
 "password2f":"Password",
-"passwordCompromised":"Not found in a compromised password database",
-"passwordPolicy":"Please respect the following policy:",
-"passwordPolicyMaxSize":"Maximal size:",
-"passwordPolicyMinDigit":"Minimal digit characters:",
-"passwordPolicyMinLower":"Minimal lower characters:",
-"passwordPolicyMinSize":"Minimal size:",
-"passwordPolicyMinSpeChar":"Minimal special characters:",
-"passwordPolicyMinUpper":"Minimal upper characters:",
-"passwordPolicyNone":"You are free to choose your password!",
-"passwordPolicySamePwd":"You must confirm your new password by entering it twice",
-"passwordPolicySpecialChar":"Allowed special characters:",
-"passwordverify":"Double-check your password",
-"pasteHere":"Paste your file here...",
+"passwordCompromised":"Non trovato in un database di password compromesse",
+"passwordPolicy":"Si prega di rispettare le seguenti policy di sicurezza:",
+"passwordPolicyMaxSize":"Lunghezza massima:",
+"passwordPolicyMinDigit":"Numero min. di caratteri:",
+"passwordPolicyMinLower":"Numero min. di lettere minuscole:",
+"passwordPolicyMinSize":"Lunghezza minima:",
+"passwordPolicyMinSpeChar":"Numero min. di caratteri speciali:",
+"passwordPolicyMinUpper":"Numero min. di lettere maiuscole:",
+"passwordPolicyNone":"Siete liberi di scegliere la vostra password!",
+"passwordPolicySamePwd":"? necessario confermare la nuova password inserendola due volte",
+"passwordPolicySpecialChar":"Caratteri speciali ammessi:",
+"passwordverify":"Verifica della password",
+"pasteHere":"Incollare il file qui...",
 "ppGrace":"autenticazioni restanti, modifica la tua password!",
 "proxyError":"Gateway errata: impossibile associarsi a un server remoto",
 "pwd":"Password",
 "pwdChange":"Cambio password",
-"pwdChanged":"Your password has been successfully changed!",
+"pwdChanged":"La password ? stata modificata con successo!",
 "pwdResetAlreadyIssued":"Una richiesta di ripristino della password ? gi? stata rilasciata",
 "pwdWillExpire":"%s giorni, %s ore, %s minuti e %s secondi prima della scadenza della password, cambiala!",
 "radius2f":"Radius",
@@ -296,96 +296,96 @@
 "register":"Registra",
 "registerRequestAlreadyIssued":"Una richiesta di registrazione per questo conto ? gi? stata rilasciata il",
 "rememberChoice":"Ricordarsi della mia scelta",
-"rememberTimerLabel":"s before automatic authentication",
-"remove2fWarning":"This operation cannot be undone",
+"rememberTimerLabel":"s prima dell'autenticazione automatica",
+"remove2fWarning":"Questa operazione non pu? essere annullata",
 "removeOtherSessions":"Rimuovere altre sessioni",
-"renewSession":"Renew session",
-"resendCode":"Re-send code",
+"renewSession":"Rinnova la sessione",
+"resendCode":"Reinvio del codice",
 "resendConfirmMail":"Inviare nuovamente mail di conferma?",
-"resendTooSoon":"Please wait a little longer before trying to re-send the code",
+"resendTooSoon":"Attendere ancora un po' prima di provare a inviare nuovamente il codice",
 "resentConfirm":"Vuoi inviare di nuovo la mail di conferma?",
 "resetPwd":"Reimpostare la password",
-"rest2f":"Verification code",
-"retry":"Retry",
+"rest2f":"Codice di verifica",
+"retry":"Riprova",
 "rightsReloadNeedsLogout":"Le ricariche dei diritti necessitano di disconnettersi e di riconnettersi",
-"rules":"RULES",
+"rules":"REGOLE",
 "scope":"Ambito",
 "search":"Ricerca",
-"searchAccount":"Search for account",
-"searchingForm":"Searching form",
-"seconds":"seconds",
+"searchAccount":"Ricerca dell'account",
+"searchingForm":"Form di ricerca",
+"seconds":"secondi",
 "selectIdP":"Seleziona il tuo provider di identit?",
 "sendPwd":"Inviami il link",
 "serverError":"Un, errore si verifica sul server",
 "service":"Servizio",
 "serviceProvidedBy":"Servizio offerto da",
 "sessionsDeleted":"Le sessioni seguenti sono state chiuse",
-"sfaManager":"2ndFA Manager",
-"showhidePasswords":"Show/Hide passwords",
+"sfaManager":"Manager 2ndFA",
+"showhidePasswords":"Mostra/Nascondi password",
 "spoofId":"Id usurpato",
 "startTime":"Data di creazione",
-"stayConnected":"Trust this device for future logins",
+"stayConnected":"Considera affidabile questo dispositivo per i futuri accessi",
 "submit":"Invia",
-"switchContext":"Switch context",
-"totp2f":"OTP App",
-"totpMissingCode":"Please enter the code supplied by your TOTP application",
-"totpOrTouch":"If you see this on your mobile, touch the QR code to open your TOTP application",
-"totpQrCode":"Scan this QR code in your TOTP application",
-"totpRegisterCode":"Input the code provided by your application",
-"totpRegisterName":"Choose a name for this TOTP device",
-"totpSecretKey":"If your TOTP application does not support QR codes, enter the following key instead:",
+"switchContext":"Cambio di contesto",
+"totp2f":"App. OTP",
+"totpMissingCode":"Immettere il codice fornito dalla propria applicazione TOTP",
+"totpOrTouch":"Se vedete questo messaggio sul vostro cellulare, inquadrate il codice QR per aprire l'applicazione TOTP",
+"totpQrCode":"Inquadrate questo codice QR nella vostra applicazione TOTP",
+"totpRegisterCode":"Inserite il codice fornito dalla vostra applicazione",
+"totpRegisterName":"Scegliere un nome per questa applicazione TOTP",
+"totpSecretKey":"Se l'applicazione TOTP non supporta i codici QR, inserire invece la seguente chiave:",
 "touchU2fDevice":"Adesso tocca il dispositivo U2F lampeggiante.",
 "touchU2fDeviceOrEnterTotp":"Tocca il dispositivo U2F lampeggiante o inserisci il codice TOTP.",
 "type":"Tipo",
-"u2f":"U2F Key",
+"u2f":"Chiave U2F",
 "u2fFailed":"Verifica U2F non riuscita. Riprovare o contattare l'amministratore",
 "u2fPermission":"? possibile che venga richiesto di consentire il permesso del sito per accedere alle chiavi di sicurezza. Dopo aver concesso il permesso, il dispositivo inizier? a lampeggiare.",
 "u2fWelcome":"Gestione dei dispositivi U2F",
 "unableToGetKey":"Impossibile accedere alla chiave. Riprovare o contattare l'amministratore",
 "unknownAction":"Azione sconosciuta",
-"unknownAttributes":"Unknown attributes",
+"unknownAttributes":"Sttributi sconosciuti",
 "unregister":"Annullare la registrazione",
 "updateCdc":"Aggiorna il Cookie di Common Domain",
 "updateTime":"Aggiorna data",
 "upgradeSession":"Sessione di aggiornamento",
 "useYubikey":"Usa la tua Yubikey",
 "user":"Utente",
-"validationDate":"Validation date",
+"validationDate":"Data di validazione",
 "value":"Valore",
 "verify":"Verifica",
 "wait":"Attendere",
-"waitFor2f":"Waiting for your second factor activation",
+"waitFor2f":"Attendere l'attivazione del second fattore",
 "waitingmessage":"Autenticazione in corso, attendere prego",
 "warning":"Avvertimento",
-"webAuthnBrowserFailed":"Browser failed to obtain WebAuthn credential",
-"webAuthnBrowserInProgress":"WebAuthn authentication in progress. Please follow your browser's instructions",
-"webAuthnFailed":"WebAuthn authentication failed",
-"webAuthnNoDevice":"No WebAuthn device available for this account",
-"webAuthnRegisterFailed":"WebAuthn registration failed",
-"webAuthnRegisterInProgress":"WebAuthn registration in progress. Please follow your browser's instructions",
-"webAuthnRequired":"WebAuthn authentication required",
-"webAuthnUnsupported":"Your web browser does not support WebAuthn",
+"webAuthnBrowserFailed":"Il browser non ? riuscito a ottenere le credenziali WebAuthn",
+"webAuthnBrowserInProgress":"Autenticazione WebAuthn in corso. Seguire le istruzioni del browser",
+"webAuthnFailed":"Autenticazione WebAuthn fattita",
+"webAuthnNoDevice":"Nessun dispositivo WebAuthn disponibile per questo account",
+"webAuthnRegisterFailed":"Registrazione WebAuthn fallita",
+"webAuthnRegisterInProgress":"Registrazione WebAuthn in corso. Seguire le istruzioni del browser",
+"webAuthnRequired":"Autenticazione WebAuthn richiesta",
+"webAuthnUnsupported":"Il vostro browser web non supporta WebAuthn",
 "webauthn2f":"WebAuthn",
-"webauthn2fWelcome":"Security device registration",
-"webauthnAlreadyRegistered":"This device is already registered",
-"webauthnResident":"This device can be used as a passkey",
+"webauthn2fWelcome":"Registrazione del dispositivo di sicurezza",
+"webauthnAlreadyRegistered":"Questo dispositivo ? gi? registrato",
+"webauthnResident":"Questo dispositivo pu? essere utilizzato come chiame di accesso",
 "welcomeOnPortal":"Benvenuto sul tuo portale di autenticazione protetta.",
 "yesResendMail":"S?, rinvia e-mail",
-"your2faIsRegistered":"Your second factor has been registered",
-"yourAddress":"Know your address",
+"your2faIsRegistered":"Il vostro secondo fattore ? stato registrato",
+"yourAddress":"Il tuo indirizzo",
 "yourApps":"Le vostre applicazioni",
-"yourEmail":"Know your email",
-"yourIdentity":"Know your identity",
+"yourEmail":"Il tuo indirizzo email",
+"yourIdentity":"La tua identit?",
 "yourIdentityIs":"La tua identit? ?",
-"yourKeyIsAlreadyRegistered":"La tua chiave ? GI? registrata !",
+"yourKeyIsAlreadyRegistered":"La tua chiave ? GI? registrata!",
 "yourKeyIsRegistered":"La vostra chiave ? registrata",
 "yourKeyIsUnregistered":"La vostra chiave ? stata rimossa",
 "yourKeyIsVerified":"La tua chiave ? stata testata con successo",
 "yourNewTotpKey":"La tua nuova chiave TOTP, per favore provala e inserisci il codice",
-"yourOffline":"Access your account while you are offline",
-"yourPasswordIsRegistered":"Your password has been registered",
-"yourPhone":"Know your phone number",
-"yourProfile":"Know your profile",
+"yourOffline":"Accedere al proprio account mentre si ? offline",
+"yourPasswordIsRegistered":"La password ? stata registrata",
+"yourPhone":"Il tuo numedo di telefono",
+"yourProfile":"Il tuo profilo",
 "yourTotpKey":"La tua chiave TOTP",
 "yubikey2f":"Yubikey"
 }
\ No newline at end of file
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/mfe.json b/lemonldap-ng-portal/site/htdocs/static/languages/mfe.json
index 2f3221cef..0118b3a5a 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/mfe.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/mfe.json
@@ -195,7 +195,7 @@
 "globalLogout":"logout global",
 "goToPortal":"Al lor portay",
 "gotNewMessages":"Ou ena bann nouvo mesaz",
-"gplSoft":"lozisiel gratwi ki kouver par lisans GPL",
+"gplSoft":"lozisiel gratwi ki kouver par lisans GPL.",
 "groups_sso":"BANN GROUP SSO",
 "headers":"BANN ANTET",
 "hello":"Bonzour",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/pl.json b/lemonldap-ng-portal/site/htdocs/static/languages/pl.json
index 5c0d6fcfa..978c8a430 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/pl.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/pl.json
@@ -195,7 +195,7 @@
 "globalLogout":"Globalne wylogowanie",
 "goToPortal":"Przejd? do portalu",
 "gotNewMessages":"Masz par? nowych wiadomo?ci",
-"gplSoft":"darmowe oprogramowanie obj?te licencj? GPL",
+"gplSoft":"darmowe oprogramowanie obj?te licencj? GPL.",
 "groups_sso":"GRUPY SSO",
 "headers":"NAG??WKI",
 "hello":"Cze??",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/pt.json b/lemonldap-ng-portal/site/htdocs/static/languages/pt.json
index 68ce04f74..ef7d10e94 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/pt.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/pt.json
@@ -195,7 +195,7 @@
 "globalLogout":"Logout global",
 "goToPortal":"Ir para o Portal",
 "gotNewMessages":"Voc? tem algumas mensagens novas",
-"gplSoft":"software livre coberto pela licen?a GPL",
+"gplSoft":"software livre coberto pela licen?a GPL.",
 "groups_sso":"GRUPOS SSO",
 "headers":"CABE?ALHOS",
 "hello":"Ol?",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/pt_BR.json b/lemonldap-ng-portal/site/htdocs/static/languages/pt_BR.json
index c5b7090c6..c57c53549 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/pt_BR.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/pt_BR.json
@@ -195,7 +195,7 @@
 "globalLogout":"Logout global",
 "goToPortal":"Ir para o Portal",
 "gotNewMessages":"Voc? tem algumas mensagens novas",
-"gplSoft":"software livre coberto pela licen?a GPL",
+"gplSoft":"software livre coberto pela licen?a GPL.",
 "groups_sso":"GRUPOS SSO",
 "headers":"CABE?ALHOS",
 "hello":"Ol?",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/ru.json b/lemonldap-ng-portal/site/htdocs/static/languages/ru.json
index 0e6a39573..e47ad6909 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/ru.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/ru.json
@@ -195,7 +195,7 @@
 "globalLogout":"?????????? ?????",
 "goToPortal":"??????? ?? ??????",
 "gotNewMessages":"? ??? ???? ????????????? ?????????",
-"gplSoft":"?????????? ??, ?? ??????? ???????????????? ???????? GPL",
+"gplSoft":"?????????? ??, ?? ??????? ???????????????? ???????? GPL.",
 "groups_sso":"SSO-??????",
 "headers":"?????????",
 "hello":"????????????",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/sk.json b/lemonldap-ng-portal/site/htdocs/static/languages/sk.json
new file mode 100644
index 000000000..c2d4b5860
--- /dev/null
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/sk.json
@@ -0,0 +1,391 @@
+{
+"2FDeviceNotFound":"Dvojfaktorov? zariadenie nen?jden?",
+"2fRegRequired":"Tento servis vy?aduje dvojfaktorov? autentifik?ciu. Zaregistrujte zariadenie teraz a potom sa vr??te na port?l.",
+"PE0":"Pou??vate? autentifikovan?",
+"PE1":"Va?e pripojenie vypr?alo, mus?te sa znova autentifikova?",
+"PE10":"Neplatn? certifik?t",
+"PE100":"Heslo obsahuje nepovolen? znak",
+"PE101":"Heslo obsahuje nepovolen? znaky",
+"PE102":"Rel?cia mus? by? aktualizovan?",
+"PE103":"Pre v?? ??et nie s? k dispoz?cii druh? faktory",
+"PE104":"Zl? DevOps s?bor",
+"PE105":"S?bor nen?jden?",
+"PE106":"Chyba po?as autentifik?cie s poskytovate?om OpenID",
+"PE107":"T?to aplik?cia nie je zn?ma",
+"PE108":"Neautorizovan? URL",
+"PE109":"Nie je to chr?nen? alebo d?veryhodn? URL",
+"PE110":"Overenie druh?ho faktora zlyhalo, sk?ste to znova",
+"PE111":"Heslo je pr?li? dlh?",
+"PE2":"Polia pou??vate?sk?ho mena a hesla musia by? vyplnen?",
+"PE20":"?iadny backend hesiel nie je definovan?",
+"PE21":"V?? ??et je zablokovan?",
+"PE22":"Va?e heslo vypr?alo",
+"PE23":"Certifik?t je potrebn?",
+"PE24":"Chyba",
+"PE25":"Heslo bolo resetovan? a teraz ho mus?te zmeni?",
+"PE26":"Heslo nem??e by? modifikovan?",
+"PE27":"Star? heslo mus? by? tie? poskytnut? pri nastavovan? nov?ho hesla",
+"PE28":"Nedostato?n? kvalita hesla",
+"PE29":"Heslo je pr?li? kr?tke",
+"PE3":"Nespr?vny ??et spr?vcu adres?ra alebo heslo",
+"PE30":"Heslo je pr?li? mlad?",
+"PE31":"Heslo bolo pou?it? pr?li? ned?vno",
+"PE32":" zost?vaj?ce autentifik?cie, zme?te svoje heslo!",
+"PE33":"%d dn?, %d hod?n, %d min?t a %d sek?nd pred vypr?an?m hesla, zme?te ho!",
+"PE34":"Hesl? sa nezhoduj?",
+"PE35":"Heslo bolo ?spe?ne zmenen?",
+"PE36":"M?te nov? spr?vu",
+"PE37":"Zl? URL",
+"PE38":"?iadny sch?ma nie je k dispoz?cii",
+"PE39":"Zl? star? heslo",
+"PE4":"Pou??vate? nen?jden? v adres?ri",
+"PE40":"Zl? pou??vate?sk? meno",
+"PE41":"Otvorenie rel?cie nie je povolen?",
+"PE42":"Potvrdenie je potrebn?",
+"PE43":"Va?a e-mailov? adresa je povinn?",
+"PE44":"K??? potvrdenia je neplatn? alebo pr?li? star?",
+"PE45":"Pri odosielan? e-mailu do?lo k chybe",
+"PE46":"E-mail bol odoslan?",
+"PE47":"Boli ste odpojen?",
+"PE48":"Nedefinovan? SAML chyba",
+"PE49":"Nemo?no na??ta? SAML slu?bu",
+"PE5":"Nespr?vne poverenia",
+"PE50":"Probl?m pri na??tan? poskytovate?a identity",
+"PE51":"Pri SAML single sign on do?lo k chybe",
+"PE52":"SAML entita nie je zn?ma",
+"PE53":"Cie? SAML spr?vy nie je spr?vny",
+"PE54":"Podmienky SAML spr?vy nie s? dodr?an?",
+"PE55":"Overenie iniciovan? poskytovate?om identity nie je povolen?",
+"PE56":"Boli ste odpojen?, ale do?lo k chybe v inej aplik?cii, mali by ste zavrie? svoj prehliada?",
+"PE57":"Chyba pri spr?ve podpisu SAML spr?vy",
+"PE58":"Pri pou?it? SAML artefaktu do?lo k chybe",
+"PE59":"Chyba komunik?cie so SAML rel?ciami",
+"PE6":"Nemo?no sa pripoji? k LDAP serveru",
+"PE60":"Probl?m pri na??tan? poskytovate?a slu?ieb",
+"PE61":"Pri v?mene SAML atrib?tov do?lo k chybe",
+"PE62":"Toto je str?nka koncov?ho bodu OpenID",
+"PE63":"Sna??te sa pou?i? identitu OpenID, ktor? nie je va?a",
+"PE64":"Povinn? atrib?t nie je k dispoz?cii",
+"PE65":"Feder?cia zak?zan? bezpe?nostnou politikou",
+"PE66":"E-mail s potvrden?m bol u? odoslan?",
+"PE67":"Pole hesla mus? by? vyplnen?",
+"PE68":"Pr?stup nie je povolen? na CAS slu?be",
+"PE69":"Pros?m, poskytnite svoju e-mailov? adresu",
+"PE7":"Abnorm?lna chyba zo servera LDAP",
+"PE70":"?iadny zhoduj?ci sa pou??vate?",
+"PE71":"Pros?m, poskytnite svoje nov? heslo",
+"PE72":"E-mail s potvrden?m bol odoslan?",
+"PE73":"Pripojenie Radius zlyhalo",
+"PE74":"Star? heslo je povinn?",
+"PE75":"Pri?li ste z neakreditovanej IP adresy",
+"PE76":"Nepodarilo sa zada? captcha",
+"PE77":"Mus?te zada? captcha",
+"PE78":"Pros?m, zadajte svoje inform?cie",
+"PE79":"Ch?baj?ce inform?cie",
+"PE8":"Chyba modulu na ukladanie rel?ci?",
+"PE80":"T?to adresa je u? pou?it?",
+"PE81":"Neplatn? pokus o autentifik?ciu",
+"PE82":"Prekro?en? ?asov? limit autentifik?cie",
+"PE83":"WebAuthn autentifik?cia zlyhala",
+"PE84":"Nie ste opr?vnen? na pr?stup k tomuto hostite?ovi",
+"PE85":"Vzdialen? str?nka po?aduje nov?iu rel?ciu (a plugin UpgradeSession nie je na??tan?). Odhl?ste sa a sk?ste to znova",
+"PE86":"V?? ??et je zablokovan?. Mus?te po?ka?",
+"PE87":"Mus?te sa znova autentifikova?, aby ste mali pr?stup k port?lu",
+"PE88":"V?? ??et mus? ma? e-mailov? adresu, aby ste mohli pou??va? dvojfaktorov? autentifik?ciu",
+"PE89":"Pr?stup nie je povolen? na SAML slu?be",
+"PE9":"Vy?aduje sa autentifik?cia",
+"PE90":"Pr?stup nie je povolen? na OIDC slu?be",
+"PE91":"Pr?stup nie je povolen? na OID slu?be",
+"PE92":"Pr?stup nie je povolen? na GET slu?be",
+"PE93":"Pr?stup nie je povolen? na slu?be USURP?CIA IDENTIT",
+"PE94":"Povinn? atrib?t nie je k dispoz?cii",
+"PE95":"Pr?stup nie je povolen? na DECRYPT slu?be",
+"PE96":"Neplatn? overovac? k?d",
+"PE97":"V?? certifik?t je neplatn? alebo ?oskoro vypr??",
+"PE98":"Pros?m, vyberte svoj nov? certifik?t",
+"PE99":"Pros?m, vyberte svoj nov? certifik?t",
+"SSOSessionInactive":"SSO rel?cia neakt?vna",
+"UA":"Pou??vate?sk? agent",
+"VHnotFound":"Virtu?lny hostite? nen?jden?",
+"accept":"Prija?",
+"accessDenied":"Nem?te pr?stupov? opr?vnenie k tejto aplik?cii",
+"accountCreated":"V?? ??et bol vytvoren?, do?asn? heslo bolo odoslan? na va?u e-mailov? adresu.",
+"accountCreationSuccess":"V?? ??et bol ?spe?ne vytvoren?.",
+"action":"Akcia",
+"activeSessions":"Akt?vne SSO rel?cie",
+"all":"V?etko",
+"allowed":"Pr?stup POVOLEN?",
+"anotherInformation":"?al?ia inform?cia:",
+"areYouSure":"Ste si ist??",
+"askToRenew":"T?to aplik?cia potrebuje nov?iu autentifik?ciu. Chcete sa znovu autentifikova??",
+"askToUpgrade":"T?to aplik?cia potrebuje vy??iu ?rove? autentifik?cie. Chcete sa znovu autentifikova??",
+"attributes":"ATRIBUTY",
+"authLevel":"?rove? autentifik?cie",
+"authPortal":"Port?l autentifik?cie",
+"authRemaining":"%s autentifik?ci? zost?va, zme?te svoje heslo!",
+"autoAccept":"Automaticky prija? za 30 sek?nd",
+"autoGlobalLogout":"Automatick? glob?lna odhl?senie za 30 sek?nd",
+"back2CasUrl":"Aplik?cia, z ktorej ste sa pr?ve odhl?sili, poskytla odkaz, ktor? by ste mali sledova?",
+"back2Portal":"Vr?ti? sa na port?l",
+"backToTop":"Sp?? na za?iatok",
+"badCode":"Zl? k?d",
+"badName":"Zl? meno",
+"cancel":"Zru?i?",
+"captcha":"Captcha",
+"certificateReset":"Resetova? m?j certifik?t",
+"changePwd":"Zmeni? svoje heslo",
+"checkDevOps":"Skontrolova? DevOps s?bor",
+"checkLastLogins":"Skontrolova? moje posledn? prihl?senia",
+"checkUser":"Skontrolova? SSO profil pou??vate?a",
+"checkUserComputedSession":"?iadna SSO rel?cia nen?jden?. Vypo??tan? ?daje!",
+"checkUserMerged":"Skontrolova? SSO profil pou??vate?a. Niektor? skuto?n? a falo?n? SSO skupiny s? zl??en?!",
+"checkUserNoSessionFound":"?iadna SSO rel?cia nen?jden?",
+"checkentropyLabel":"Sila hesla",
+"choose2f":"Vyberte svoj druh? faktor",
+"chooseApp":"Vyberte aplik?ciu, ku ktorej m?te pr?stup",
+"cipheredValue":"Za?ifrovan? hodnota",
+"click2Reset":"Kliknite sem na resetovanie hesla",
+"clickHere":"Pros?m, kliknite sem",
+"clickOnYubikey":"Kliknite na svoju Yubikey",
+"close":"Zavrie?",
+"closeSSO":"Zavrie? svoju SSO rel?ciu",
+"code":"K?d",
+"confirmLinkSent":"Odkaz na potvrdenie bol odoslan?. Tento odkaz je platn? do ",
+"confirmPwd":"Potvr?te heslo",
+"confirmation":"Potvrdenie",
+"connect":"Pripoji?",
+"connectedAs":"Pripojen? ako",
+"contextSwitching_OFF":"Zastavi? predstieranie",
+"contextSwitching_ON":"Predstiera? in?ho pou??vate?a",
+"continue":"Pokra?ova?",
+"createAccount":"Vytvori? ??et",
+"csrfError":"CSRF kontrola zlyhala",
+"current":"Aktu?lne",
+"currentPwd":"Aktu?lne heslo",
+"date":"D?tum",
+"decryptCipheredValue":"De?ifrova? za?ifrovan? hodnotu",
+"enterCred":"Pros?m, zadajte svoje poverenia",
+"enterExt2fCode":"K?d bol odoslan? na v?s. Pros?m, zadajte ho",
+"enterMail2fCode":"K?d bol odoslan? na va?u e-mailov? adresu. Pros?m, zadajte ho",
+"enterOpenIDLogin":"Pros?m, zadajte svoje OpenID prihl?senie",
+"enterPassword":"Zadajte svoje heslo",
+"enterRadius2fCode":"Pros?m, zadajte svoj OTP k?d",
+"enterRest2fCode":"Pros?m, zadajte svoj OTP k?d",
+"enterTotpCode":"Zadajte TOTP k?d",
+"enterYubikey":"Pros?m, pou?ite svoju Yubikey",
+"errorMsg":"Chybov? hl?senie",
+"expired2Fremoved":"%s expirovan? 2F zariadenia boli odstr?nen? (%s)!",
+"explorer":"Prieskumn?k",
+"ext2f":"Overovac? k?d",
+"firstName":"Meno",
+"forbidden":"Pr?stup ZAK?ZAN?",
+"forgotPwd":"Zabudli ste svoje heslo?",
+"generatePwd":"Automaticky vygenerova? heslo",
+"generic":"Kontaktn? inform?cie",
+"generic2fFormatError":"Va?e kontaktn? inform?cie nevyhovuj? po?adovan?mu form?tu",
+"generic2fwelcome":"Zaregistrujte svoj druh? faktor",
+"genericCheckCode":"K?d bol odoslan?, pros?m, zadajte ho do formul?ra ni??ie",
+"genericRegisterCode":"Zadajte prijat? k?d",
+"genericRegisterName":"N?zov tejto kontaktn? inform?cie",
+"genericRegisterPrompt":"Zadajte svoje kontaktn? inform?cie",
+"genericRegisterRegister":"Kliknite na toto tla?idlo na dokon?enie registra?n?ho procesu",
+"genericRegisterVerify":"Kliknite na toto tla?idlo na prijatie v??ho potvrdenia",
+"genericRegistered":"Va?e kontaktn? inform?cie boli ?spe?ne zaregistrovan?",
+"genericverify":"Overte svoje kontaktn? inform?cie",
+"globalLogout":"Glob?lne odhl?senie",
+"goToPortal":"Prejs? na port?l",
+"gotNewMessages":"M?te nov? spr?vy",
+"gplSoft":"vo?n? softv?r chr?nen? licenciou GPL.",
+"groups_sso":"SSO SKUPINY",
+"headers":"HLAVI?KY",
+"hello":"Ahoj",
+"hide":"Skry?",
+"home":"Domov",
+"id":"Id",
+"imSure":"Som si ist?",
+"info":"Inform?cie",
+"ipAddr":"IP adresa",
+"key":"K???",
+"lastFailedLogins":"Posledn? ne?spe?n? prihl?senia",
+"lastFailedLoginsCaptionLabel":"Posledn? ne?spe?n? prihl?senia",
+"lastLogins":"Posledn? prihl?senia",
+"lastLoginsCaptionLabel":"Posledn? prihl?senia",
+"lastName":"Priezvisko",
+"linkValidUntil":"T?to spr?va obsahuje odkaz na resetovanie v??ho hesla, tento odkaz je platn? do ",
+"linkValidUntilCertif":"T?to spr?va obsahuje odkaz na resetovanie v??ho certifik?tu, tento odkaz je platn? do ",
+"login":"Prihl?senie",
+"loginHistory":"Hist?ria prihl?sen?",
+"logout":"Odhl?senie",
+"logoutConfirm":"Chcete sa odhl?si??",
+"logoutFromOtherApp":"Odhl?senie z in?ch aplik?ci? ...",
+"logoutFromSP":"Odhl?senie z poskytovate?ov slu?ieb ...",
+"macros":"MAKRA",
+"mail":"E-mail",
+"mail2f":"E-mailov? k?d",
+"mailSent2":"Spr?va bola odoslan? na va?u e-mailov? adresu.",
+"maintenanceMode":"T?to aplik?cia je v ?dr?be, pros?m, sk?ste sa pripoji? nesk?r",
+"mandatoryField":"* Povinn? pole",
+"maxNumberOf2FDevicesReached":"Maxim?lny po?et 2F zariaden? bol dosiahnut?!",
+"missingCode":"K?d ch?ba",
+"missingPassword":"Heslo nebolo zadan?",
+"myNotification":"Moja prijat? notifik?cia",
+"myNotifications":"Moje prijat? notifik?cie",
+"name":"N?zov",
+"newMessages":"Nov? spr?vy",
+"newPassword":"Nov? heslo",
+"newPwdSentTo":"Potvrdenie bolo odoslan? na va?u e-mailov? adresu.",
+"noAppAllowed":"?iadna aplik?cia nie je povolen?!",
+"noHistory":"Toto je va?e prv? prihl?senie, vitajte!",
+"noNotification":"?iadna prijat? notifik?cia nebola n?jden?",
+"noTOTPFound":"?iadny TOTP nen?jden?",
+"noU2FKeyFound":"?iadny U2F k??? nen?jden?",
+"notAnEncryptedValue":"Nie je to za?ifrovan? hodnota",
+"notAuthorized":"Nie ste opr?vnen? to urobi?",
+"notAuthorizedAuthLevel":"T?to akcia vy?aduje vy??iu ?rove? autentifik?cie",
+"notFound":"Nen?jden?: sna??te sa z?ska? pr?stup na nedostupn? str?nku",
+"notificationNotFound":"Notifik?cia nebola n?jden? v datab?ze",
+"notificationRetrieveFailed":"Nemo?no z?ska? notifik?ciu",
+"notificationsExplorer":"Prieskumn?k notifik?ci?",
+"oidcConsent":"Aplik?cia %s by chcela:",
+"oidcConsents":"OIDC s?hlasy",
+"oidcConsentsFull":"S?hlasy OpenID Connect",
+"okta2f":"Okta",
+"okta2fSelectFactor":"Vyberte modul Okta, ktor? chcete pou?i?",
+"okta2fpush":"Okta Push",
+"okta2fsms":"Okta SMS",
+"okta2ftokensoftwaretotp":"Okta TOTP",
+"oneExpired2Fremoved":"Jedno expirovan? 2F zariadenie bolo odstr?nen? (%s)!",
+"openIdExample":"napr?klad: http://myopenid.org/toto",
+"openSSOSession":"Otvorenie va?ej SSO rel?cie",
+"openSessionSpace":"Tento priestor v?m umo??uje otvori? SSO rel?ciu. To v?m pom??e bezpe?ne pristupova? ku v?etk?m aplik?ci?m, ktor? s? autorizovan? va??m profilom.",
+"openidAp":"S?hlas?te s poskytnut?m nasleduj?cich parametrov?",
+"openidExchange":"Chcete sa autentifikova? na %s?",
+"openidPA":"Politika pou??vania ?dajov je k dispoz?cii na",
+"openidRpns":"Parametr %s po?adovan? na feder?ciu nie je k dispoz?cii",
+"otherSessions":"In? akt?vne rel?cie",
+"password":"Heslo",
+"password2f":"Heslo",
+"passwordCompromised":"Nen?jden? v datab?ze kompromitovan?ch hesiel",
+"passwordPolicy":"Pros?m, re?pektujte nasleduj?cu politiku:",
+"passwordPolicyMaxSize":"Maxim?lna ve?kos?:",
+"passwordPolicyMinDigit":"Minim?lny po?et ??slic:",
+"passwordPolicyMinLower":"Minim?lny po?et mal?ch p?smen:",
+"passwordPolicyMinSize":"Minim?lna ve?kos?:",
+"passwordPolicyMinSpeChar":"Minim?lny po?et ?peci?lnych znakov:",
+"passwordPolicyMinUpper":"Minim?lny po?et ve?k?ch p?smen:",
+"passwordPolicyNone":"M??ete si slobodne vybra? svoje heslo!",
+"passwordPolicySamePwd":"Mus?te potvrdi? svoje nov? heslo zadan?m dvakr?t",
+"passwordPolicySpecialChar":"Povolen? ?peci?lne znaky:",
+"passwordverify":"Dvojit? kontrola v??ho hesla",
+"pasteHere":"Vlo?te svoj s?bor sem...",
+"ppGrace":"autentifik?ci? zost?va, zme?te svoje heslo!",
+"proxyError":"Zl? br?na: nemo?no sa pripoji? k vzdialen?mu serveru",
+"pwd":"Heslo",
+"pwdChange":"Zmena hesla",
+"pwdChanged":"Va?e heslo bolo ?spe?ne zmenen?!",
+"pwdResetAlreadyIssued":"?iados? o resetovanie hesla bola u? vydan? d?a ",
+"pwdWillExpire":"%s dn?, %s hod?n, %s min?t a %s sek?nd pred vypr?an?m hesla, zme?te ho!",
+"radius2f":"Radius",
+"redirectedFrom":"Boli ste presmerovan? z ",
+"redirectedIn":"Budete presmerovan? za 30 sek?nd",
+"redirectionInProgress":"Presmerovanie prebieha...",
+"redirectionToIdp":"Presmerovanie na v?? poskytovate? identity",
+"reference":"Referencia",
+"refreshrights":"Obnovi? moje pr?va",
+"refuse":"Odmietnu?",
+"register":"Registrova?",
+"registerRequestAlreadyIssued":"?iados? o registr?ciu tohto ??tu bola u? vydan? d?a ",
+"rememberChoice":"Pam?ta? si moju vo?bu",
+"rememberTimerLabel":"s pred automatickou autentifik?ciou",
+"remove2fWarning":"T?to oper?cia nie je vratn?",
+"removeOtherSessions":"Odstr?ni? in? rel?cie",
+"renewSession":"Obnovi? rel?ciu",
+"resendCode":"Znovu odosla? k?d",
+"resendConfirmMail":"Znovu odosla? potvrdzovac? e-mail?",
+"resendTooSoon":"Pros?m, po?kajte trochu dlh?ie pred pokusom o op?tovn? odoslanie k?du",
+"resentConfirm":"Chcete, aby bol potvrdzovac? e-mail znovu odoslan??",
+"resetPwd":"Resetova? moje heslo",
+"rest2f":"Overovac? k?d",
+"retry":"Sk?si? znova",
+"rightsReloadNeedsLogout":"Obnovenie pr?v vy?aduje odhl?senie a op?tovn? prihl?senie",
+"rules":"PRAVIDL?",
+"scope":"Rozsah",
+"search":"H?ada?",
+"searchAccount":"H?ada? ??et",
+"searchingForm":"H?adac? formul?r",
+"seconds":"sekundy",
+"selectIdP":"Vyberte svojho poskytovate?a identity",
+"sendPwd":"Po?lite mi odkaz",
+"serverError":"Na serveri do?lo k chybe",
+"service":"Slu?ba",
+"serviceProvidedBy":"Slu?bu poskytuje",
+"sessionsDeleted":"Nasleduj?ce rel?cie boli uzavret?",
+"sfaManager":"Spr?vca 2ndFA",
+"showhidePasswords":"Zobrazi?/Skry? hesl?",
+"spoofId":"Falo?n? identifik?tor",
+"startTime":"D?tum vytvorenia",
+"stayConnected":"D?verujte tomuto zariadeniu pre bud?ce prihl?senia",
+"submit":"Odosla?",
+"switchContext":"Zmeni? kontext",
+"totp2f":"OTP aplik?cia",
+"totpMissingCode":"Pros?m, zadajte k?d poskytnut? va?ou TOTP aplik?ciou",
+"totpOrTouch":"Ak to vid?te na svojom mobile, dotknite sa QR k?du, aby ste otvorili svoju TOTP aplik?ciu",
+"totpQrCode":"Naskenujte tento QR k?d vo svojej TOTP aplik?cii",
+"totpRegisterCode":"Zadajte k?d poskytnut? va?ou aplik?ciou",
+"totpRegisterName":"Vyberte n?zov pre toto TOTP zariadenie",
+"totpSecretKey":"Ak va?a TOTP aplik?cia nepodporuje QR k?dy, zadajte namiesto toho nasleduj?ci k???:",
+"touchU2fDevice":"Pros?m, dotknite sa teraz blikaj?ceho U2F zariadenia.",
+"touchU2fDeviceOrEnterTotp":"Pros?m, dotknite sa blikaj?ceho U2F zariadenia alebo zadajte TOTP k?d.",
+"type":"Typ",
+"u2f":"U2F K???",
+"u2fFailed":"U2F overenie zlyhalo. Sk?ste to znova alebo kontaktujte svojho administr?tora",
+"u2fPermission":"M??e sa v?s po?iada?, aby ste povolili str?nke pr?stup k va?im bezpe?nostn?m k???om. Po udelen? povolenia sa zariadenie za?ne blika?.",
+"u2fWelcome":"Spr?va U2F zariadenia",
+"unableToGetKey":"Nemo?no z?ska? pr?stup k v??mu k???u. Sk?ste to znova alebo kontaktujte svojho administr?tora",
+"unknownAction":"Nezn?ma akcia",
+"unknownAttributes":"Nezn?me atrib?ty",
+"unregister":"Zru?i? registr?ciu",
+"updateCdc":"Aktualizova? spolo?n? dom?nov? cookie",
+"updateTime":"D?tum aktualiz?cie",
+"upgradeSession":"Zv??i? rel?ciu",
+"useYubikey":"pou?ite svoju Yubikey",
+"user":"Pou??vate?",
+"validationDate":"D?tum overenia",
+"value":"Hodnota",
+"verify":"Overi?",
+"wait":"?aka?",
+"waitFor2f":"?ak? sa na aktiv?ciu v??ho druh?ho faktora",
+"waitingmessage":"Autentifik?cia prebieha, pros?m, ?akajte",
+"warning":"Upozornenie",
+"webAuthnBrowserFailed":"Prehliada? sa nepodarilo z?ska? WebAuthn poverenie",
+"webAuthnBrowserInProgress":"WebAuthn autentifik?cia prebieha. Pros?m, ria?te sa pokynmi svojho prehliada?a",
+"webAuthnFailed":"WebAuthn autentifik?cia zlyhala",
+"webAuthnNoDevice":"?iadne WebAuthn zariadenie nie je k dispoz?cii pre tento ??et",
+"webAuthnRegisterFailed":"WebAuthn registr?cia zlyhala",
+"webAuthnRegisterInProgress":"WebAuthn registr?cia prebieha. Pros?m, ria?te sa pokynmi svojho prehliada?a",
+"webAuthnRequired":"WebAuthn autentifik?cia je potrebn?",
+"webAuthnUnsupported":"V?? webov? prehliada? nepodporuje WebAuthn",
+"webauthn2f":"WebAuthn",
+"webauthn2fWelcome":"Registr?cia bezpe?nostn?ho zariadenia",
+"webauthnAlreadyRegistered":"Toto zariadenie je u? registrovan?",
+"webauthnResident":"Toto zariadenie m??e by? pou?it? ako heslo",
+"welcomeOnPortal":"Vitajte na va?om zabezpe?enom autentifika?nom port?li.",
+"yesResendMail":"?no, znovu odosla? e-mail",
+"your2faIsRegistered":"V?? druh? faktor bol registrovan?",
+"yourAddress":"Pozna? svoju adresu",
+"yourApps":"Va?e aplik?cie",
+"yourEmail":"Pozna? svoju e-mailov? adresu",
+"yourIdentity":"Pozna? svoju identitu",
+"yourIdentityIs":"Va?a identita je",
+"yourKeyIsAlreadyRegistered":"V?? k??? je U? registrovan?!",
+"yourKeyIsRegistered":"V?? k??? je registrovan?",
+"yourKeyIsUnregistered":"V?? k??? bol zru?en?",
+"yourKeyIsVerified":"V?? k??? je overen?",
+"yourNewTotpKey":"V?? nov? TOTP k???, pros?m, otestujte ho a zadajte k?d",
+"yourOffline":"Pr?stup k v??mu ??tu, ke? ste offline",
+"yourPasswordIsRegistered":"Va?e heslo bolo registrovan?",
+"yourPhone":"Pozna? svoje telef?nne ??slo",
+"yourProfile":"Pozna? svoj profil",
+"yourTotpKey":"V?? TOTP k???",
+"yubikey2f":"Yubikey"
+}
\ No newline at end of file
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/tr.json b/lemonldap-ng-portal/site/htdocs/static/languages/tr.json
index 339652e5d..e2e21b46b 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/tr.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/tr.json
@@ -195,7 +195,7 @@
 "globalLogout":"Global ??k??",
 "goToPortal":"Portala git",
 "gotNewMessages":"Yeni mesajlar?n?z var",
-"gplSoft":"GPL lisans? kapsam?nda ?zg?r yaz?l?m",
+"gplSoft":"GPL lisans? kapsam?nda ?zg?r yaz?l?m.",
 "groups_sso":"TOA GRUPLARI",
 "headers":"BA?LIKLAR",
 "hello":"Merhaba",
diff --git a/lemonldap-ng-portal/site/htdocs/static/languages/zh.json b/lemonldap-ng-portal/site/htdocs/static/languages/zh.json
index d46fddfe9..60276c3d2 100644
--- a/lemonldap-ng-portal/site/htdocs/static/languages/zh.json
+++ b/lemonldap-ng-portal/site/htdocs/static/languages/zh.json
@@ -195,7 +195,7 @@
 "globalLogout":"????",
 "goToPortal":"????",
 "gotNewMessages":"???????",
-"gplSoft":"?GPL?????????",
+"gplSoft":"GPL ?????????",
 "groups_sso":"SSO ??",
 "headers":"??",
 "hello":"??",
diff --git a/lemonldap-ng-portal/site/templates/bootstrap/customfooter.tpl b/lemonldap-ng-portal/site/templates/bootstrap/customfooter.tpl
index 341aea4cd..9002ef5c4 100644
--- a/lemonldap-ng-portal/site/templates/bootstrap/customfooter.tpl
+++ b/lemonldap-ng-portal/site/templates/bootstrap/customfooter.tpl
@@ -5,5 +5,5 @@
         <span class="fa fa-globe"></span>
         LemonLDAP::NG
       </a>
-      <span trspan="gplSoft">free software covered by the GPL license</span>.
+      <span trspan="gplSoft">free software covered by the GPL license.</span>
     </p>
diff --git a/lemonldap-ng-portal/site/templates/common/mail/ar.json b/lemonldap-ng-portal/site/templates/common/mail/ar.json
index d44e70b76..bcc84d5b4 100644
--- a/lemonldap-ng-portal/site/templates/common/mail/ar.json
+++ b/lemonldap-ng-portal/site/templates/common/mail/ar.json
@@ -1,27 +1,27 @@
 {
-"resetCertificat":"Your certificate was reset",
+"resetCertificat":"?? ????? ????? ??????",
 "accountCreated":"?? ????? ????? ? ????? ???? ?????? ??????? ???  ????? ??????????.",
 "autoMail":"?? ????? ??? ?????? ??????? ",
 "click2Register":"???? ??? ?????? ????? ?????",
 "click2Reset":"???? ??? ?????? ????? ???? ??????",
-"click2ResetCertificate":"Click here to reset your certificate",
+"click2ResetCertificate":"???? ??? ?????? ????? ??????",
 "goToPortal":"????? ??? ???????",
 "hello":"????? ",
-"host":"Host",
-"location":"Location",
-"mail2fSubject":"[LemonLDAP::NG] ????? ?????? ????? ?? ?? ",
+"host":"??????",
+"location":"??????",
+"mail2fSubject":"[LemonLDAP::NG] ????? ?????? ????? ?? ??",
 "mailConfirmSubject":"????? ????? ????? ???? ??????[LemonLDAP::NG]",
 "mailSubject":"???? ?????? ??????? [LemonLDAP::NG]",
-"newLocationWarningMailBody":"Your account was signed in to from a new location.",
-"newLocationWarningMailSubject":"[LemonLDAP::NG] Sign-in from a new location",
+"newLocationWarningMailBody":"?? ?????? ????? ???? ???? ??? ?????.",
+"newLocationWarningMailSubject":"[LemonLDAP::NG] ????? ???? ?? ???? ????",
 "newPwdIs":"???? ?????? ??????? ??",
 "pwdChanged":"?? ????? ???? ?????? ?????? ??",
 "pwdIs":"???? ?????? ?????? ?? ??",
 "registerConfirmSubject":"????? ????? ??????[LemonLDAP::NG] ",
 "registerDoneSubject":"????? ??????[LemonLDAP::NG]",
 "requestIssuedFromIP":"????? ?? ???? ?? ????? ???? ??",
-"resetCertificateOK":"Your certificate has been successfully reset!",
+"resetCertificateOK":"?? ????? ????? ?????? ?????!",
 "date":"?????",
-"yourLoginCodeIs":"Your login code is",
+"yourLoginCodeIs":"??? ????? ?????? ????? ?? ??",
 "yourLoginIs":"????? ?????? ????? ?? ??"
 }
\ No newline at end of file
diff --git a/lemonldap-ng-portal/site/templates/common/mail/es.json b/lemonldap-ng-portal/site/templates/common/mail/es.json
index ba90c03e2..2847f2e40 100644
--- a/lemonldap-ng-portal/site/templates/common/mail/es.json
+++ b/lemonldap-ng-portal/site/templates/common/mail/es.json
@@ -8,12 +8,12 @@
 "goToPortal":"Ir al portal",
 "hello":"Hola",
 "host":"Host",
-"location":"Location",
+"location":"Ubicaci?n ",
 "mail2fSubject":"[LemonLDAP::NG] Su c?digo de acceso",
 "mailConfirmSubject":"[LemonLDAP::NG] Confirmaci?n de reinicio de contrase?a",
 "mailSubject":"[LemonLDAP::NG] Su nueva contrase?a",
-"newLocationWarningMailBody":"Your account was signed in to from a new location.",
-"newLocationWarningMailSubject":"[LemonLDAP::NG] Sign-in from a new location",
+"newLocationWarningMailBody":"Una nueva conexi?n a su cuenta de una nueva ubicaci?n.",
+"newLocationWarningMailSubject":"[LemonLDAP::NG] Conexi?n de una nueva ubicaci?n.",
 "newPwdIs":"Su nueva contrase?a es",
 "pwdChanged":"Su contrase?a ha sido cambiada.",
 "pwdIs":"Su contrase?a es",
diff --git a/lemonldap-ng-portal/site/templates/common/mail/sk.json b/lemonldap-ng-portal/site/templates/common/mail/sk.json
new file mode 100644
index 000000000..f259feb51
--- /dev/null
+++ b/lemonldap-ng-portal/site/templates/common/mail/sk.json
@@ -0,0 +1,27 @@
+{
+"resetCertificat":"V?? certifik?t bol resetovan?",
+"accountCreated":"V?? ??et bol vytvoren?, do?asn? heslo bolo odoslan? na va?u e-mailov? adresu.",
+"autoMail":"Tento e-mail bol automaticky odoslan?",
+"click2Register":"Kliknite sem na potvrdenie registr?cie v??ho ??tu",
+"click2Reset":"Kliknite sem na resetovanie hesla",
+"click2ResetCertificate":"Kliknite sem na resetovanie v??ho certifik?tu",
+"goToPortal":"Prejs? na port?l",
+"hello":"Ahoj",
+"host":"Hostite?",
+"location":"Poloha",
+"mail2fSubject":"[LemonLDAP::NG] V?? pr?stupov? k?d",
+"mailConfirmSubject":"[LemonLDAP::NG] Potvrdenie o resetovan? hesla",
+"mailSubject":"[LemonLDAP::NG] Va?e nov? heslo",
+"newLocationWarningMailBody":"Bola zisten? nov? prihl?senie do v??ho ??tu.",
+"newLocationWarningMailSubject":"[LemonLDAP::NG] Prihl?senie z novej polohy",
+"newPwdIs":"Va?e nov? heslo je",
+"pwdChanged":"Va?e heslo bolo zmenen?.",
+"pwdIs":"Va?e heslo je",
+"registerConfirmSubject":"[LemonLDAP::NG] Potvrdenie registr?cie ??tu",
+"registerDoneSubject":"[LemonLDAP::NG] V?? nov? ??et",
+"requestIssuedFromIP":"?iados? bola vydan? z IP",
+"resetCertificateOK":"V?? certifik?t bol ?spe?ne resetovan?!",
+"date":"D?tum",
+"yourLoginCodeIs":"V?? pr?stupov? k?d je",
+"yourLoginIs":"Va?e prihlasovacie meno je"
+}
\ No newline at end of file
diff --git a/lemonldap-ng-portal/t/32-OIDC-prompt-none.t b/lemonldap-ng-portal/t/32-OIDC-prompt-none.t
new file mode 100644
index 000000000..ff5a7f9ac
--- /dev/null
+++ b/lemonldap-ng-portal/t/32-OIDC-prompt-none.t
@@ -0,0 +1,93 @@
+use warnings;
+use Test::More;
+use strict;
+use IO::String;
+use LWP::UserAgent;
+use LWP::Protocol::PSGI;
+use MIME::Base64;
+use JSON;
+
+BEGIN {
+    require 't/test-lib.pm';
+    require 't/oidc-lib.pm';
+}
+
+my $op = LLNG::Manager::Test->new( {
+        ini => {
+            domain                          => 'idp.com',
+            portal                          => 'http://auth.op.com/',
+            authentication                  => 'Demo',
+            userDB                          => 'Same',
+            issuerDBOpenIDConnectActivation => 1,
+            oidcRPMetaDataExportedVars      => {
+                rp => {
+                    email       => "mail",
+                    family_name => "cn",
+                    name        => "cn"
+                },
+            },
+            oidcRPMetaDataOptions => {
+                rp => {
+                    oidcRPMetaDataOptionsDisplayName           => "RP",
+                    oidcRPMetaDataOptionsIDTokenExpiration     => 3600,
+                    oidcRPMetaDataOptionsClientID              => "rpid",
+                    oidcRPMetaDataOptionsIDTokenSignAlg        => "HS512",
+                    oidcRPMetaDataOptionsAccessTokenJWT        => 1,
+                    oidcRPMetaDataOptionsClientSecret          => "rpid",
+                    oidcRPMetaDataOptionsUserIDAttr            => "",
+                    oidcRPMetaDataOptionsAccessTokenExpiration => 3600,
+                    oidcRPMetaDataOptionsBypassConsent         => 1,
+                    oidcRPMetaDataOptionsRefreshToken          => 1,
+                    oidcRPMetaDataOptionsAllowOffline          => 1,
+                    oidcRPMetaDataOptionsRedirectUris => 'http://rp.com/',
+                },
+            },
+            oidcServicePrivateKeySig => oidc_key_op_private_sig,
+            oidcServicePublicKeySig  => oidc_cert_op_public_sig,
+        }
+    }
+);
+my $res;
+
+my $query = "response_type=code&scope=openid%20profile%20email&client_id=rpid&state=af0ifjsldkj&redirect_uri=http%3A%2F%2Frp.com%2F&prompt=none";
+ok(
+    $res = $op->_get(
+        "/oauth2/authorize",
+        query  => "$query",
+        accept => 'text/html',
+    ),
+    "Get error=login_required"
+);
+
+my ($code) =
+  expectRedirection( $res, qr#http://rp\.com/\?.*error=login_required# );
+
+$query = "user=french&password=french";
+ok(
+    $res = $op->_post(
+        "/",
+        IO::String->new($query),
+        accept => 'text/html',
+        length => length($query),
+    ),
+    "Post authentication"
+);
+my $idpId = expectCookie($res);
+
+$query =
+"response_type=code&scope=openid%20profile%20email&client_id=rpid&state=af0ifjsldkj&redirect_uri=http%3A%2F%2Frp.com%2F";
+ok(
+    $res = $op->_get(
+        "/oauth2/authorize",
+        query  => "$query",
+        accept => 'text/html',
+        cookie => "lemonldap=$idpId",
+    ),
+    "Get authorization code"
+);
+
+my ($code) =
+  expectRedirection( $res, qr#http://rp\.com/\?.*code=([^\&]*)# );
+
+clean_sessions();
+done_testing();
diff --git a/lemonldap-ng-portal/t/76-2F-Ext-with-CodeActivation-Resend.t b/lemonldap-ng-portal/t/76-2F-Ext-with-CodeActivation-Resend.t
index 84e5e3675..964b083ef 100644
--- a/lemonldap-ng-portal/t/76-2F-Ext-with-CodeActivation-Resend.t
+++ b/lemonldap-ng-portal/t/76-2F-Ext-with-CodeActivation-Resend.t
@@ -176,6 +176,15 @@ subtest 'Login after several resend' => sub {
     $client->logout($id);
 };
 
+subtest 'Try to resend with an expired token' => sub {
+    my $res  = init_login($client);
+    my $code = expectSentCode($res);
+
+    Time::Fake->offset("+10m");
+    $res = resendCode( $res, $client );
+    expectPortalError( $res, 82 );
+};
+
 # If the session info check was not run during the test, then something
 # probably is wrong with the hook system
 is( $sessionInfoCheck, 1, "SessionInfo check was called during the test" );
diff --git a/scripts/generate-changelog.pl b/scripts/generate-changelog.pl
index 4643e3153..4e8a1f38a 100755
--- a/scripts/generate-changelog.pl
+++ b/scripts/generate-changelog.pl
@@ -12,7 +12,7 @@
 use LWP::UserAgent;
 use JSON;
 
-my $milestone = '2.21.0';
+my $milestone = '2.21.1';
 my @cat = ( 'Bug', 'New feature', 'Improvement', 'Template', 'WebServer Conf' );
 
 open F, "$ENV{HOME}/.ow2-token" or die "Unable to get OW2 token ($!)";


More information about the pkg-perl-maintainers mailing list