From 466b6a3241fff5013d27b3dd22982e5e26ed7dfb Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Sun, 4 Jul 2021 19:50:55 +0200 Subject: [PATCH] Avoid to store passwords (#2557) --- .../lib/Lemonldap/NG/Portal/Main/Display.pm | 2 + lemonldap-ng-portal/site/coffee/portal.coffee | 53 ++++++++++---- .../site/htdocs/static/common/js/portal.js | 71 +++++++++++++++---- .../htdocs/static/common/js/portal.min.js | 2 +- .../htdocs/static/common/js/portal.min.js.map | 2 +- .../site/templates/bootstrap/password.tpl | 21 ++++-- 6 files changed, 115 insertions(+), 36 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 6760fc3cd..9cffc0ff1 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm @@ -244,6 +244,7 @@ sub display { PING => $self->conf->{portalPingInterval}, REQUIRE_OLDPASSWORD => $self->requireOldPwd->( $req, $req->userData ), + DONT_STORE_PASSWORD => $self->conf->{browsersDontStorePassword}, HIDE_OLDPASSWORD => 0, PPOLICY_NOPOLICY => !$self->isPP(), DISPLAY_PPOLICY => $self->conf->{portalDisplayPasswordPolicy}, @@ -443,6 +444,7 @@ sub display { $req->data->{oldpassword} ) ? "" : $req->data->{oldpassword}, HIDE_OLDPASSWORD => $self->conf->{hideOldPassword}, + DONT_STORE_PASSWORD => $self->conf->{browsersDontStorePassword}, PPOLICY_NOPOLICY => !$self->isPP(), DISPLAY_PPOLICY => $self->conf->{portalDisplayPasswordPolicy}, PPOLICY_MINSIZE => $self->conf->{passwordPolicyMinSize}, diff --git a/lemonldap-ng-portal/site/coffee/portal.coffee b/lemonldap-ng-portal/site/coffee/portal.coffee index 7dad6e2d9..0defd66c1 100644 --- a/lemonldap-ng-portal/site/coffee/portal.coffee +++ b/lemonldap-ng-portal/site/coffee/portal.coffee @@ -537,25 +537,50 @@ $(window).on 'load', () -> # Functions to show/hide change password inputs $('#show-hide-button').on 'click', () -> - if $("#newpassword").attr('type') == 'password' - console.log 'Show passwords' - $("#newpassword").attr('type', 'input') - $("#confirmpassword").attr('type', 'input') - $("#show-hide-icon-button").toggleClass("fa-eye fa-eye-slash") + if $("#newpassword").attr('autocomplete') == 'off' + if $("#newpassword").attr('class') == 'form-control key' || $("#confirmpassword").attr('class') == 'form-control key' + console.log 'Show passwords' + $("#newpassword").attr('class', 'form-control') + $("#confirmpassword").attr('class', 'form-control') + $("#show-hide-icon-button").attr('class', 'fa fa-eye-slash') + else + console.log 'Hide passwords' + $("#newpassword").attr('class', 'form-control key') if $("#newpassword").get(0).value + $("#confirmpassword").attr('class', 'form-control key') if $("#confirmpassword").get(0).value + $("#show-hide-icon-button").attr('class', 'fa fa-eye') if ($("#newpassword").get(0).value || $("#confirmpassword").get(0).value) else - console.log 'Hide passwords' - $("#newpassword").attr('type', 'password') - $("#confirmpassword").attr('type', 'password') - $("#show-hide-icon-button").toggleClass("fa-eye fa-eye-slash") + if $("#newpassword").attr('type') == 'password' + console.log 'Show passwords' + $("#newpassword").attr('type', 'text') + $("#confirmpassword").attr('type', 'text') + $("#show-hide-icon-button").attr('class', 'fa fa-eye-slash') + else + console.log 'Hide passwords' + $("#newpassword").attr('type', 'password') + $("#confirmpassword").attr('type', 'password') + $("#show-hide-icon-button").attr('class', 'fa fa-eye') # Functions to show/hide placeholder password inputs $('#passwordfield').on 'input', () -> - if $('#passwordfield').get(0).value && $('#passwordfield').attr('type') == 'text' - $("#passwordfield").removeClass 'form-control' - $("#passwordfield").addClass 'form-control key' + if $('#passwordfield').get(0).value && $("#passwordfield").attr('autocomplete') == 'off' + $("#passwordfield").attr('class', 'form-control key') else - $("#passwordfield").removeClass 'form-control key' - $("#passwordfield").addClass 'form-control' + $("#passwordfield").attr('class', 'form-control') + $('#oldpassword').on 'input', () -> + if $('#oldpassword').get(0).value && $('#oldpassword').attr('autocomplete') == 'off' + $("#oldpassword").attr('class', 'form-control key') + else + $("#oldpassword").attr('class', 'form-control') + $('#newpassword').on 'input', () -> + if $('#newpassword').get(0).value && $('#newpassword').attr('autocomplete') == 'off' + $("#newpassword").attr('class', 'form-control key') if $("#show-hide-icon-button").attr('class') == 'fa fa-eye' + else + $("#newpassword").attr('class', 'form-control') + $('#confirmpassword').on 'input', () -> + if $('#confirmpassword').get(0).value && $('#confirmpassword').attr('autocomplete') == 'off' + $("#confirmpassword").attr('class', 'form-control key') if $("#show-hide-icon-button").attr('class') == 'fa fa-eye' + else + $("#confirmpassword").attr('class', 'form-control') #$('#formpass').on 'submit', changePwd 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 11bd0a070..1731c38b8 100644 --- a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js +++ b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js @@ -583,25 +583,68 @@ LemonLDAP::NG Portal jQuery scripts return removeOidcConsent($(this).attr('partner')); }); $('#show-hide-button').on('click', function() { - if ($("#newpassword").attr('type') === 'password') { - console.log('Show passwords'); - $("#newpassword").attr('type', 'input'); - $("#confirmpassword").attr('type', 'input'); - return $("#show-hide-icon-button").toggleClass("fa-eye fa-eye-slash"); + if ($("#newpassword").attr('autocomplete') === 'off') { + if ($("#newpassword").attr('class') === 'form-control key' || $("#confirmpassword").attr('class') === 'form-control key') { + console.log('Show passwords'); + $("#newpassword").attr('class', 'form-control'); + $("#confirmpassword").attr('class', 'form-control'); + return $("#show-hide-icon-button").attr('class', 'fa fa-eye-slash'); + } else { + console.log('Hide passwords'); + if ($("#newpassword").get(0).value) { + $("#newpassword").attr('class', 'form-control key'); + } + if ($("#confirmpassword").get(0).value) { + $("#confirmpassword").attr('class', 'form-control key'); + } + if ($("#newpassword").get(0).value || $("#confirmpassword").get(0).value) { + return $("#show-hide-icon-button").attr('class', 'fa fa-eye'); + } + } } else { - console.log('Hide passwords'); - $("#newpassword").attr('type', 'password'); - $("#confirmpassword").attr('type', 'password'); - return $("#show-hide-icon-button").toggleClass("fa-eye fa-eye-slash"); + if ($("#newpassword").attr('type') === 'password') { + console.log('Show passwords'); + $("#newpassword").attr('type', 'text'); + $("#confirmpassword").attr('type', 'text'); + return $("#show-hide-icon-button").attr('class', 'fa fa-eye-slash'); + } else { + console.log('Hide passwords'); + $("#newpassword").attr('type', 'password'); + $("#confirmpassword").attr('type', 'password'); + return $("#show-hide-icon-button").attr('class', 'fa fa-eye'); + } } }); $('#passwordfield').on('input', function() { - if ($('#passwordfield').get(0).value && $('#passwordfield').attr('type') === 'text') { - $("#passwordfield").removeClass('form-control'); - return $("#passwordfield").addClass('form-control key'); + if ($('#passwordfield').get(0).value && $("#passwordfield").attr('autocomplete') === 'off') { + return $("#passwordfield").attr('class', 'form-control key'); } else { - $("#passwordfield").removeClass('form-control key'); - return $("#passwordfield").addClass('form-control'); + return $("#passwordfield").attr('class', 'form-control'); + } + }); + $('#oldpassword').on('input', function() { + if ($('#oldpassword').get(0).value && $('#oldpassword').attr('autocomplete') === 'off') { + return $("#oldpassword").attr('class', 'form-control key'); + } else { + return $("#oldpassword").attr('class', 'form-control'); + } + }); + $('#newpassword').on('input', function() { + if ($('#newpassword').get(0).value && $('#newpassword').attr('autocomplete') === 'off') { + if ($("#show-hide-icon-button").attr('class') === 'fa fa-eye') { + return $("#newpassword").attr('class', 'form-control key'); + } + } else { + return $("#newpassword").attr('class', 'form-control'); + } + }); + $('#confirmpassword').on('input', function() { + if ($('#confirmpassword').get(0).value && $('#confirmpassword').attr('autocomplete') === 'off') { + if ($("#show-hide-icon-button").attr('class') === 'fa fa-eye') { + return $("#confirmpassword").attr('class', 'form-control key'); + } + } else { + return $("#confirmpassword").attr('class', 'form-control'); } }); $('#resetfinduserform').on('click', function() { 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 c1c7c8edf..d11110c44 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 D,a,G,R,N,U,V,_,J,e,M,g,F,q,r,H=[].indexOf||function(e){for(var a=0,t=this.length;a div.category",update:function(){return M()}}),_(),$("div.message").fadeIn("slow"),$("input[name=timezone]").val(-(new Date).getTimezoneOffset()/60),k=$("#menu").tabs({active:0}),(b=$('#menu a[href="#'+D.displaytab+'"]').parent().index())<0&&(b=0),k.tabs("option","active",b),n=$("#authMenu").tabs({active:0}),(t=$('#authMenu a[href="#'+D.displaytab+'"]').parent().index())<0&&(t=0),n.tabs("option","active",t),D.choicetab&&n.tabs("option","active",$('#authMenu a[href="#'+D.choicetab+'"]').parent().index()),D.login?$("input[type=password]:first").focus():0===$("input[autofocus]").length&&$("input[type!=hidden]:first").focus(),D.newwindow&&$("#appslist a").attr("target","_blank"),$("p.removeOther").length&&(e=$("#form").attr("action"),x=$("#form").attr("method"),console.log("method=",x),i="",$("#form input[type=hidden]")&&(console.log("Parse hidden values"),$("#form input[type=hidden]").each(function(e){return console.log(" ->",$(this).attr("name"),$(this).val()),i+="&"+$(this).attr("name")+"="+$(this).val()})),o="",e&&(console.log("action=",e),-1!==e.indexOf("?")?e.substring(0,e.indexOf("?")):o=e+"?",o+=i,i=""),y=$("p.removeOther a").attr("href")+"&method="+x+i,o&&(y+="&url="+btoa(o)),$("p.removeOther a").attr("href",y)),window.location.search&&((S=R("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=R("setCookieLang"))&&console.log("Set lang cookie")),c||(c=G("llnglanguage"))&&!S&&console.log("Get lang from cookie"),c)H.call(window.availableLanguages,c)<0&&(c=window.availableLanguages[0],S||console.log("Lang not available -> Get default lang"));else if(navigator){for(p=[],g=[],O=[navigator.language],navigator.languages&&(O=navigator.languages),l=0,f=(E=window.availableLanguages).length;l ';for(v=0,w=O.length;v Get default lang"),S=window.availableLanguages[0]),console.log("Selected lang ->",S),A&&(console.log("Set cookie lang ->",S),J("llnglanguage",S)),q(S)):(console.log("Selected lang ->",c),J("llnglanguage",c),q(c)),d="",L=0,h=(z=window.availableLanguages).length;L ';return $("#languages").html(d),$(".langicon").on("click",function(){return c=$(this).attr("title"),J("llnglanguage",c),q(c)}),u=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"),d=!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"),d=!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"),d=!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"),d=!1)),window.datas.ppolicy.allowedspechar){for(r=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"),d=!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"),d=!1)}d?($(".ppolicy").removeClass("border-danger").addClass("border-success"),null!=(l=$("#newpassword").get(0))&&l.setCustomValidity("")):($(".ppolicy").removeClass("border-success").addClass("border-danger"),null!=(c=$("#newpassword").get(0))&&c.setCustomValidity(F("PE28")))},null!=window.datas.ppolicy&&$("#newpassword").length&&(s(""),$("#newpassword").keyup(function(e){s(e.target.value)})),I=function(e){var a;return e.target.checked?($("#newpassword").off("keyup"),null!=(a=$("#newpassword").get(0))?a.setCustomValidity(""):void 0):($("#newpassword").keyup(function(e){s(e.target.value)}),s(""))},r=function(){var e,a,t,n;return(null!=(e=$("#confirmpassword").get(0))?e.value:void 0)===(null!=(a=$("#newpassword").get(0))?a.value:void 0)?(null!=(t=$("#confirmpassword").get(0))&&t.setCustomValidity(""),!0):(null!=(n=$("#confirmpassword").get(0))&&n.setCustomValidity(F("PE34")),!1)},$("#newpassword").change(r),$("#confirmpassword").change(r),null!=window.datas.ppolicy&&$("#newpassword").length&&$("#reset").change(I),D.enablePasswordDisplay&&($(".toggle-password").mousedown(function(e){return $(this).toggleClass("fa-eye fa-eye-slash"),$("input[name=password]").attr("type","text")}),$(".toggle-password").mouseup(function(e){return $(this).toggleClass("fa-eye fa-eye-slash"),$("input[name=password]").attr("type","password")})),D.pingInterval&&0 div.category",update:function(){return M()}}),_(),$("div.message").fadeIn("slow"),$("input[name=timezone]").val(-(new Date).getTimezoneOffset()/60),k=$("#menu").tabs({active:0}),(b=$('#menu a[href="#'+D.displaytab+'"]').parent().index())<0&&(b=0),k.tabs("option","active",b),o=$("#authMenu").tabs({active:0}),(t=$('#authMenu a[href="#'+D.displaytab+'"]').parent().index())<0&&(t=0),o.tabs("option","active",t),D.choicetab&&o.tabs("option","active",$('#authMenu a[href="#'+D.choicetab+'"]').parent().index()),D.login?$("input[type=password]:first").focus():0===$("input[autofocus]").length&&$("input[type!=hidden]:first").focus(),D.newwindow&&$("#appslist a").attr("target","_blank"),$("p.removeOther").length&&(e=$("#form").attr("action"),x=$("#form").attr("method"),console.log("method=",x),i="",$("#form input[type=hidden]")&&(console.log("Parse hidden values"),$("#form input[type=hidden]").each(function(e){return console.log(" ->",$(this).attr("name"),$(this).val()),i+="&"+$(this).attr("name")+"="+$(this).val()})),s="",e&&(console.log("action=",e),-1!==e.indexOf("?")?e.substring(0,e.indexOf("?")):s=e+"?",s+=i,i=""),y=$("p.removeOther a").attr("href")+"&method="+x+i,s&&(y+="&url="+btoa(s)),$("p.removeOther a").attr("href",y)),window.location.search&&((L=R("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=R("setCookieLang"))&&console.log("Set lang cookie")),c||(c=G("llnglanguage"))&&!L&&console.log("Get lang from cookie"),c)q.call(window.availableLanguages,c)<0&&(c=window.availableLanguages[0],L||console.log("Lang not available -> Get default lang"));else if(navigator){for(p=[],f=[],O=[navigator.language],navigator.languages&&(O=navigator.languages),l=0,g=(E=window.availableLanguages).length;l ';for(v=0,w=O.length;v Get default lang"),L=window.availableLanguages[0]),console.log("Selected lang ->",L),A&&(console.log("Set cookie lang ->",L),J("llnglanguage",L)),H(L)):(console.log("Selected lang ->",c),J("llnglanguage",c),H(c)),d="",S=0,h=(z=window.availableLanguages).length;S ';return $("#languages").html(d),$(".langicon").on("click",function(){return c=$(this).attr("title"),J("llnglanguage",c),H(c)}),u=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"),d=!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"),d=!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"),d=!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"),d=!1)),window.datas.ppolicy.allowedspechar){for(r=window.datas.ppolicy.allowedspechar.replace(/\s/g,""),t=!1,o=0,s=e.length;o=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"),d=!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"),d=!1)}d?($(".ppolicy").removeClass("border-danger").addClass("border-success"),null!=(l=$("#newpassword").get(0))&&l.setCustomValidity("")):($(".ppolicy").removeClass("border-success").addClass("border-danger"),null!=(c=$("#newpassword").get(0))&&c.setCustomValidity(F("PE28")))},null!=window.datas.ppolicy&&$("#newpassword").length&&(n(""),$("#newpassword").keyup(function(e){n(e.target.value)})),I=function(e){var a;return e.target.checked?($("#newpassword").off("keyup"),null!=(a=$("#newpassword").get(0))?a.setCustomValidity(""):void 0):($("#newpassword").keyup(function(e){n(e.target.value)}),n(""))},r=function(){var e,a,t,o;return(null!=(e=$("#confirmpassword").get(0))?e.value:void 0)===(null!=(a=$("#newpassword").get(0))?a.value:void 0)?(null!=(t=$("#confirmpassword").get(0))&&t.setCustomValidity(""),!0):(null!=(o=$("#confirmpassword").get(0))&&o.setCustomValidity(F("PE34")),!1)},$("#newpassword").change(r),$("#confirmpassword").change(r),null!=window.datas.ppolicy&&$("#newpassword").length&&$("#reset").change(I),D.enablePasswordDisplay&&($(".toggle-password").mousedown(function(e){return $(this).toggleClass("fa-eye fa-eye-slash"),$("input[name=password]").attr("type","text")}),$(".toggle-password").mouseup(function(e){return $(this).toggleClass("fa-eye fa-eye-slash"),$("input[name=password]").attr("type","password")})),D.pingInterval&&0 - @@ -34,10 +33,13 @@
- + + + + +
-
@@ -46,15 +48,22 @@
- + + + + +
- + + + + +
-