Bug 21829: Correctly format dateexpiry in notices (date only)
[koha.git] / C4 / Auth_with_cas.pm
index 1459bca..8cc8cde 100644 (file)
@@ -32,10 +32,10 @@ use YAML;
 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug);
 
 BEGIN {
-       require Exporter;
-       $debug = $ENV{DEBUG};
-       @ISA    = qw(Exporter);
-       @EXPORT = qw(check_api_auth_cas checkpw_cas login_cas logout_cas login_cas_url);
+    require Exporter;
+    $debug = $ENV{DEBUG};
+    @ISA   = qw(Exporter);
+    @EXPORT = qw(check_api_auth_cas checkpw_cas login_cas logout_cas login_cas_url logout_if_required);
 }
 my $defaultcasserver;
 my $casservers;
@@ -52,6 +52,10 @@ if (multipleAuth()) {
     $casservers = { 'default' => C4::Context->preference('casServerUrl') };
 }
 
+=head1 Subroutines
+
+=cut
+
 # Is there a configuration file for multiple cas servers?
 sub multipleAuth {
     return (-e qq($yamlauthfile));
@@ -228,21 +232,42 @@ sub _url_with_get_params {
     return $uri_base_part . $uri_params_part;
 }
 
-sub logout_required {
+=head2 logout_if_required
+
+    If using CAS, this subroutine will trigger single-signout of the CAS server.
+
+=cut
+
+sub logout_if_required {
     my ( $query ) = @_;
     # Check we havent been hit by a logout call
     my $xml = $query->param('logoutRequest');
-    if ($xml) {
-        my $dom = XML::LibXML->load_xml(string => $xml);
-        my $ticket;
-        foreach my $node ($dom->findnodes('/samlp:LogoutRequest')){
-            $ticket = $node->findvalue('./samlp:SessionIndex');
+    return 0 unless $xml;
+
+    my $dom = XML::LibXML->load_xml(string => $xml);
+    my $ticket;
+    foreach my $node ($dom->findnodes('/samlp:LogoutRequest')){
+        # We got a cas single logout request from a cas server;
+        $ticket = $node->findvalue('./samlp:SessionIndex');
+    }
+
+    return 0 unless $ticket;
+
+    # We've been called as part of the single logout destroy the session associated with the cas ticket
+    my $params = C4::Auth::_get_session_params();
+    my $success = CGI::Session->find( $params->{dsn}, sub {delete_cas_session(@_, $ticket)}, $params->{dsn_args} );
+
+    sub delete_cas_session {
+        my $session = shift;
+        my $ticket = shift;
+        if ($session->param('cas_ticket') && $session->param('cas_ticket') eq $ticket ) {
+            $session->delete;
+            $session->flush;
         }
-        $query->param(-name =>'logout.x', -value => 1);
-        $query->param(-name =>'cas_ticket', -value => $ticket);
-        return 1;
     }
-    return 0;
+
+    print $query->header;
+    exit;
 }
 
 1;