From 9dc5a53daabc0b7a07430bf0f5ba469d2b4c2e6c Mon Sep 17 00:00:00 2001 From: Matthias Meusburger Date: Tue, 28 Nov 2017 16:01:09 +0000 Subject: [PATCH] Bug 18507: Shibboleth auto-provisioning - Sync 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 Signed-off-by: Marcel de Rooy Comments posted on Bugzilla. Signed-off-by: Nick Clemens --- C4/Auth_with_shibboleth.pm | 20 +++++++++++++++++++- t/Auth_with_shibboleth.t | 21 ++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/C4/Auth_with_shibboleth.pm b/C4/Auth_with_shibboleth.pm index 24246d51ec..bb0a342fd1 100644 --- a/C4/Auth_with_shibboleth.pm +++ b/C4/Auth_with_shibboleth.pm @@ -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://"; diff --git a/t/Auth_with_shibboleth.t b/t/Auth_with_shibboleth.t index 641b77123b..9e96178972 100644 --- a/t/Auth_with_shibboleth.t +++ b/t/Auth_with_shibboleth.t @@ -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' }, -- 2.39.5