Nick Clemens
a732138d9d
This patch adds the ability to define password_expiry_days for a patron category. When defined a patron's password will expire after X days and they will be required to reset their password. If OPAC resets are enabled for the catgeory they may do so on their own, otherwise they will need to contact the library To test: 1 - Apply patch, updatedatabase 2 - Set 'Password expiration' for a patron category Home-> Administration-> Patron categories-> Edit 3 - Create a new patron in this category with a userid/password set, and an email 4 - Confirm their password_expiration_date field is set SELECT password_expiration_date FROM borrowers WHERE borrowernumber=51; 5 - Create a new patron, do not set a password 6 - Confirm their password_expiration_date field is NULL 7 - Update the patron with an expiration to be expired UPDATE borrowers SET password_expiration_date='2022-01-01' WHERE borrowernumber=51; 8 - Give the borrower catalogue permission 9 - Attempt to log in to Straff interface 10 - Confirm you are signed out and notified that password must be reset 11 - Attempt to sign in to OPAC 12 - Confirm you are signed out and notified password must be reset 13 - Enable password reset for the patron's category and perform a password reset Note: you will have to find the link in the message_queue unless you have emails setup on your test environment SELECT * FROM message_queue WHERE borrowernumber=51; 14 - Confirm that you can now sign in and password_expiration_date field is set 10 days in the future 15 - Expire the patron's password again 16 - Change the patron's password via the staff interface 17 - Confirm they can sign in and the expiration is updated Signed-off-by: Owen Leonard <oleonard@myacpl.org> Signed-off-by: Bob Bennhoff <bbennhoff@clicweb.org> Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
229 lines
8.2 KiB
Perl
Executable file
229 lines
8.2 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# Copyright 2000-2002 Katipo Communications
|
|
# Copyright 2002 Paul Poulain
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
|
|
use CGI qw ( -utf8 );
|
|
use C4::Context;
|
|
use C4::Auth qw( get_template_and_user );
|
|
use C4::Output qw( output_html_with_http_headers );
|
|
use C4::Form::MessagingPreferences;
|
|
use Koha::Patrons;
|
|
use Koha::Database;
|
|
use Koha::DateUtils qw( dt_from_string output_pref );
|
|
use Koha::Patron::Categories;
|
|
use Koha::Libraries;
|
|
|
|
my $input = CGI->new;
|
|
my $searchfield = $input->param('description') // q||;
|
|
my $categorycode = $input->param('categorycode');
|
|
my $op = $input->param('op') // 'list';
|
|
my @messages;
|
|
|
|
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
|
|
{
|
|
template_name => "admin/categories.tt",
|
|
query => $input,
|
|
type => "intranet",
|
|
flagsrequired => { parameters => 'manage_patron_categories' },
|
|
}
|
|
);
|
|
|
|
if ( $op eq 'add_form' ) {
|
|
|
|
$template->param(
|
|
category => scalar Koha::Patron::Categories->find($categorycode),
|
|
);
|
|
|
|
if ( C4::Context->preference('EnhancedMessagingPreferences') ) {
|
|
C4::Form::MessagingPreferences::set_form_values(
|
|
{ categorycode => $categorycode }, $template );
|
|
}
|
|
}
|
|
elsif ( $op eq 'add_validate' ) {
|
|
|
|
my $categorycode = $input->param('categorycode');
|
|
my $description = $input->param('description');
|
|
my $enrolmentperiod = $input->param('enrolmentperiod');
|
|
my $enrolmentperioddate = $input->param('enrolmentperioddate') || undef;
|
|
my $password_expiry_days = $input->param('password_expiry_days') || undef;
|
|
my $upperagelimit = $input->param('upperagelimit');
|
|
my $dateofbirthrequired = $input->param('dateofbirthrequired');
|
|
my $enrolmentfee = $input->param('enrolmentfee');
|
|
my $reservefee = $input->param('reservefee');
|
|
my $hidelostitems = $input->param('hidelostitems');
|
|
my $overduenoticerequired = $input->param('overduenoticerequired');
|
|
my $category_type = $input->param('category_type');
|
|
my $BlockExpiredPatronOpacActions = $input->param('BlockExpiredPatronOpacActions');
|
|
my $checkPrevCheckout = $input->param('checkprevcheckout');
|
|
my $default_privacy = $input->param('default_privacy');
|
|
my $reset_password = $input->param('reset_password');
|
|
my $change_password = $input->param('change_password');
|
|
my $exclude_from_local_holds_priority = $input->param('exclude_from_local_holds_priority');
|
|
my $min_password_length = $input->param('min_password_length');
|
|
my $require_strong_password = $input->param('require_strong_password');
|
|
my @branches = grep { $_ ne q{} } $input->multi_param('branches');
|
|
|
|
$reset_password = undef if $reset_password eq -1;
|
|
$change_password = undef if $change_password eq -1;
|
|
$min_password_length = undef unless length($min_password_length);
|
|
$require_strong_password = undef if $require_strong_password eq -1;
|
|
|
|
my $is_a_modif = $input->param("is_a_modif");
|
|
|
|
if ($enrolmentperioddate) {
|
|
$enrolmentperioddate = output_pref(
|
|
{
|
|
dt => dt_from_string($enrolmentperioddate),
|
|
dateformat => 'iso',
|
|
dateonly => 1,
|
|
}
|
|
);
|
|
}
|
|
|
|
if ($is_a_modif) {
|
|
my $category = Koha::Patron::Categories->find( $categorycode );
|
|
$category->categorycode($categorycode);
|
|
$category->description($description);
|
|
$category->enrolmentperiod($enrolmentperiod);
|
|
$category->enrolmentperioddate($enrolmentperioddate);
|
|
$category->password_expiry_days($password_expiry_days);
|
|
$category->upperagelimit($upperagelimit);
|
|
$category->dateofbirthrequired($dateofbirthrequired);
|
|
$category->enrolmentfee($enrolmentfee);
|
|
$category->reservefee($reservefee);
|
|
$category->hidelostitems($hidelostitems);
|
|
$category->overduenoticerequired($overduenoticerequired);
|
|
$category->category_type($category_type);
|
|
$category->BlockExpiredPatronOpacActions($BlockExpiredPatronOpacActions);
|
|
$category->checkprevcheckout($checkPrevCheckout);
|
|
$category->default_privacy($default_privacy);
|
|
$category->reset_password($reset_password);
|
|
$category->change_password($change_password);
|
|
$category->exclude_from_local_holds_priority($exclude_from_local_holds_priority);
|
|
$category->min_password_length($min_password_length);
|
|
$category->require_strong_password($require_strong_password);
|
|
eval {
|
|
$category->store;
|
|
$category->replace_library_limits( \@branches );
|
|
};
|
|
if ( $@ ) {
|
|
push @messages, {type => 'error', code => 'error_on_update' };
|
|
} else {
|
|
push @messages, { type => 'message', code => 'success_on_update' };
|
|
}
|
|
}
|
|
else {
|
|
my $category = Koha::Patron::Category->new({
|
|
categorycode => $categorycode,
|
|
description => $description,
|
|
enrolmentperiod => $enrolmentperiod,
|
|
enrolmentperioddate => $enrolmentperioddate,
|
|
password_expiry_days => $password_expiry_days,
|
|
upperagelimit => $upperagelimit,
|
|
dateofbirthrequired => $dateofbirthrequired,
|
|
enrolmentfee => $enrolmentfee,
|
|
reservefee => $reservefee,
|
|
hidelostitems => $hidelostitems,
|
|
overduenoticerequired => $overduenoticerequired,
|
|
category_type => $category_type,
|
|
BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions,
|
|
checkprevcheckout => $checkPrevCheckout,
|
|
default_privacy => $default_privacy,
|
|
reset_password => $reset_password,
|
|
change_password => $change_password,
|
|
exclude_from_local_holds_priority => $exclude_from_local_holds_priority,
|
|
min_password_length => $min_password_length,
|
|
require_strong_password => $require_strong_password,
|
|
});
|
|
eval {
|
|
$category->store;
|
|
$category->replace_library_limits( \@branches );
|
|
};
|
|
|
|
if ( $@ ) {
|
|
push @messages, { type => 'error', code => 'error_on_insert' };
|
|
} else {
|
|
push @messages, { type => 'message', code => 'success_on_insert' };
|
|
}
|
|
}
|
|
|
|
if ( C4::Context->preference('EnhancedMessagingPreferences') ) {
|
|
C4::Form::MessagingPreferences::handle_form_action( $input,
|
|
{ categorycode => scalar $input->param('categorycode') }, $template );
|
|
}
|
|
|
|
$searchfield = q||;
|
|
$op = 'list';
|
|
}
|
|
elsif ( $op eq 'delete_confirm' ) {
|
|
|
|
my $count = Koha::Patrons->search({
|
|
categorycode => $categorycode
|
|
})->count;
|
|
|
|
my $category = Koha::Patron::Categories->find($categorycode);
|
|
|
|
$template->param(
|
|
category => $category,
|
|
patrons_in_category => $count,
|
|
);
|
|
|
|
}
|
|
elsif ( $op eq 'delete_confirmed' ) {
|
|
my $categorycode = uc( $input->param('categorycode') );
|
|
|
|
my $category = Koha::Patron::Categories->find( $categorycode );
|
|
my $deleted = eval { $category->delete; };
|
|
|
|
if ( $@ or not $deleted ) {
|
|
push @messages, {type => 'error', code => 'error_on_delete' };
|
|
} else {
|
|
push @messages, { type => 'message', code => 'success_on_delete' };
|
|
}
|
|
|
|
$op = 'list';
|
|
}
|
|
|
|
if ( $op eq 'list' ) {
|
|
my $categories = Koha::Patron::Categories->search(
|
|
{
|
|
description => { -like => "$searchfield%" }
|
|
},
|
|
{
|
|
order_by => ['category_type', 'description', 'categorycode' ]
|
|
}
|
|
);
|
|
|
|
$template->param(
|
|
categories => $categories,
|
|
)
|
|
}
|
|
|
|
$template->param(
|
|
categorycode => $categorycode,
|
|
searchfield => $searchfield,
|
|
messages => \@messages,
|
|
op => $op,
|
|
);
|
|
|
|
output_html_with_http_headers $input, $cookie, $template->output;
|
|
|
|
exit 0;
|