Index: Redmine.pm =================================================================== --- Redmine.pm (révision 7812) +++ Redmine.pm (copie de travail) @@ -142,6 +142,12 @@ args_how => TAKE1, errmsg => 'RedmineCacheCredsMax must be decimal number', }, + { + name => 'RedmineCacheCredsMaxAge', + req_override => OR_AUTHCFG, + args_how => TAKE1, + errmsg => 'RedmineCacheCredsMaxAge must be decimal number', + }, ); sub RedmineDSN { @@ -175,9 +181,12 @@ $self->{RedmineCacheCreds} = APR::Table::make($self->{RedmineCachePool}, $arg); $self->{RedmineCacheCredsCount} = 0; $self->{RedmineCacheCredsMax} = $arg; + $self->{RedmineCacheCredsMaxAge} ||= 300; } } +sub RedmineCacheCredsMaxAge { set_val('RedmineCacheCredsMaxAge', @_); } + sub trim { my $string = shift; $string =~ s/\s{2,}/ /g; @@ -348,11 +357,20 @@ my $access_mode = defined $read_only_methods{$r->method} ? "R" : "W"; my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config); - my $usrprojpass; + my $cache_key; if ($cfg->{RedmineCacheCredsMax}) { - $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id.":".$access_mode); - return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest)); + $cache_key = Digest::SHA1::sha1_hex($redmine_user, $pass_digest, $project_id, $access_mode); + my $expirationTime = $cfg->{RedmineCacheCreds}->get($cache_key); + if(defined $expirationTime) { + if($cfg->{RedmineCacheCredsMaxAge} && $r->request_time > $expirationTime) { + $cfg->{RedmineCacheCreds}->unset($cache_key); + $cfg->{RedmineCacheCredsCount}--; + } else { + return 1; + } + } } + my $query = $cfg->{RedmineQuery}; my $sth = $dbh->prepare($query); $sth->execute($redmine_user, $project_id); @@ -394,18 +412,13 @@ $dbh->disconnect(); undef $dbh; - if ($cfg->{RedmineCacheCredsMax} and $ret) { - if (defined $usrprojpass) { - $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest); - } else { - if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) { - $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest); - $cfg->{RedmineCacheCredsCount}++; - } else { - $cfg->{RedmineCacheCreds}->clear(); - $cfg->{RedmineCacheCredsCount} = 0; - } + if (defined $cache_key) { + if ($cfg->{RedmineCacheCredsCount} >= $cfg->{RedmineCacheCredsMax}) { + $cfg->{RedmineCacheCreds}->clear(); + $cfg->{RedmineCacheCredsCount} = 0; } + $cfg->{RedmineCacheCreds}->set($cache_key, $cfg->{RedmineCacheCredsMaxAge} ? $r->request_time + $cfg->{RedmineCacheCredsMaxAge} : 1); + $cfg->{RedmineCacheCredsCount}++; } $ret;