--- D:/Programme/wamp/railsapp/redmine/extra/svn/Redmine_org121.pm Mo Jul 11 13:46:44 2011 +++ D:/Programme/wamp/railsapp/redmine/extra/svn/Redmine.pm Mi Sep 7 10:04:49 2011 @@ -51,17 +51,17 @@ PerlAuthenHandler Apache::Authn::Redmine::authen_handler ## for mysql - RedmineDSN "DBI:mysql:database=databasename;host=my.db.server" + PerlSetVar RedmineDSN "DBI:mysql:database=databasename;host=my.db.server" ## for postgres - # RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server" + # PerlSetVar RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server" - RedmineDbUser "redmine" - RedmineDbPass "password" + PerlSetVar RedmineDbUser "redmine" + PerlSetVar RedmineDbPass "password" ## Optional where clause (fulltext search would be slow and ## database dependant). - # RedmineDbWhereClause "and members.role_id IN (1,2)" + # PerlSetVar RedmineDbWhereClause "and members.role_id IN (1,2)" ## Optional credentials cache size - # RedmineCacheCredsMax 50 + # PerlSetVar RedmineCacheCredsMax 50 To be able to browse repository inside redmine, you must add something @@ -113,42 +113,42 @@ use APR::Table (); # use Apache2::Directive qw(); +my %read_only_methods = map { $_ => 1 } qw/GET PROPFIND REPORT OPTIONS/; -my @directives = ( - { - name => 'RedmineDSN', - req_override => OR_AUTHCFG, - args_how => TAKE1, - errmsg => 'Dsn in format used by Perl DBI. eg: "DBI:Pg:dbname=databasename;host=my.db.server"', - }, - { - name => 'RedmineDbUser', - req_override => OR_AUTHCFG, - args_how => TAKE1, - }, - { - name => 'RedmineDbPass', - req_override => OR_AUTHCFG, - args_how => TAKE1, - }, - { - name => 'RedmineDbWhereClause', - req_override => OR_AUTHCFG, - args_how => TAKE1, - }, - { - name => 'RedmineCacheCredsMax', - req_override => OR_AUTHCFG, - args_how => TAKE1, - errmsg => 'RedmineCacheCredsMax must be decimal number', - }, -); +my $cfg; -sub RedmineDSN { - my ($self, $parms, $arg) = @_; - $self->{RedmineDSN} = $arg; - my $query = "SELECT - hashed_password, salt, auth_source_id, permissions +sub initialize { + my $r = shift; + my $ret = 1; + + $cfg->{RedmineDSN} = $r->dir_config('RedmineDSN'); + $cfg->{RedmineDbUser} = $r->dir_config('RedmineDbUser'); + $cfg->{RedmineDbPass} = $r->dir_config('RedmineDbPass'); + + unless ($cfg->{RedmineDSN}) { + $r->log_reason("No DSN has been configured. Maybe PerlSetVar is missing at the beginning of the line"); + $ret = 0; + } + + unless ($cfg->{RedmineDbUser}) { + $r->log_reason("No DSN user has been configured. Maybe PerlSetVar is missing at the beginning of the line"); + $ret = 0; + } + + unless ($cfg->{RedmineDbPass}) { + $r->log_reason("No DSN user password has been configured. Maybe PerlSetVar is missing at the beginning of the line"); + $ret = 0; + } + + if ($r->dir_config('RedmineCacheCredsMax')) { + $cfg->{RedmineCachePool} = APR::Pool->new; + $cfg->{RedmineCacheCreds} = APR::Table::make($cfg->{RedmineCachePool}, $r->dir_config('RedmineCacheCredsMax')); + $cfg->{RedmineCacheCredsCount} = 0; + $cfg->{RedmineCacheCredsMax} = $r->dir_config('RedmineCacheCredsMax'); + } + + my $query = trim("SELECT + hashed_password, auth_source_id, permissions FROM members, projects, users, roles, member_roles WHERE projects.id=members.project_id @@ -157,46 +157,29 @@ AND roles.id=member_roles.role_id AND users.status=1 AND login=? - AND identifier=? "; - $self->{RedmineQuery} = trim($query); -} + AND identifier=? "); -sub RedmineDbUser { set_val('RedmineDbUser', @_); } -sub RedmineDbPass { set_val('RedmineDbPass', @_); } -sub RedmineDbWhereClause { - my ($self, $parms, $arg) = @_; - $self->{RedmineQuery} = trim($self->{RedmineQuery}.($arg ? $arg : "")." "); -} + $cfg->{RedmineQuery} = trim($query.($r->dir_config('RedmineDbWhereClause') ? $r->dir_config('RedmineDbWhereClause') : "")." "); -sub RedmineCacheCredsMax { - my ($self, $parms, $arg) = @_; - if ($arg) { - $self->{RedmineCachePool} = APR::Pool->new; - $self->{RedmineCacheCreds} = APR::Table::make($self->{RedmineCachePool}, $arg); - $self->{RedmineCacheCredsCount} = 0; - $self->{RedmineCacheCredsMax} = $arg; - } + return $ret; } + sub trim { my $string = shift; $string =~ s/\s{2,}/ /g; return $string; } -sub set_val { - my ($key, $self, $parms, $arg) = @_; - $self->{$key} = $arg; -} -Apache2::Module::add(__PACKAGE__, \@directives); - - -my %read_only_methods = map { $_ => 1 } qw/GET PROPFIND REPORT OPTIONS/; - sub access_handler { my $r = shift; + unless (initialize($r)) { + $r->log_reason("Please check redmine connfiguration"); + return FORBIDDEN; + } + unless ($r->some_auth_required) { $r->log_reason("No authentication has been configured"); return FORBIDDEN; @@ -216,6 +199,11 @@ sub authen_handler { my $r = shift; + unless (initialize($r)) { + $r->log_reason("Please check redmine connfiguration"); + return AUTH_REQUIRED; + } + my ($res, $redmine_pass) = $r->get_basic_auth_pw(); return $res unless $res == OK; @@ -305,7 +293,6 @@ my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass); - my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config); my $usrprojpass; if ($cfg->{RedmineCacheCredsMax}) { $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id); @@ -378,9 +365,6 @@ } sub connect_database { - my $r = shift; - - my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config); return DBI->connect($cfg->{RedmineDSN}, $cfg->{RedmineDbUser}, $cfg->{RedmineDbPass}); }