← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
  Run on Tue Oct 15 17:10:45 2013
Reported on Tue Oct 15 17:11:23 2013

Filename/usr/share/koha/lib/C4/Auth_with_cas.pm
StatementsExecuted 41 statements in 1.96ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1112.66ms38.4msC4::Auth_with_cas::::BEGIN@26C4::Auth_with_cas::BEGIN@26
1111.01ms1.69msC4::Auth_with_cas::::BEGIN@28C4::Auth_with_cas::BEGIN@28
111652µs1.09msC4::Auth_with_cas::::BEGIN@25C4::Auth_with_cas::BEGIN@25
11165µs73µsC4::Auth_with_cas::::BEGIN@20C4::Auth_with_cas::BEGIN@20
11143µs78µsC4::Auth_with_cas::::BEGIN@27C4::Auth_with_cas::BEGIN@27
11120µs58µsC4::Auth_with_cas::::BEGIN@21C4::Auth_with_cas::BEGIN@21
11117µs17µsC4::Auth_with_cas::::BEGIN@33C4::Auth_with_cas::BEGIN@33
11115µs19µsC4::Auth_with_cas::::BEGIN@24C4::Auth_with_cas::BEGIN@24
11115µs174µsC4::Auth_with_cas::::BEGIN@23C4::Auth_with_cas::BEGIN@23
11113µs166µsC4::Auth_with_cas::::BEGIN@31C4::Auth_with_cas::BEGIN@31
1119µs16µsC4::Auth_with_cas::::multipleAuthC4::Auth_with_cas::multipleAuth
1117µs7µsC4::Auth_with_cas::::CORE:ftisC4::Auth_with_cas::CORE:ftis (opcode)
0000s0sC4::Auth_with_cas::::check_api_auth_casC4::Auth_with_cas::check_api_auth_cas
0000s0sC4::Auth_with_cas::::checkpw_casC4::Auth_with_cas::checkpw_cas
0000s0sC4::Auth_with_cas::::getMultipleAuthC4::Auth_with_cas::getMultipleAuth
0000s0sC4::Auth_with_cas::::login_casC4::Auth_with_cas::login_cas
0000s0sC4::Auth_with_cas::::login_cas_urlC4::Auth_with_cas::login_cas_url
0000s0sC4::Auth_with_cas::::logout_casC4::Auth_with_cas::logout_cas
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package C4::Auth_with_cas;
2
3# Copyright 2009 BibLibre SARL
4#
5# This file is part of Koha.
6#
7# Koha is free software; you can redistribute it and/or modify it under the
8# terms of the GNU General Public License as published by the Free Software
9# Foundation; either version 2 of the License, or (at your option) any later
10# version.
11#
12# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License along
17# with Koha; if not, write to the Free Software Foundation, Inc.,
18# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20346µs280µs
# spent 73µs (65+8) within C4::Auth_with_cas::BEGIN@20 which was called: # once (65µs+8µs) by C4::Auth::BEGIN@39 at line 20
use strict;
# spent 73µs making 1 call to C4::Auth_with_cas::BEGIN@20 # spent 8µs making 1 call to strict::import
21343µs296µs
# spent 58µs (20+38) within C4::Auth_with_cas::BEGIN@21 which was called: # once (20µs+38µs) by C4::Auth::BEGIN@39 at line 21
use warnings;
# spent 58µs making 1 call to C4::Auth_with_cas::BEGIN@21 # spent 38µs making 1 call to warnings::import
22
23353µs2332µs
# spent 174µs (15+159) within C4::Auth_with_cas::BEGIN@23 which was called: # once (15µs+159µs) by C4::Auth::BEGIN@39 at line 23
use C4::Debug;
# spent 174µs making 1 call to C4::Auth_with_cas::BEGIN@23 # spent 159µs making 1 call to Exporter::import
24335µs222µs
# spent 19µs (15+3) within C4::Auth_with_cas::BEGIN@24 which was called: # once (15µs+3µs) by C4::Auth::BEGIN@39 at line 24
use C4::Context;
# spent 19µs making 1 call to C4::Auth_with_cas::BEGIN@24 # spent 3µs making 1 call to C4::Context::import
253160µs21.32ms
# spent 1.09ms (652µs+437µs) within C4::Auth_with_cas::BEGIN@25 which was called: # once (652µs+437µs) by C4::Auth::BEGIN@39 at line 25
use C4::Utils qw( :all );
# spent 1.09ms making 1 call to C4::Auth_with_cas::BEGIN@25 # spent 234µs making 1 call to Exporter::import
263159µs238.4ms
# spent 38.4ms (2.66+35.7) within C4::Auth_with_cas::BEGIN@26 which was called: # once (2.66ms+35.7ms) by C4::Auth::BEGIN@39 at line 26
use Authen::CAS::Client;
# spent 38.4ms making 1 call to C4::Auth_with_cas::BEGIN@26 # spent 4µs making 1 call to UNIVERSAL::import
27352µs2113µs
# spent 78µs (43+35) within C4::Auth_with_cas::BEGIN@27 which was called: # once (43µs+35µs) by C4::Auth::BEGIN@39 at line 27
use CGI;
# spent 78µs making 1 call to C4::Auth_with_cas::BEGIN@27 # spent 35µs making 1 call to CGI::import
283218µs21.71ms
# spent 1.69ms (1.01+679µs) within C4::Auth_with_cas::BEGIN@28 which was called: # once (1.01ms+679µs) by C4::Auth::BEGIN@39 at line 28
use FindBin;
# spent 1.69ms making 1 call to C4::Auth_with_cas::BEGIN@28 # spent 24µs making 1 call to Exporter::import
29
30
31376µs2319µs
# spent 166µs (13+153) within C4::Auth_with_cas::BEGIN@31 which was called: # once (13µs+153µs) by C4::Auth::BEGIN@39 at line 31
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug);
# spent 166µs making 1 call to C4::Auth_with_cas::BEGIN@31 # spent 153µs making 1 call to vars::import
32
33
# spent 17µs within C4::Auth_with_cas::BEGIN@33 which was called: # once (17µs+0s) by C4::Auth::BEGIN@39 at line 39
BEGIN {
34517µs require Exporter;
35 $VERSION = 3.07.00.049; # set the version for version checking
36 $debug = $ENV{DEBUG};
37 @ISA = qw(Exporter);
38 @EXPORT = qw(check_api_auth_cas checkpw_cas login_cas logout_cas login_cas_url);
3911.05ms117µs}
# spent 17µs making 1 call to C4::Auth_with_cas::BEGIN@33
4018µs1686µsmy $context = C4::Context->new() or die 'C4::Context->new failed';
# spent 686µs making 1 call to C4::Context::new
411200nsmy $defaultcasserver;
421200nsmy $casservers;
431500nsmy $yamlauthfile = "../C4/Auth_cas_servers.yaml";
44
45
46# If there's a configuration for multiple cas servers, then we get it
4713µs116µsif (multipleAuth()) {
# spent 16µs making 1 call to C4::Auth_with_cas::multipleAuth
48 ($defaultcasserver, $casservers) = YAML::LoadFile(qq($FindBin::Bin/$yamlauthfile));
49 $defaultcasserver = $defaultcasserver->{'default'};
50} else {
51# Else, we fall back to casServerUrl syspref
521500ns $defaultcasserver = 'default';
5318µs11.95ms $casservers = { 'default' => C4::Context->preference('casServerUrl') };
# spent 1.95ms making 1 call to C4::Context::preference
54}
55
56# Is there a configuration file for multiple cas servers?
57
# spent 16µs (9+7) within C4::Auth_with_cas::multipleAuth which was called: # once (9µs+7µs) by C4::Auth::BEGIN@39 at line 47
sub multipleAuth {
58119µs17µs return (-e qq($FindBin::Bin/$yamlauthfile));
# spent 7µs making 1 call to C4::Auth_with_cas::CORE:ftis
59}
60
61# Returns configured CAS servers' list if multiple authentication is enabled
62sub getMultipleAuth {
63 return $casservers;
64}
65
66# Logout from CAS
67sub logout_cas {
68 my ($query) = @_;
69 my $uri = C4::Context->preference('OPACBaseURL') . $query->script_name();
70 my $casparam = $query->param('cas');
71 # FIXME: This should be more generic and handle whatever parameters there might be
72 $uri .= "?cas=" . $casparam if (defined $casparam);
73 $casparam = $defaultcasserver if (not defined $casparam);
74 my $cas = Authen::CAS::Client->new($casservers->{$casparam});
75 print $query->redirect( $cas->logout_url($uri));
76}
77
78# Login to CAS
79sub login_cas {
80 my ($query) = @_;
81 my $uri = C4::Context->preference('OPACBaseURL') . $query->script_name();
82 my $casparam = $query->param('cas');
83 # FIXME: This should be more generic and handle whatever parameters there might be
84 $uri .= "?cas=" . $casparam if (defined $casparam);
85 $casparam = $defaultcasserver if (not defined $casparam);
86 my $cas = Authen::CAS::Client->new($casservers->{$casparam});
87 print $query->redirect( $cas->login_url($uri));
88}
89
90# Returns CAS login URL with callback to the requesting URL
91sub login_cas_url {
92
93 my ($query, $key) = @_;
94 my $uri = C4::Context->preference('OPACBaseURL') . $query->url( -absolute => 1, -query => 1 );
95 my $casparam = $query->param('cas');
96 $casparam = $defaultcasserver if (not defined $casparam);
97 $casparam = $key if (defined $key);
98 my $cas = Authen::CAS::Client->new($casservers->{$casparam});
99 return $cas->login_url($uri);
100}
101
102# Checks for password correctness
103# In our case : is there a ticket, is it valid and does it match one of our users ?
104sub checkpw_cas {
105 $debug and warn "checkpw_cas";
106 my ($dbh, $ticket, $query) = @_;
107 my $retnumber;
108 my $uri = C4::Context->preference('OPACBaseURL') . $query->script_name();
109 my $casparam = $query->param('cas');
110 # FIXME: This should be more generic and handle whatever parameters there might be
111 $uri .= "?cas=" . $casparam if (defined $casparam);
112 $casparam = $defaultcasserver if (not defined $casparam);
113 my $cas = Authen::CAS::Client->new($casservers->{$casparam});
114
115 # If we got a ticket
116 if ($ticket) {
117 $debug and warn "Got ticket : $ticket";
118
119 # We try to validate it
120 my $val = $cas->service_validate($uri, $ticket );
121
122 # If it's valid
123 if ( $val->is_success() ) {
124
125 my $userid = $val->user();
126 $debug and warn "User CAS authenticated as: $userid";
127
128 # Does it match one of our users ?
129 my $sth = $dbh->prepare("select cardnumber from borrowers where userid=?");
130 $sth->execute($userid);
131 if ( $sth->rows ) {
132 $retnumber = $sth->fetchrow;
133 return ( 1, $retnumber, $userid );
134 }
135 $sth = $dbh->prepare("select userid from borrowers where cardnumber=?");
136 $sth->execute($userid);
137 if ( $sth->rows ) {
138 $retnumber = $sth->fetchrow;
139 return ( 1, $retnumber, $userid );
140 }
141
142 # If we reach this point, then the user is a valid CAS user, but not a Koha user
143 $debug and warn "User $userid is not a valid Koha user";
144
145 } else {
146 $debug and warn "Problem when validating ticket : $ticket";
147 $debug and warn "Authen::CAS::Client::Response::Error: " . $val->error() if $val->is_error();
148 $debug and warn "Authen::CAS::Client::Response::Failure: " . $val->message() if $val->is_failure();
149 $debug and warn Data::Dumper::Dumper($@) if $val->is_error() or $val->is_failure();
150 return 0;
151 }
152 }
153 return 0;
154}
155
156# Proxy CAS auth
157sub check_api_auth_cas {
158 $debug and warn "check_api_auth_cas";
159 my ($dbh, $PT, $query) = @_;
160 my $retnumber;
161 my $url = C4::Context->preference('OPACBaseURL') . $query->script_name();
162
163 my $casparam = $query->param('cas');
164 $casparam = $defaultcasserver if (not defined $casparam);
165 my $cas = Authen::CAS::Client->new($casservers->{$casparam});
166
167 # If we have a Proxy Ticket
168 if ($PT) {
169 my $r = $cas->proxy_validate( $url, $PT );
170
171 # If the PT is valid
172 if ( $r->is_success ) {
173
174 # We've got a username !
175 $debug and warn "User authenticated as: ", $r->user, "\n";
176 $debug and warn "Proxied through:\n";
177 $debug and warn " $_\n" for $r->proxies;
178
179 my $userid = $r->user;
180
181 # Does it match one of our users ?
182 my $sth = $dbh->prepare("select cardnumber from borrowers where userid=?");
183 $sth->execute($userid);
184 if ( $sth->rows ) {
185 $retnumber = $sth->fetchrow;
186 return ( 1, $retnumber, $userid );
187 }
188 $sth = $dbh->prepare("select userid from borrowers where cardnumber=?");
189 return $r->user;
190 $sth->execute($userid);
191 if ( $sth->rows ) {
192 $retnumber = $sth->fetchrow;
193 return ( 1, $retnumber, $userid );
194 }
195
196 # If we reach this point, then the user is a valid CAS user, but not a Koha user
197 $debug and warn "User $userid is not a valid Koha user";
198
199 } else {
200 $debug and warn "Proxy Ticket authentication failed";
201 return 0;
202 }
203 }
204 return 0;
205}
206
207
20819µs1;
209__END__
 
# spent 7µs within C4::Auth_with_cas::CORE:ftis which was called: # once (7µs+0s) by C4::Auth_with_cas::multipleAuth at line 58
sub C4::Auth_with_cas::CORE:ftis; # opcode