Apache2-AuthCASpbh
view release on metacpan or search on metacpan
lib/Apache2/AuthCASpbh/UserAgent.pm view on Meta::CPAN
unless defined($cas_session);
goto NO_SET_COOKIE unless exists($self->{cas_cookie_map});
my $uri = $request->uri;
goto NO_SET_COOKIE unless $uri =~ m#http(?:s)?://([^/]+)(/.*)#;
my ($domain, $path) = ($1, $2);
foreach my $cme (@{$self->{cas_cookie_map}}) {
if ($uri =~ /$cme->{URL_re}/) {
my $url_re = $cme->{URL_re};
$_log->l($debug_level, "$uri matched $url_re");
my $session = open_session($self->{cas_session_db}, $cas_session);
if (ref($session)) {
foreach my $cookie_key (keys %{$session->{cookies}{$url_re}}) {
$cookie_key =~ m#([^/]+)(/.*)#;
my ($cookie_domain, $cookie_path) = ($1, $2);
if ($domain =~ /\Q$cookie_domain\E$/ && $path =~ /^\Q$cookie_path\E/) {
$_log->l($debug_level, "adding $cookie_key");
my @cookie = @{$session->{cookies}{$url_re}{$cookie_key}};
$self->{cookie_jar}->set_cookie(@cookie);
last;
}
}
untie(%{$session});
}
else {
$_log->l('warn', "session tie $cas_session failed - $session");
}
last;
}
}
NO_SET_COOKIE:
my $response = $self->SUPER::request($request, $arg, $size, $previous);
if ($response->code() == 302 && $response->header('Location') =~ $self->{cas_login_url}) {
$_log->l($debug_level, "request redirected to CAS login URL $self->{cas_login_url}");
if (!exists($self->{cas_ua})) {
$self->{cas_ua} = LWP::UserAgent->new(timeout => 10, keep_alive => 1);
}
my $qs = $response->header('Location'); $qs =~ s/^[^\?]+\?//;
my $q = CGI->new($self->{apache_r}, \$qs);
my $service = $q->param('service');
return $_log->l('error', 'no service found in CAS login redirect')
unless defined($service);
my $pgt = $self->{apache_r}->pnotes("cas_pgt");
return $_log->l('error', 'no PGT found for request') unless defined($pgt);
my $proxy_url = $self->{cas_proxy_url} . "?targetService=" .
Apache2::Util::escape_path($service, $self->{apache_r}->pool) .
"&pgt=$pgt";
$_log->l($debug_level, "requesting PT via $proxy_url");
my $response = $self->{cas_ua}->get($proxy_url);
return $_log->l('error', 'PT request failed - ' . $response->status_line())
unless $response->is_success();
my $cas_data = eval { XML::Simple::XMLin($response->content()) };
return $_log->l('error', "PT request xml parse failed - $@") if ($@);
if (exists($cas_data->{'cas:proxySuccess'})) {
my $pt = $cas_data->{'cas:proxySuccess'}{'cas:proxyTicket'};
my $pt_uri = $service . ($service =~ /\?/ ? '&' : '?') . "ticket=$pt";
$request->uri($pt_uri);
$_log->l($debug_level, "resending original request with PT - $pt_uri");
return $self->request($request, $arg, $size, $previous);
}
else {
if (exists($cas_data->{'cas:proxyFailure'})) {
$cas_data->{'cas:proxyFailure'}{content} =~ s/^[\s\n]*//;
$cas_data->{'cas:proxyFailure'}{content} =~ s/[\s\n]*$//;
return $_log->l('error', 'PT request failed - ' .
$cas_data->{'cas:proxyFailure'}{content} . ' (' .
$cas_data->{'cas:proxyFailure'}{code} .')');
}
else {
return $_log->l('error', 'PT request invalid response - ' .
$response->content());
}
}
}
goto NO_STORE_COOKIE unless exists($self->{cas_cookie_map});
my ($url_re, $session_cookie);
foreach my $cme (@{$self->{cas_cookie_map}}) {
my $cookie_name = exists($cme->{cookie_name}) ? $cme->{cookie_name}
: $self->{cas_cookie_name};
$url_re = $cme->{URL_re};
$_log->l($debug_level, "checking $uri against $url_re for cookie $cookie_name");
if ($uri =~ /$url_re/) {
$self->{cookie_jar}->scan(sub {
my @cookie = @_;
if ($cookie[1] eq $cookie_name &&
$cookie[4] =~ /\Q$domain\E$/ &&
$path =~ /^\Q$cookie[3]\E/) {
$_log->l($debug_level, "found $cookie[3] $cookie[1] $cookie[4]");
$session_cookie = \@cookie;
}
});
( run in 3.392 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )