@@ -, +, @@ database - Setting a password for a new user - Changing a password in the staff client - Changing a password in the OPAC - Moved the plugin checks to before the call to $self->SUPER::store to make sure patrons are not saved if the password fails a plugin check - Made the plugin checks in set_password respect skip_validation while retaining the functionality for NNPDB --- Koha/Exceptions/Password.pm | 6 +- Koha/Patron.pm | 59 ++++++++++++++++++- .../en/modules/members/member-password.tt | 3 + members/member-password.pl | 3 + 4 files changed, 67 insertions(+), 4 deletions(-) --- a/Koha/Exceptions/Password.pm +++ a/Koha/Exceptions/Password.pm @@ -38,7 +38,11 @@ use Exception::Class ( 'Koha::Exceptions::Password::WhitespaceCharacters' => { isa => 'Koha::Exceptions::Password', description => 'Password contains leading/trailing whitespace character(s)' - } + }, + 'Koha::Exceptions::Password::Plugin' => { + isa => 'Koha::Exceptions::Password', + description => 'The password was rejected by a plugin' + }, ); sub full_message { --- a/Koha/Patron.pm +++ a/Koha/Patron.pm @@ -43,6 +43,8 @@ use Koha::Patron::HouseboundRole; use Koha::Patron::Images; use Koha::Patron::Relationships; use Koha::Patrons; +use Koha::Plugins; +use Koha::Plugins::Handler; use Koha::Subscription::Routinglists; use Koha::Token; use Koha::Virtualshelves; @@ -223,10 +225,35 @@ sub store { : undef; $self->privacy($default_privacy); - # Make a copy of the plain text password for later use $self->plain_text_password( $self->password ); + logaction( "MEMBERS", "CREATE", $self->borrowernumber, "" ) + if C4::Context->preference("BorrowersLog"); + + if ( C4::Context->preference('UseKohaPlugins') && C4::Context->config("enable_plugins") ) { + # Call any check_password plugins + my @plugins = Koha::Plugins->new()->GetPlugins({ + method => 'check_password', + }); + foreach my $plugin ( @plugins ) { + # This plugin hook will also be used by a plugin for the Norwegian national + # patron database. This is why we need to pass both the password and the + # borrowernumber to the plugin. + my $ret = Koha::Plugins::Handler->run({ + class => ref $plugin, + method => 'check_password', + params => { + password => $self->plain_text_password, + borrowernumber => $self->borrowernumber, + }, + }); + if ( $ret->{'error'} == 1 ) { + Koha::Exceptions::Password::Plugin->throw(); + } + } + } + # Create a disabled account if no password provided $self->password( $self->password ? Koha::AuthUtils::hash_password( $self->password ) @@ -238,8 +265,6 @@ sub store { $self->add_enrolment_fee_if_needed(0); - logaction( "MEMBERS", "CREATE", $self->borrowernumber, "" ) - if C4::Context->preference("BorrowersLog"); } else { #ModMember @@ -682,6 +707,8 @@ Exceptions are thrown if the password is not good enough. =item Koha::Exceptions::Password::TooWeak +=item Koha::Exceptions::Password::Plugin (if a "check password" plugin is enabled) + =back =cut @@ -712,6 +739,32 @@ sub set_password { } } + if ( C4::Context->preference('UseKohaPlugins') && C4::Context->config("enable_plugins") ) { + # Call any check_password plugins + my @plugins = Koha::Plugins->new()->GetPlugins({ + method => 'check_password', + }); + foreach my $plugin ( @plugins ) { + # This plugin hook will also be used by a plugin for the Norwegian national + # patron database. This is why we need to pass both the password and the + # borrowernumber to the plugin. + my $ret = Koha::Plugins::Handler->run({ + class => ref $plugin, + method => 'check_password', + params => { + password => $password, + borrowernumber => $self->borrowernumber, + }, + }); + # This plugin hook will also be used by a plugin for the Norwegian national + # patron database. This is why we need to call the actual plugins and then + # check skip_validation afterwards. + if ( $ret->{'error'} == 1 && !$args->{skip_validation} ) { + Koha::Exceptions::Password::Plugin->throw(); + } + } + } + my $digest = Koha::AuthUtils::hash_password($password); $self->update( { password => $digest, --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/member-password.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/member-password.tt @@ -44,6 +44,9 @@ [% END %] [% IF ( ERROR_password_has_whitespaces ) %]
  • Password must not contain leading or trailing whitespaces.
  • + [% END %] + [% IF ( ERROR_from_plugin ) %] +
  • The password was rejected by a plugin.
  • [% END %] [% IF ( NOPERMISSION ) %]
  • You do not have permission to edit this patron's login information.
  • --- a/members/member-password.pl +++ a/members/member-password.pl @@ -91,6 +91,9 @@ if ( $newpassword and not @errors) { elsif ( $_->isa('Koha::Exceptions::Password::TooWeak') ) { push @errors, 'ERROR_password_too_weak'; } + elsif ( $_->isa('Koha::Exceptions::Password::Plugin') ) { + push @errors, 'ERROR_from_plugin'; + } else { push( @errors, 'BADUSERID' ); } --