From ea80b4df0ed4d2444b11cf75b2a5356d186620b2 Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Sat, 30 Jan 2021 23:21:24 +0100 Subject: [PATCH] Use Ajax request (#1976) --- .../lib/Lemonldap/NG/Portal/Main/Display.pm | 11 ++---- .../Lemonldap/NG/Portal/Plugins/FindUser.pm | 11 ++++-- lemonldap-ng-portal/site/coffee/portal.coffee | 27 +++++++++++-- .../site/htdocs/static/common/js/portal.js | 38 ++++++++++++++++--- .../htdocs/static/common/js/portal.min.js | 2 +- .../htdocs/static/common/js/portal.min.js.map | 2 +- .../site/templates/bootstrap/finduser.tpl | 6 +-- .../t/68-FindUser-with-BadChoice-and-token.t | 2 +- .../t/68-FindUser-with-Choice-and-token.t | 11 ++++-- .../t/68-FindUser-with-Combination.t | 16 ++++---- lemonldap-ng-portal/t/68-FindUser-with-DBI.t | 32 ++++++++-------- ...8-FindUser-with-Demo-and-required-select.t | 14 +++---- .../t/68-FindUser-with-Demo-and-token.t | 8 ++-- lemonldap-ng-portal/t/68-FindUser-with-Demo.t | 30 +++++++-------- lemonldap-ng-portal/t/68-FindUser-with-LDAP.t | 28 +++++++------- lemonldap-ng-portal/t/68-FindUser-with-REST.t | 10 ++--- .../t/68-FindUser-without-Impersonation.t | 2 +- .../t/68-FindUser-without-attribute.t | 2 +- 18 files changed, 144 insertions(+), 108 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 69f94bf7f..067e6f492 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Display.pm @@ -483,14 +483,11 @@ sub display { $self->loadedModules->{ "Lemonldap::NG::Portal::Plugins::FindUser"}; my $fields = []; - if ( $plugin + $fields = $plugin->buildForm() + if ( $plugin && $self->conf->{findUser} && $self->conf->{impersonationRule} - && $self->conf->{findUserSearchingAttributes} ) - { - $login = $req->data->{findUser}; - $fields = $plugin->buildForm(); - } + && $self->conf->{findUserSearchingAttributes} ); # Authentication loop if ( $self->conf->{authentication} eq 'Choice' @@ -506,7 +503,6 @@ sub display { DISPLAY_OPENID_FORM => 0, DISPLAY_YUBIKEY_FORM => 0, FIELDS => $fields, - SPOOFID => $login, FINDUSER => scalar @$fields ); } @@ -540,7 +536,6 @@ sub display { ( $displayType eq "logo" ? $self->conf->{portal} : 0 ), MSG => $req->info(), FIELDS => $fields, - SPOOFID => $login, FINDUSER => scalar @$fields ); } diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FindUser.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FindUser.pm index ea7a4e358..9b56d4db4 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FindUser.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FindUser.pm @@ -186,15 +186,16 @@ sub buildForm { sub sendResult { my ( $self, $req, $error ) = @_; - + eval { $self->p->_authentication->setSecurity($req) }; if ($error) { - eval { $self->p->_authentication->setSecurity($req) }; return $req->wantJSON ? $self->p->sendJSONresponse( $req, { user => '', - error => $error + error => $error, + ( $req->token ? ( token => $req->token ) : () ), + ( $req->captcha ? ( captcha => $req->captcha ) : () ) } ) : $self->p->do( $req, [ sub { $error } ] ); @@ -204,7 +205,9 @@ sub sendResult { $req, { user => ( $req->data->{findUser} ? $req->data->{findUser} : '' ), - result => 1 + result => 1, + ( $req->token ? ( token => $req->token ) : () ), + ( $req->captcha ? ( captcha => $req->captcha ) : () ) } ) : $self->p->do( $req, [ sub { PE_FIRSTACCESS } ] ); diff --git a/lemonldap-ng-portal/site/coffee/portal.coffee b/lemonldap-ng-portal/site/coffee/portal.coffee index 4438b993c..42e38ecc5 100644 --- a/lemonldap-ng-portal/site/coffee/portal.coffee +++ b/lemonldap-ng-portal/site/coffee/portal.coffee @@ -216,7 +216,7 @@ setCookie = (name, value, exdays) -> # Function to change password using Ajax (instead of POST) # NOT USED FOR NOW #changePwd = (event) -> -# event.preventDefault(); +# event.preventDefault() # $.ajax # type: 'POST' # url: datas['scriptname'] @@ -544,6 +544,25 @@ $(window).on 'load', () -> #$('#formpass').on 'submit', changePwd - if window.location.href.match /\/finduser/ - console.log 'Set Portal URL: ' + portal - window.history.pushState({page: 'Portal'}, 'Portal', portal) + $('#finduserbutton').on 'click', (event) -> + event.preventDefault() + str = $("#finduserform").serialize() + console.log 'Send findUser request with', str + $.ajax + type: "POST" + url: "#{portal}finduser" + dataType: 'json' + data: str + # On success, value are set + success: (data) -> + user = data.user + console.log 'Suggested spoofId', user + $('#spoofIdfield').attr 'value', user + $('#captcha').attr 'src', data.captcha if data.captcha + if data.token + $('#findusertoken').attr 'value', data.token + $('#token').attr 'value', data.token + error: (j) -> + res = JSON.parse j.responseText if j + if res and res.error + console.log 'Returned error', res \ No newline at end of file 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 5664cae94..295f5b4f3 100644 --- a/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js +++ b/lemonldap-ng-portal/site/htdocs/static/common/js/portal.js @@ -587,12 +587,38 @@ LemonLDAP::NG Portal jQuery scripts return $("#show-hide-icon-button").addClass('fa-eye'); } }); - if (window.location.href.match(/\/finduser/)) { - console.log('Set Portal URL: ' + portal); - return window.history.pushState({ - page: 'Portal' - }, 'Portal', portal); - } + return $('#finduserbutton').on('click', function(event) { + var str; + event.preventDefault(); + str = $("#finduserform").serialize(); + console.log('Send findUser request with', str); + return $.ajax({ + type: "POST", + url: portal + "finduser", + dataType: 'json', + data: str, + success: function(data) { + var user; + user = data.user; + console.log('Suggested spoofId', user); + $('#spoofIdfield').attr('value', user); + if (data.captcha) { + $('#captcha').attr('src', data.captcha); + } + if (data.token) { + $('#findusertoken').attr('value', data.token); + return $('#token').attr('value', data.token); + } + }, + error: function(j) { + var res; + res = JSON.parse(j.responseText); + if (res && res.error) { + return console.log('Returned error', res); + } + } + }); + }); }); }).call(this); 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 888cf6584..cbb873018 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 I,a,D,R,U,V,_,M,N,e,J,g,H,Z,i,q=[].indexOf||function(e){for(var a=0,t=this.length;a div.category",update:function(){return J()}}),M(),$("div.message").fadeIn("slow"),$("input[name=timezone]").val(-(new Date).getTimezoneOffset()/60),k=$("#menu").tabs({active:0}),(b=$('#menu a[href="#'+I.displaytab+'"]').parent().index())<0&&(b=0),k.tabs("option","active",b),n=$("#authMenu").tabs({active:0}),(t=$('#authMenu a[href="#'+I.displaytab+'"]').parent().index())<0&&(t=0),n.tabs("option","active",t),I.choicetab&&n.tabs("option","active",$('#authMenu a[href="#'+I.choicetab+'"]').parent().index()),I.login?$("input[type=password]:first").focus():0===$("input[autofocus]").length&&$("input[type!=hidden]:first").focus(),I.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&&((P=R("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=R("setCookieLang"))&&console.log("Set lang cookie")),c||(c=D("llnglanguage"))&&!P&&console.log("Get lang from cookie"),c)q.call(window.availableLanguages,c)<0&&(c=window.availableLanguages[0],P||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=(j=window.availableLanguages).length;l ';for(v=0,w=O.length;v Get default lang"),P=window.availableLanguages[0]),console.log("Selected lang ->",P),A&&(console.log("Set cookie lang ->",P),N("llnglanguage",P)),Z(P)):(console.log("Selected lang ->",c),N("llnglanguage",c),Z(c)),d="",T=0,m=(z=window.availableLanguages).length;T ';if($("#languages").html(d),$(".langicon").on("click",function(){return c=$(this).attr("title"),N("llnglanguage",c),Z(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(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"),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(H("PE28")))},null!=window.datas.ppolicy&&$("#newpassword").length&&(s(""),$("#newpassword").keyup(function(e){s(e.target.value)})),G=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(""))},i=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(H("PE34")),!1)},$("#newpassword").change(i),$("#confirmpassword").change(i),null!=window.datas.ppolicy&&$("#newpassword").length&&$("#reset").change(G),I.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="#'+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&&((S=R("llnglanguage"))&&console.log("Get lang from parameter"),1===(A=R("setCookieLang"))&&console.log("Set lang cookie")),c||(c=D("llnglanguage"))&&!S&&console.log("Get lang from cookie"),c)Z.call(window.availableLanguages,c)<0&&(c=window.availableLanguages[0],S||console.log("Lang not available -> Get default lang"));else if(navigator){for(p=[],g=[],T=[navigator.language],navigator.languages&&(T=navigator.languages),l=0,f=(E=window.availableLanguages).length;l ';for(v=0,h=T.length;v Get default lang"),S=window.availableLanguages[0]),console.log("Selected lang ->",S),A&&(console.log("Set cookie lang ->",S),J("llnglanguage",S)),H(S)):(console.log("Selected lang ->",c),J("llnglanguage",c),H(c)),d="",L=0,m=(z=window.availableLanguages).length;L ';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(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"),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(q("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(""))},i=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(q("PE34")),!1)},$("#newpassword").change(i),$("#confirmpassword").change(i),null!=window.datas.ppolicy&&$("#newpassword").length&&$("#reset").change(I),G.pingInterval&&0

-