From 01beb5d48ba8b6c86045ffc81b3fdb65cec36584 Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Sat, 29 Aug 2020 22:12:09 +0200 Subject: [PATCH] Allow all special chars (#2266) --- .../lib/Lemonldap/NG/Portal/Main/Display.pm | 37 ++++++++++--------- lemonldap-ng-portal/site/coffee/portal.coffee | 15 ++++++++ .../site/htdocs/static/common/js/portal.js | 18 +++++++++ .../htdocs/static/common/js/portal.min.js | 2 +- .../htdocs/static/common/js/portal.min.js.map | 2 +- 5 files changed, 54 insertions(+), 20 deletions(-) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm index 8a8b90eab..15d50cda1 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm @@ -2,7 +2,7 @@ # Display functions for LemonLDAP::NG Portal package Lemonldap::NG::Portal::Main::Display; -our $VERSION = '2.0.9'; +our $VERSION = '2.0.10'; package Lemonldap::NG::Portal::Main; use strict; @@ -40,7 +40,10 @@ sub displayInit { } $self->requireOldPwd($rule); - my $speChars = $self->conf->{passwordPolicySpecialChar}; + my $speChars = + $self->conf->{passwordPolicySpecialChar} eq '__ALL__' + ? '' + : $self->conf->{passwordPolicySpecialChar}; $speChars =~ s/\s+/ /g; $speChars =~ s/(?:^\s|\s$)//g; $self->speChars($speChars); @@ -238,18 +241,17 @@ sub display { PING => $self->conf->{portalPingInterval}, REQUIRE_OLDPASSWORD => $self->requireOldPwd->( $req, $req->userData ), - HIDE_OLDPASSWORD => 0, - DISPLAY_PPOLICY => $self->conf->{portalDisplayPasswordPolicy}, - PPOLICY_MINSIZE => $self->conf->{passwordPolicyMinSize}, - PPOLICY_MINLOWER => $self->conf->{passwordPolicyMinLower}, - PPOLICY_MINUPPER => $self->conf->{passwordPolicyMinUpper}, - PPOLICY_MINDIGIT => $self->conf->{passwordPolicyMinDigit}, - PPOLICY_NOPOLICY => !$self->isPP(), - PPOLICY_ALLOWEDSPECHAR => $self->speChars(), + HIDE_OLDPASSWORD => 0, + PPOLICY_NOPOLICY => !$self->isPP(), + DISPLAY_PPOLICY => $self->conf->{portalDisplayPasswordPolicy}, + PPOLICY_MINSIZE => $self->conf->{passwordPolicyMinSize}, + PPOLICY_MINLOWER => $self->conf->{passwordPolicyMinLower}, + PPOLICY_MINUPPER => $self->conf->{passwordPolicyMinUpper}, + PPOLICY_MINDIGIT => $self->conf->{passwordPolicyMinDigit}, + PPOLICY_MINSPECHAR => $self->conf->{passwordPolicyMinSpeChar}, ( - $self->speChars() - ? ( PPOLICY_MINSPECHAR => - $self->conf->{passwordPolicyMinSpeChar} ) + $self->conf->{passwordPolicyMinSpeChar} + ? ( PPOLICY_ALLOWEDSPECHAR => $self->speChars() ) : () ), $self->menu->params($req), @@ -406,17 +408,16 @@ sub display { $req->data->{oldpassword} ) ? "" : $req->data->{oldpassword}, HIDE_OLDPASSWORD => $self->conf->{hideOldPassword}, + PPOLICY_NOPOLICY => !$self->isPP(), DISPLAY_PPOLICY => $self->conf->{portalDisplayPasswordPolicy}, PPOLICY_MINSIZE => $self->conf->{passwordPolicyMinSize}, PPOLICY_MINLOWER => $self->conf->{passwordPolicyMinLower}, PPOLICY_MINUPPER => $self->conf->{passwordPolicyMinUpper}, PPOLICY_MINDIGIT => $self->conf->{passwordPolicyMinDigit}, - PPOLICY_NOPOLICY => !$self->isPP(), - PPOLICY_ALLOWEDSPECHAR => $self->speChars(), + PPOLICY_MINSPECHAR => $self->conf->{passwordPolicyMinSpeChar}, ( - $self->speChars() - ? ( PPOLICY_MINSPECHAR => - $self->conf->{passwordPolicyMinSpeChar} ) + $self->conf->{passwordPolicyMinSpeChar} + ? ( PPOLICY_ALLOWEDSPECHAR => $self->speChars() ) : () ), ); diff --git a/lemonldap-ng-portal/site/coffee/portal.coffee b/lemonldap-ng-portal/site/coffee/portal.coffee index f028fbb7f..25329208b 100644 --- a/lemonldap-ng-portal/site/coffee/portal.coffee +++ b/lemonldap-ng-portal/site/coffee/portal.coffee @@ -459,6 +459,21 @@ $(window).on 'load', () -> $('#ppolicy-minspechar-feedback').removeClass 'fa-check text-success' $('#ppolicy-minspechar-feedback').addClass 'fa-times text-danger' result = false + + if window.datas.ppolicy.minspechar > 0 and !window.datas.ppolicy.allowedspechar + numspechar = 0 + i = 0 + while i < password.length + numspechar++ if !isAlphaNumeric(password.charAt(i)) + i++ + if numspechar >= window.datas.ppolicy.minspechar + $('#ppolicy-minspechar-feedback').addClass 'fa-check text-success' + $('#ppolicy-minspechar-feedback').removeClass 'fa-times text-danger' + else + $('#ppolicy-minspechar-feedback').removeClass 'fa-check text-success' + $('#ppolicy-minspechar-feedback').addClass 'fa-times text-danger' + result = false + if result $('.ppolicy').removeClass('border-danger').addClass 'border-success' $('#newpassword')[0].setCustomValidity('') diff --git a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js index 4f2da580f..0bd13a977 100644 --- a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js +++ b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js @@ -494,6 +494,24 @@ LemonLDAP::NG Portal jQuery scripts result = false; } } + if (window.datas.ppolicy.minspechar > 0 && !window.datas.ppolicy.allowedspechar) { + numspechar = 0; + i = 0; + while (i < password.length) { + if (!isAlphaNumeric(password.charAt(i))) { + numspechar++; + } + i++; + } + if (numspechar >= window.datas.ppolicy.minspechar) { + $('#ppolicy-minspechar-feedback').addClass('fa-check text-success'); + $('#ppolicy-minspechar-feedback').removeClass('fa-times text-danger'); + } else { + $('#ppolicy-minspechar-feedback').removeClass('fa-check text-success'); + $('#ppolicy-minspechar-feedback').addClass('fa-times text-danger'); + result = false; + } + } if (result) { $('.ppolicy').removeClass('border-danger').addClass('border-success'); $('#newpassword')[0].setCustomValidity(''); diff --git a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.min.js b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.min.js index b8684f338..ad71666ba 100644 --- a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.min.js +++ b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.min.js @@ -1 +1 @@ -(function(){var G,a,I,D,R,_,M,N,U,e,V,g,J,H,i,Z=[].indexOf||function(e){for(var a=0,t=this.length;a div.category",update:function(){return V()}}),N(),$("div.message").fadeIn("slow"),$("input[name=timezone]").val(-(new Date).getTimezoneOffset()/60),k=$("#menu").tabs({active:0}),(b=$('#menu a[href="#'+G.displaytab+'"]').parent().index())<0&&(b=0),k.tabs("option","active",b),n=$("#authMenu").tabs({active:0}),(t=$('#authMenu a[href="#'+G.displaytab+'"]').parent().index())<0&&(t=0),n.tabs("option","active",t),G.choicetab&&n.tabs("option","active",$('#authMenu a[href="#'+G.choicetab+'"]').parent().index()),G.login?$("input[type=password]:first").focus():0===$("input[autofocus]").length&&$("input[type!=hidden]:first").focus(),G.newwindow&&$("#appslist a").attr("target","_blank"),$("p.removeOther").length&&(e=$("#form").attr("action"),x=$("#form").attr("method"),console.log("method=",x),r="",$("#form input[type=hidden]")&&(console.log("Parse hidden values"),$("#form input[type=hidden]").each(function(e){return console.log(" ->",$(this).attr("name"),$(this).val()),r+="&"+$(this).attr("name")+"="+$(this).val()})),o="",e&&(console.log("action=",e),-1!==e.indexOf("?")?e.substring(0,e.indexOf("?")):o=e+"?",o+=r,r=""),y=$("p.removeOther a").attr("href")+"&method="+x+r,o&&(y+="&url="+btoa(o)),$("p.removeOther a").attr("href",y)),window.location.search&&((j=D("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=D("setCookieLang"))&&console.log("Set lang cookie")),c||(c=I("llnglanguage"))&&!j&&console.log("Get lang from cookie"),c)Z.call(window.availableLanguages,c)<0&&(c=window.availableLanguages[0],j||console.log("Lang not available -> Get default lang"));else if(navigator){for(u=[],g=[],L=[navigator.language],navigator.languages&&(L=navigator.languages),l=0,f=(S=window.availableLanguages).length;l ';for(v=0,h=L.length;v Get default lang"),j=window.availableLanguages[0]),console.log("Selected lang ->",j),A&&(console.log("Set cookie lang ->",j),U("llnglanguage",j)),H(j)):(console.log("Selected lang ->",c),U("llnglanguage",c),H(c)),p="",T=0,m=(z=window.availableLanguages).length;T ';return $("#languages").html(p),$(".langicon").on("click",function(){return c=$(this).attr("title"),U("llnglanguage",c),H(c)}),d=function(e){var a;return 47<(a=e.charCodeAt(0))&&a<58||64=window.datas.ppolicy.minsize?($("#ppolicy-minsize-feedback").addClass("fa-check text-success"),$("#ppolicy-minsize-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minsize-feedback").removeClass("fa-check text-success"),$("#ppolicy-minsize-feedback").addClass("fa-times text-danger"),l=!1)),0=window.datas.ppolicy.minupper?($("#ppolicy-minupper-feedback").addClass("fa-check text-success"),$("#ppolicy-minupper-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minupper-feedback").removeClass("fa-check text-success"),$("#ppolicy-minupper-feedback").addClass("fa-times text-danger"),l=!1)),0=window.datas.ppolicy.minlower?($("#ppolicy-minlower-feedback").addClass("fa-check text-success"),$("#ppolicy-minlower-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minlower-feedback").removeClass("fa-check text-success"),$("#ppolicy-minlower-feedback").addClass("fa-times text-danger"),l=!1)),0=window.datas.ppolicy.mindigit?($("#ppolicy-mindigit-feedback").addClass("fa-check text-success"),$("#ppolicy-mindigit-feedback").removeClass("fa-times text-danger")):($("#ppolicy-mindigit-feedback").removeClass("fa-check text-success"),$("#ppolicy-mindigit-feedback").addClass("fa-times text-danger"),l=!1)),window.datas.ppolicy.allowedspechar){for(i=window.datas.ppolicy.allowedspechar.replace(/\s/g,""),t=!1,n=0,o=e.length;n=window.datas.ppolicy.minspechar?($("#ppolicy-minspechar-feedback").addClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minspechar-feedback").removeClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").addClass("fa-times text-danger"),l=!1)}l?($(".ppolicy").removeClass("border-danger").addClass("border-success"),$("#newpassword")[0].setCustomValidity("")):($(".ppolicy").removeClass("border-success").addClass("border-danger"),$("#newpassword")[0].setCustomValidity(J("PE28")))},null!=window.datas.ppolicy&&(s(""),$("#newpassword").keyup(function(e){s(e.target.value)})),i=function(){return $("#confirmpassword")[0].value===$("#newpassword")[0].value?($("#confirmpassword")[0].setCustomValidity(""),!0):($("#confirmpassword")[0].setCustomValidity(J("PE34")),!1)},$("#newpassword").change(i),$("#confirmpassword").change(i),G.pingInterval&&0 div.category",update:function(){return V()}}),N(),$("div.message").fadeIn("slow"),$("input[name=timezone]").val(-(new Date).getTimezoneOffset()/60),k=$("#menu").tabs({active:0}),(b=$('#menu a[href="#'+G.displaytab+'"]').parent().index())<0&&(b=0),k.tabs("option","active",b),n=$("#authMenu").tabs({active:0}),(t=$('#authMenu a[href="#'+G.displaytab+'"]').parent().index())<0&&(t=0),n.tabs("option","active",t),G.choicetab&&n.tabs("option","active",$('#authMenu a[href="#'+G.choicetab+'"]').parent().index()),G.login?$("input[type=password]:first").focus():0===$("input[autofocus]").length&&$("input[type!=hidden]:first").focus(),G.newwindow&&$("#appslist a").attr("target","_blank"),$("p.removeOther").length&&(e=$("#form").attr("action"),x=$("#form").attr("method"),console.log("method=",x),r="",$("#form input[type=hidden]")&&(console.log("Parse hidden values"),$("#form input[type=hidden]").each(function(e){return console.log(" ->",$(this).attr("name"),$(this).val()),r+="&"+$(this).attr("name")+"="+$(this).val()})),o="",e&&(console.log("action=",e),-1!==e.indexOf("?")?e.substring(0,e.indexOf("?")):o=e+"?",o+=r,r=""),y=$("p.removeOther a").attr("href")+"&method="+x+r,o&&(y+="&url="+btoa(o)),$("p.removeOther a").attr("href",y)),window.location.search&&((j=D("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=D("setCookieLang"))&&console.log("Set lang cookie")),l||(l=I("llnglanguage"))&&!j&&console.log("Get lang from cookie"),l)Z.call(window.availableLanguages,l)<0&&(l=window.availableLanguages[0],j||console.log("Lang not available -> Get default lang"));else if(navigator){for(u=[],g=[],L=[navigator.language],navigator.languages&&(L=navigator.languages),c=0,f=(S=window.availableLanguages).length;c ';for(v=0,h=L.length;v Get default lang"),j=window.availableLanguages[0]),console.log("Selected lang ->",j),A&&(console.log("Set cookie lang ->",j),U("llnglanguage",j)),H(j)):(console.log("Selected lang ->",l),U("llnglanguage",l),H(l)),p="",T=0,m=(z=window.availableLanguages).length;T ';return $("#languages").html(p),$(".langicon").on("click",function(){return l=$(this).attr("title"),U("llnglanguage",l),H(l)}),d=function(e){var a;return 47<(a=e.charCodeAt(0))&&a<58||64=window.datas.ppolicy.minsize?($("#ppolicy-minsize-feedback").addClass("fa-check text-success"),$("#ppolicy-minsize-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minsize-feedback").removeClass("fa-check text-success"),$("#ppolicy-minsize-feedback").addClass("fa-times text-danger"),c=!1)),0=window.datas.ppolicy.minupper?($("#ppolicy-minupper-feedback").addClass("fa-check text-success"),$("#ppolicy-minupper-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minupper-feedback").removeClass("fa-check text-success"),$("#ppolicy-minupper-feedback").addClass("fa-times text-danger"),c=!1)),0=window.datas.ppolicy.minlower?($("#ppolicy-minlower-feedback").addClass("fa-check text-success"),$("#ppolicy-minlower-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minlower-feedback").removeClass("fa-check text-success"),$("#ppolicy-minlower-feedback").addClass("fa-times text-danger"),c=!1)),0=window.datas.ppolicy.mindigit?($("#ppolicy-mindigit-feedback").addClass("fa-check text-success"),$("#ppolicy-mindigit-feedback").removeClass("fa-times text-danger")):($("#ppolicy-mindigit-feedback").removeClass("fa-check text-success"),$("#ppolicy-mindigit-feedback").addClass("fa-times text-danger"),c=!1)),window.datas.ppolicy.allowedspechar){for(i=window.datas.ppolicy.allowedspechar.replace(/\s/g,""),t=!1,n=0,o=e.length;n=window.datas.ppolicy.minspechar?($("#ppolicy-minspechar-feedback").addClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minspechar-feedback").removeClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").addClass("fa-times text-danger"),c=!1)}if(0=window.datas.ppolicy.minspechar?($("#ppolicy-minspechar-feedback").addClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").removeClass("fa-times text-danger")):($("#ppolicy-minspechar-feedback").removeClass("fa-check text-success"),$("#ppolicy-minspechar-feedback").addClass("fa-times text-danger"),c=!1)}c?($(".ppolicy").removeClass("border-danger").addClass("border-success"),$("#newpassword")[0].setCustomValidity("")):($(".ppolicy").removeClass("border-success").addClass("border-danger"),$("#newpassword")[0].setCustomValidity(J("PE28")))},null!=window.datas.ppolicy&&(s(""),$("#newpassword").keyup(function(e){s(e.target.value)})),i=function(){return $("#confirmpassword")[0].value===$("#newpassword")[0].value?($("#confirmpassword")[0].setCustomValidity(""),!0):($("#confirmpassword")[0].setCustomValidity(J("PE34")),!1)},$("#newpassword").change(i),$("#confirmpassword").change(i),G.pingInterval&&0