[from master] sets firstname, lastname, email address
parent
6f85952dc3
commit
3b5b094b3e
90
Redmine.pm
90
Redmine.pm
|
@ -259,6 +259,12 @@ my @directives = (
|
||||||
args_how => TAKE1,
|
args_how => TAKE1,
|
||||||
errmsg => 'USername to use for authenticiation with API KEY. Defaults to api-key.'
|
errmsg => 'USername to use for authenticiation with API KEY. Defaults to api-key.'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name => 'RedmineSetUserAttributes',
|
||||||
|
req_override => OR_AUTHCFG,
|
||||||
|
args_how => FLAG,
|
||||||
|
errmsg => 'Sets firstname, lastname, email address to environment variables. Defaults to no.',
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
# Initialize defaults configuration
|
# Initialize defaults configuration
|
||||||
|
@ -285,6 +291,8 @@ sub DIR_CREATE {
|
||||||
SuperAdmin => 1,
|
SuperAdmin => 1,
|
||||||
KeyAuthentication => 0,
|
KeyAuthentication => 0,
|
||||||
KeyUsername => 'api-key',
|
KeyUsername => 'api-key',
|
||||||
|
SetUserAttributes => 0,
|
||||||
|
AttributesCacheCredsCount => 0,
|
||||||
}, $class;
|
}, $class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,6 +310,7 @@ sub RedmineDenyNonMember { set_val('DenyNonMember', @_); }
|
||||||
sub RedmineSuperAdmin { set_val('SuperAdmin', @_); }
|
sub RedmineSuperAdmin { set_val('SuperAdmin', @_); }
|
||||||
sub RedmineKeyAuthentication { set_val('KeyAuthentication', @_); }
|
sub RedmineKeyAuthentication { set_val('KeyAuthentication', @_); }
|
||||||
sub RedmineKeyUsername { set_val('KeyUsername', @_); }
|
sub RedmineKeyUsername { set_val('KeyUsername', @_); }
|
||||||
|
sub RedmineSetUserAttributes { set_val('SetUserAttributes', @_); }
|
||||||
|
|
||||||
sub RedmineDbWhereClause {
|
sub RedmineDbWhereClause {
|
||||||
my ($cfg, $parms, $arg) = @_;
|
my ($cfg, $parms, $arg) = @_;
|
||||||
|
@ -359,9 +368,15 @@ sub authen_handler {
|
||||||
|
|
||||||
# Used cached credentials if possible
|
# Used cached credentials if possible
|
||||||
my $cache_key = get_cache_key($r, $password);
|
my $cache_key = get_cache_key($r, $password);
|
||||||
if(defined $cache_key && cache_get($r, $cache_key)) {
|
my $cfg = get_config($r);
|
||||||
|
if(defined $cache_key && !$cfg->{SetUserAttributes} && cache_get($r, $cache_key)) {
|
||||||
$r->log->debug("reusing cached credentials for user '", $r->user, "'");
|
$r->log->debug("reusing cached credentials for user '", $r->user, "'");
|
||||||
$r->set_handlers(PerlAuthzHandler => undef);
|
$r->set_handlers(PerlAuthzHandler => undef);
|
||||||
|
attributes_cache_get($r, $cache_key);
|
||||||
|
|
||||||
|
} elsif(defined $cache_key && $cfg->{SetUserAttributes} && cache_get($r, $cache_key) && attributes_cache_get($r, $cache_key)) {
|
||||||
|
$r->log->debug("reusing cached credentials for user '", $r->user, "' including attributes");
|
||||||
|
$r->set_handlers(PerlAuthzHandler => undef);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
# Else check them
|
# Else check them
|
||||||
|
@ -413,8 +428,8 @@ sub check_login {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
# Login+password auth
|
# Login+password auth
|
||||||
my ($hashed_password, $auth_source_id, $salt, $res, $reason);
|
my ($hashed_password, $auth_source_id, $salt, $id, $firstname, $lastname, $res, $reason);
|
||||||
($hashed_password, $status, $auth_source_id, $salt) = $dbh->selectrow_array('SELECT hashed_password, status, auth_source_id, salt FROM users WHERE login = ?', undef, $user)
|
($hashed_password, $status, $auth_source_id, $salt, $id, $firstname, $lastname) = $dbh->selectrow_array('SELECT hashed_password, status, auth_source_id, salt, id, firstname, lastname FROM users WHERE login = ?', undef, $user)
|
||||||
or return (AUTH_REQUIRED, "unknown user '$user'");
|
or return (AUTH_REQUIRED, "unknown user '$user'");
|
||||||
|
|
||||||
if ($auth_source_id) {
|
if ($auth_source_id) {
|
||||||
|
@ -430,6 +445,21 @@ sub check_login {
|
||||||
# Password is ok, check if account if locked
|
# Password is ok, check if account if locked
|
||||||
return (FORBIDDEN, "inactive account: '$user'") unless $status == 1;
|
return (FORBIDDEN, "inactive account: '$user'") unless $status == 1;
|
||||||
|
|
||||||
|
my($email_address) = $dbh->selectrow_array(
|
||||||
|
"SELECT address
|
||||||
|
FROM email_addresses
|
||||||
|
WHERE email_addresses.user_id=? and is_default=1",
|
||||||
|
undef,
|
||||||
|
$id
|
||||||
|
);
|
||||||
|
if (defined $email_address) {
|
||||||
|
$r->subprocess_env->set("REDMINE_DEFAULT_EMAIL_ADDRESS" => $email_address);
|
||||||
|
} else {
|
||||||
|
$r->subprocess_env->set("REDMINE_DEFAULT_EMAIL_ADDRESS" => "");
|
||||||
|
}
|
||||||
|
$r->subprocess_env->set("REDMINE_FIRSTNAME" => $firstname);
|
||||||
|
$r->subprocess_env->set("REDMINE_LASTNAME" => $lastname);
|
||||||
|
|
||||||
$r->log->debug("successfully authenticated as active redmine user '$user'");
|
$r->log->debug("successfully authenticated as active redmine user '$user'");
|
||||||
|
|
||||||
# Everything's ok
|
# Everything's ok
|
||||||
|
@ -585,6 +615,7 @@ sub authz_handler {
|
||||||
# Put successful credentials in cache
|
# Put successful credentials in cache
|
||||||
if(my $cache_key = $r->pnotes("RedmineCacheKey")) {
|
if(my $cache_key = $r->pnotes("RedmineCacheKey")) {
|
||||||
cache_set($r, $cache_key);
|
cache_set($r, $cache_key);
|
||||||
|
attributes_cache_set($r, $cache_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -658,7 +689,10 @@ sub connect_database {
|
||||||
my $r = shift;
|
my $r = shift;
|
||||||
|
|
||||||
my $cfg = get_config($r);
|
my $cfg = get_config($r);
|
||||||
my $dbh = DBI->connect($cfg->{DSN}, $cfg->{DbUser}, $cfg->{DbPass})
|
my $dbh = DBI->connect($cfg->{DSN}, $cfg->{DbUser}, $cfg->{DbPass}, {
|
||||||
|
pg_enable_utf8 => 1,
|
||||||
|
mysql_enable_utf8 => 1,
|
||||||
|
})
|
||||||
or $r->log->error("Connection to database failed: $DBI::errstr.");
|
or $r->log->error("Connection to database failed: $DBI::errstr.");
|
||||||
|
|
||||||
return $dbh;
|
return $dbh;
|
||||||
|
@ -696,6 +730,30 @@ sub cache_get {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub attributes_cache_get {
|
||||||
|
my($r, $key) = @_;
|
||||||
|
|
||||||
|
my $cfg = get_config($r);
|
||||||
|
return unless $cfg->{CacheCredsMax} && $cfg->{AttributesCacheCreds};
|
||||||
|
|
||||||
|
my $cache_text = $cfg->{AttributesCacheCreds}->get($key)
|
||||||
|
or return 0;
|
||||||
|
|
||||||
|
$r->log->error("cache_text:$cache_text");
|
||||||
|
my($time, $email_address, $firstname, $lastname) = split(":", $cache_text);
|
||||||
|
if($cfg->{CacheCredsMaxAge} && ($r->request_time - $time) > $cfg->{CacheCredsMaxAge}) {
|
||||||
|
$cfg->{AttributesCacheCreds}->unset($key);
|
||||||
|
$cfg->{AttributesCacheCredsCount}--;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$r->subprocess_env->set("REDMINE_DEFAULT_EMAIL_ADDRESS", $email_address . "");
|
||||||
|
$r->subprocess_env->set("REDMINE_FIRSTNAME", $firstname . "");
|
||||||
|
$r->subprocess_env->set("REDMINE_LASTNAME", $lastname . "");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
# put credentials in cache
|
# put credentials in cache
|
||||||
sub cache_set {
|
sub cache_set {
|
||||||
my($r, $key) = @_;
|
my($r, $key) = @_;
|
||||||
|
@ -716,6 +774,30 @@ sub cache_set {
|
||||||
$cfg->{CacheCredsCount}++;
|
$cfg->{CacheCredsCount}++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub attributes_cache_set {
|
||||||
|
my($r, $key) = @_;
|
||||||
|
|
||||||
|
my $cfg = get_config($r);
|
||||||
|
return unless $cfg->{CacheCredsMax};
|
||||||
|
|
||||||
|
unless($cfg->{AttributesCacheCreds}) {
|
||||||
|
$cfg->{AttributesCachePool} = APR::Pool->new;
|
||||||
|
$cfg->{AttributesCacheCreds} = APR::Table::make($cfg->{AttributesCachePool}, $cfg->{CacheCredsMax});
|
||||||
|
}
|
||||||
|
|
||||||
|
if($cfg->{AttributesCacheCredsCount} >= $cfg->{CacheCredsMax}) {
|
||||||
|
$cfg->{AttributesCacheCreds}->clear;
|
||||||
|
$cfg->{AttributesCacheCredsCount} = 0;
|
||||||
|
}
|
||||||
|
my $cache_text = join(":", $r->request_time,
|
||||||
|
$r->subprocess_env->get("REDMINE_DEFAULT_EMAIL_ADDRESS"),
|
||||||
|
$r->subprocess_env->get("REDMINE_FIRSTNAME"),
|
||||||
|
$r->subprocess_env->get("REDMINE_LASTNAME"),
|
||||||
|
);
|
||||||
|
$cfg->{AttributesCacheCreds}->set($key, $cache_text);
|
||||||
|
$cfg->{AttributesCacheCredsCount}++;
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
# vim: set noexpandtab ts=4
|
# vim: set noexpandtab ts=4
|
||||||
|
|
Loading…
Reference in New Issue