Bug 18507: Shibboleth auto-provisioning - Sync
authorMatthias Meusburger <matthias.meusburger@biblibre.com>
Tue, 28 Nov 2017 16:01:09 +0000 (16:01 +0000)
committerNick Clemens <nick@bywatersolutions.com>
Thu, 8 Nov 2018 20:43:32 +0000 (20:43 +0000)
This patch allows to update borrowers informations with Shibboleth attributes
upon login.

Test plan:
1. In $KOHA_CONF, check that //shibboleth/sync is set to 1
2. Find an existing user and change one of the values mapped with a Shibboleth attribute
3. Log in using Shibboleth
4. Check that the value has been updated with the Shibboleth attribute.

Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Comments posted on Bugzilla.

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

C4/Auth_with_shibboleth.pm
t/Auth_with_shibboleth.t

index 24246d5..bb0a342 100644 (file)
@@ -27,7 +27,7 @@ use Koha::Patrons;
 use C4::Members::Messaging;
 use Carp;
 use CGI;
-use List::Util qw(any);
+use List::MoreUtils qw(any);
 
 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug);
 
@@ -107,6 +107,9 @@ sub checkpw_shib {
       Koha::Database->new()->schema()->resultset('Borrower')
       ->find( { $config->{matchpoint} => $match } );
     if ( defined($borrower) ) {
+        if ($config->{'sync'}) {
+            _sync($borrower->borrowernumber, $config, $match);
+        }
         return ( 1, $borrower->get_column('cardnumber'), $borrower->get_column('userid') );
     }
 
@@ -138,6 +141,21 @@ sub _autocreate {
     return ( 1, $patron->cardnumber, $patron->userid );
 }
 
+sub _sync {
+    my ($borrowernumber, $config, $match ) = @_;
+    my %borrower;
+    $borrower{'borrowernumber'} = $borrowernumber;
+    while ( my ( $key, $entry ) = each %{$config->{'mapping'}} ) {
+        if ( any { /(^psgi|^plack)/i } keys %ENV ) {
+            $borrower{$key} = ( $entry->{'is'} && $ENV{"HTTP_" . uc($entry->{'is'}) } ) || $entry->{'content'} || '';
+        } else {
+            $borrower{$key} = ( $entry->{'is'} && $ENV{ $entry->{'is'} } ) || $entry->{'content'} || '';
+        }
+    }
+    my $patron = Koha::Patrons->find( $borrowernumber );
+    $patron->set(\%borrower)->store;
+}
+
 sub _get_uri {
 
     my $protocol = "https://";
index 641b771..9e96178 100644 (file)
@@ -43,6 +43,7 @@ use Test::DBIx::Class {
 # Mock Variables
 my $matchpoint = 'userid';
 my $autocreate = 0;
+my $sync = 0;
 my %mapping    = (
     'userid'       => { 'is' => 'uid' },
     'surname'      => { 'is' => 'sn' },
@@ -165,7 +166,7 @@ subtest "get_login_shib tests" => sub {
 
 ## checkpw_shib
 subtest "checkpw_shib tests" => sub {
-    plan tests => 18;
+    plan tests => 21;
 
     my $shib_login;
     my ( $retval, $retcard, $retuserid );
@@ -223,6 +224,22 @@ subtest "checkpw_shib tests" => sub {
       'Found $new_users surname';
     $autocreate = 0;
 
+    # sync user
+    $sync = 1;
+    $ENV{'city'} = 'AnotherCity';
+    warnings_are {
+        ( $retval, $retcard, $retuserid ) = checkpw_shib($shib_login);
+    }
+    [], "good user with sync";
+
+    ok my $sync_user = ResultSet('Borrower')
+      ->search( { 'userid' => 'test4321' }, { rows => 1 } ), "sync user found";
+
+    is_fields [qw/surname dateexpiry address city/], $sync_user->next,
+      [qw/pika 2017 Address AnotherCity/],
+      'Found $sync_user synced city';
+    $sync = 0;
+
     # debug on
     $C4::Auth_with_shibboleth::debug = '1';
 
@@ -315,6 +332,7 @@ sub mockedConfig {
 
     my %shibboleth = (
         'autocreate' => $autocreate,
+        'sync'       => $sync,
         'matchpoint' => $matchpoint,
         'mapping'    => \%mapping
     );
@@ -349,6 +367,7 @@ sub mockedSchema {
 sub reset_config {
     $matchpoint = 'userid';
     $autocreate = 0;
+    $sync = 0;
     %mapping    = (
         'userid'       => { 'is' => 'uid' },
         'surname'      => { 'is' => 'sn' },