Koha-clms/misc/admin/reset_2fa.pl

151 lines
4.0 KiB
Perl
Executable File

#!/usr/bin/perl
# This file is part of Koha.
#
# Copyright 2025 Koha Development Team
#
# 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 <https://www.gnu.org/licenses>.
use Modern::Perl;
use Getopt::Long qw( GetOptions );
use Pod::Usage qw( pod2usage );
use Koha::Patrons;
use Koha::Script;
my ( $help, $cardnumber, $patron_id, $userid );
GetOptions(
'help|?' => \$help,
'userid=s' => \$userid,
'patron_id=s' => \$patron_id,
'cardnumber=s' => \$cardnumber,
);
pod2usage(1) if $help;
# Validate that exactly one parameter is provided (mutually exclusive)
my $param_count = grep { defined } ( $userid, $patron_id, $cardnumber );
if ( $param_count == 0 ) {
pod2usage("Error: One of --userid, --patron_id, or --cardnumber is required");
} elsif ( $param_count > 1 ) {
pod2usage("Error: Only one of --userid, --patron_id, or --cardnumber can be specified");
}
# Build search filter based on the provided parameter
my $filter = {};
my $search_type;
if ($userid) {
$filter->{userid} = $userid;
$search_type = "userid '$userid'";
} elsif ($cardnumber) {
$filter->{cardnumber} = $cardnumber;
$search_type = "cardnumber '$cardnumber'";
} elsif ($patron_id) {
$filter->{borrowernumber} = $patron_id;
$search_type = "patron_id '$patron_id'";
}
# Find the patron
my $patrons = Koha::Patrons->search($filter);
unless ( $patrons->count > 0 ) {
say "Error: No patron found with $search_type";
exit 1;
}
my $patron = $patrons->next;
# Check if patron actually has 2FA enabled
unless ( $patron->has_2fa_enabled ) {
say "Patron "
. $patron->cardnumber . " ("
. $patron->firstname . " "
. $patron->surname
. ") does not have 2FA enabled.";
exit 0;
}
# Display patron information and current status
say "Resetting 2FA for patron:";
say " Card number: " . $patron->cardnumber;
say " Name: " . $patron->firstname . " " . $patron->surname;
say " Current auth method: " . ( $patron->auth_method || 'password' );
# Reset 2FA settings using the new method
eval { $patron->reset_2fa; };
if ($@) {
say "Error: Failed to reset 2FA settings: $@";
exit 1;
}
say "Success: 2FA has been reset for patron " . $patron->cardnumber;
=head1 NAME
reset_2fa.pl - Reset the 2FA setting for the Koha user
=head1 SYNOPSIS
reset_2fa.pl --userid <userid>
reset_2fa.pl --patron_id <patron_id>
reset_2fa.pl --cardnumber <cardnumber>
Options:
-?|--help brief help message
--userid the userid to be used to find the patron
--patron_id the borrowernumber for the patron
--cardnumber the cardnumber for the patron
Note: Only one of --userid, --patron_id, or --cardnumber should be specified.
=head1 OPTIONS
=over 8
=item B<--help|-?>
Print a brief help message and exits
=item B<--userid>
The patron's userid (for finding the patron). Mutually exclusive with other options.
=item B<--patron_id>
The patron's internal id (borrowernumber) for finding the patron. Mutually exclusive with other options.
=item B<--cardnumber>
Patron's cardnumber (for finding the patron). Mutually exclusive with other options.
=back
=head1 DESCRIPTION
A simple script to reset an existing user's 2FA authentication settings.
This script will:
- Find the patron using the specified identifier
- Check if the patron has 2FA enabled
- Reset the patron's 2FA setting
The script requires exactly one of the patron identification parameters and will
exit with an error if none or multiple parameters are provided.
=cut