From 6be4cfe035c7ca682f439f2a32b053cfbbaaed93 Mon Sep 17 00:00:00 2001 From: Christophe Maudoux Date: Mon, 3 May 2021 22:38:10 +0200 Subject: [PATCH] Dismiss cache if cfgDate has changed (#2508) --- .../lib/Lemonldap/NG/Common/Conf.pm | 4 +- .../lib/Lemonldap/NG/Manager/Conf.pm | 58 +++++++++++-------- .../site/coffee/manager.coffee | 2 +- .../site/htdocs/static/js/manager.js | 2 +- .../site/htdocs/static/js/manager.min.js | 2 +- .../site/htdocs/static/js/manager.min.js.map | 2 +- lemonldap-ng-manager/t/16-cli.t | 10 +--- 7 files changed, 42 insertions(+), 38 deletions(-) diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm index 548053785..04b752703 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf.pm @@ -122,7 +122,9 @@ sub saveConf { # If configuration was modified, return an error if ( not $args{force} ) { - return CONFIG_WAS_CHANGED if ( $conf->{cfgNum} != $last ); + return CONFIG_WAS_CHANGED + if ( $conf->{cfgNum} ne $last + || $args{cfgDate} && $args{cfgDate} ne $args{currentCfgDate} ); return DATABASE_LOCKED if ( $self->isLocked() or not $self->lock() ); } $conf->{cfgNum} = $last + 1 unless ( $args{cfgNumFixed} ); diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm index d9c42bf69..ff32a38c0 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm @@ -123,7 +123,7 @@ sub newRSAKey { my $keys = { 'private' => $rsa->get_private_key_string(), 'public' => $rsa->get_public_key_x509_string(), - 'hash' => md5_base64($rsa->get_public_key_string()), + 'hash' => md5_base64( $rsa->get_public_key_string() ), }; if ( $query->{password} ) { my $pem = Convert::PEM->new( @@ -345,26 +345,25 @@ sub newConf { # Body must be json my $new = $req->jsonBodyToObj; - unless ( defined($new) ) { - return $self->sendError( $req, undef, 400 ); - } + return $self->sendError( $req, undef, 400 ) unless ( defined $new ); - # Verify that cfgNum has been asked - unless ( defined $req->params('cfgNum') ) { - return $self->sendError( $req, "Missing configuration number", 400 ); - } + # Verify that cfgNum has been sent + return $self->sendError( $req, "Missing configuration number", 400 ) + unless ( defined $req->params('cfgNum') ); + + # # Verify that cfgDate has been sent + # return $self->sendError( $req, "Missing configuration date", 400 ) + # unless ( defined $req->params('cfgDate') ); # Set current conf to cfgNum - unless ( defined $self->getConfByNum( $req->params('cfgNum') ) ) { - return $self->sendError( - $req, - "Configuration " - . $req->params('cfgNum') - . " not available " - . $Lemonldap::NG::Common::Conf::msg, - 400 - ); - } + return $self->sendError( + $req, + "Configuration " + . $req->params('cfgNum') + . " not available " + . $Lemonldap::NG::Common::Conf::msg, + 400 + ) unless ( defined $self->getConfByNum( $req->params('cfgNum') ) ); # Parse new conf require Lemonldap::NG::Manager::Conf::Parser; @@ -372,13 +371,20 @@ sub newConf { { tree => $new, refConf => $self->currentConf, req => $req } ); # If ref conf isn't last conf, consider conf changed - my $cfgNum = $self->confAcc->lastCfg; - unless ( defined $cfgNum ) { - $req->error($Lemonldap::NG::Common::Conf::msg); - } + my $currentCfgNum = $self->confAcc->lastCfg; + $req->error($Lemonldap::NG::Common::Conf::msg) + unless ( defined $currentCfgNum ); return $self->sendError( $req, undef, 400 ) if ( $req->error ); - - if ( $cfgNum ne $req->params('cfgNum') ) { $parser->confChanged(1); } + my $currentConf = + $self->confAcc->getConf( + { CfgNum => $currentCfgNum, raw => 1, noCache => 1 } ); + my $currentCfgDate = $currentConf->{cfgDate}; + $self->logger->debug( + "Current CfgNum/cfgDate: $currentCfgNum/$currentCfgDate"); + $parser->confChanged(1) + if ( $currentCfgNum ne $req->params('cfgNum') + || $req->params('cfgDate') + && $req->params('cfgDate') ne $currentCfgDate ); my $res = { result => $parser->check( $self->p ) }; @@ -402,6 +408,10 @@ sub newConf { else { my %args; $args{force} = 1 if ( $req->params('force') ); + if ( $req->params('cfgDate') ) { + $args{cfgDate} = $req->params('cfgDate'); + $args{currentCfgDate} = $currentCfgDate; + } my $s = CONFIG_WAS_CHANGED; $s = $self->confAcc->saveConf( $parser->newConf, %args ) unless ( @{ $parser->{needConfirmation} } && !$args{force} ); diff --git a/lemonldap-ng-manager/site/coffee/manager.coffee b/lemonldap-ng-manager/site/coffee/manager.coffee index 66a532026..6abe9c7bf 100644 --- a/lemonldap-ng-manager/site/coffee/manager.coffee +++ b/lemonldap-ng-manager/site/coffee/manager.coffee @@ -189,7 +189,7 @@ llapp.controller 'TreeCtrl', [ id: "cfgLog" title: "cfgLog" data: if $scope.result then $scope.result else '' - $http.post("#{window.confPrefix}?cfgNum=#{$scope.currentCfg.cfgNum}#{if $scope.forceSave then "&force=1" else ''}", $scope.data).then (response) -> + $http.post("#{window.confPrefix}?cfgNum=#{$scope.currentCfg.cfgNum}&cfgDate=#{$scope.currentCfg.cfgDate}#{if $scope.forceSave then "&force=1" else ''}", $scope.data).then (response) -> $scope.data.pop() _checkSaveResponse response.data ,(response) -> diff --git a/lemonldap-ng-manager/site/htdocs/static/js/manager.js b/lemonldap-ng-manager/site/htdocs/static/js/manager.js index f743106b2..d01077c52 100644 --- a/lemonldap-ng-manager/site/htdocs/static/js/manager.js +++ b/lemonldap-ng-manager/site/htdocs/static/js/manager.js @@ -225,7 +225,7 @@ This file contains: title: "cfgLog", data: $scope.result ? $scope.result : '' }); - return $http.post(window.confPrefix + "?cfgNum=" + $scope.currentCfg.cfgNum + ($scope.forceSave ? "&force=1" : ''), $scope.data).then(function(response) { + return $http.post(window.confPrefix + "?cfgNum=" + $scope.currentCfg.cfgNum + "&cfgDate=" + $scope.currentCfg.cfgDate + ($scope.forceSave ? "&force=1" : ''), $scope.data).then(function(response) { $scope.data.pop(); return _checkSaveResponse(response.data); }, function(response) { diff --git a/lemonldap-ng-manager/site/htdocs/static/js/manager.min.js b/lemonldap-ng-manager/site/htdocs/static/js/manager.min.js index 951c7ad5c..3da250ff7 100644 --- a/lemonldap-ng-manager/site/htdocs/static/js/manager.min.js +++ b/lemonldap-ng-manager/site/htdocs/static/js/manager.min.js @@ -1 +1 @@ -(function(){angular.module("llngManager",["ui.tree","ui.bootstrap","llApp","ngCookies"]).controller("TreeCtrl",["$scope","$http","$location","$q","$uibModal","$translator","$cookies","$htmlParams",function(f,l,a,d,o,n,r,e){var t,s,u,c,i,p,m,g,h;return f.links=window.links,f.menu=e.menu,f.menulinks=window.menulinks,f.staticPrefix=window.staticPrefix,f.formPrefix=window.formPrefix,f.availableLanguages=window.availableLanguages,f.waiting=!0,f.showM=!1,f.showT=!1,f.form="home",f.currentCfg={},f.confPrefix=window.confPrefix,f.message={},f.result="",f.translateTitle=function(e){return n.translateField(e,"title")},f.translateP=n.translateP,f.translate=n.translate,f.helpUrl="start.html#configuration",f.setShowHelp=function(e){var t;return null==e&&(e=!f.showH),f.showH=e,(t=new Date(Date.now())).setFullYear(t.getFullYear()+1),r.put("showhelp",e?"true":"false",{expires:t})},f.showH="false"!==r.get("showhelp"),null==f.showH&&f.setShowHelp(!0),m=function(e){var t,n;return t=e.status,n=e.statusLine,f.waiting=!1,f.message=403===t?{title:"forbidden",message:"",items:[]}:401===t?(console.log("Authentication needed"),{title:"authenticationNeeded",message:"__waitOrF5__",items:[]}):400===t?{title:"badRequest",message:n,items:[]}:0run(@cmd) }, - qr#cfgNum forced with 6#s, - '"Force cfgNum" OK' -); - # Test 'info' command with force @cmd = qw(info); combined_like(