Project

General

Profile

Patch #9579 » Redmine.pm-cache-creds-max-age.patch

Patch for Redmine.pm r7812 - Guillaume Perréal, 2011-11-15 13:15

View differences:

Redmine.pm (copie de travail)
142 142
    args_how => TAKE1,
143 143
    errmsg => 'RedmineCacheCredsMax must be decimal number',
144 144
  },
145
  {
146
    name => 'RedmineCacheCredsMaxAge',
147
    req_override => OR_AUTHCFG,
148
    args_how => TAKE1,
149
    errmsg => 'RedmineCacheCredsMaxAge must be decimal number',
150
  },
145 151
);
146 152

  
147 153
sub RedmineDSN { 
......
175 181
    $self->{RedmineCacheCreds} = APR::Table::make($self->{RedmineCachePool}, $arg);
176 182
    $self->{RedmineCacheCredsCount} = 0;
177 183
    $self->{RedmineCacheCredsMax} = $arg;
184
    $self->{RedmineCacheCredsMaxAge} ||= 300;
178 185
  }
179 186
}
180 187

  
188
sub RedmineCacheCredsMaxAge { set_val('RedmineCacheCredsMaxAge', @_); }
189

  
181 190
sub trim {
182 191
  my $string = shift;
183 192
  $string =~ s/\s{2,}/ /g;
......
348 357
  my $access_mode = defined $read_only_methods{$r->method} ? "R" : "W";
349 358

  
350 359
  my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
351
  my $usrprojpass;
360
  my $cache_key;
352 361
  if ($cfg->{RedmineCacheCredsMax}) {
353
    $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id.":".$access_mode);
354
    return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest));
362
    $cache_key = Digest::SHA1::sha1_hex($redmine_user, $pass_digest, $project_id, $access_mode);
363
    my $expirationTime = $cfg->{RedmineCacheCreds}->get($cache_key);
364
    if(defined $expirationTime) {
365
      if($cfg->{RedmineCacheCredsMaxAge} && $r->request_time > $expirationTime) {
366
        $cfg->{RedmineCacheCreds}->unset($cache_key);
367
        $cfg->{RedmineCacheCredsCount}--;
368
      } else {
369
        return 1;
370
      }
371
    }
355 372
  }
373

  
356 374
  my $query = $cfg->{RedmineQuery};
357 375
  my $sth = $dbh->prepare($query);
358 376
  $sth->execute($redmine_user, $project_id);
......
394 412
  $dbh->disconnect();
395 413
  undef $dbh;
396 414

  
397
  if ($cfg->{RedmineCacheCredsMax} and $ret) {
398
    if (defined $usrprojpass) {
399
      $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest);
400
    } else {
401
      if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) {
402
        $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id.":".$access_mode, $pass_digest);
403
        $cfg->{RedmineCacheCredsCount}++;
404
      } else {
405
        $cfg->{RedmineCacheCreds}->clear();
406
        $cfg->{RedmineCacheCredsCount} = 0;
407
      }
415
  if (defined $cache_key) {
416
    if ($cfg->{RedmineCacheCredsCount} >= $cfg->{RedmineCacheCredsMax}) {
417
      $cfg->{RedmineCacheCreds}->clear();
418
      $cfg->{RedmineCacheCredsCount} = 0;
408 419
    }
420
    $cfg->{RedmineCacheCreds}->set($cache_key, $cfg->{RedmineCacheCredsMaxAge} ? $r->request_time + $cfg->{RedmineCacheCredsMaxAge} : 1);
421
    $cfg->{RedmineCacheCredsCount}++;
409 422
  }
410 423

  
411 424
  $ret;
    (1-1/1)