From d76cd8a63946572508f4a7d8b8ee8d06c63ddb09 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 31 Oct 2016 11:15:02 +0000 Subject: [PATCH] Bug 17494: Prevent duplicate tokens from getting stored Signed-off-by: Jonathan Druart Signed-off-by: Tomas Cohen Arazi Signed-off-by: Mason James --- Koha/AudioAlert.pm | 21 +++++++++++++++++++- Koha/Exceptions/Patron/Modification.pm | 12 +++++++++++ opac/opac-memberentry.pl | 5 +++++ t/db_dependent/Koha_borrower_modifications.t | 20 +++++++++++++++++-- 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 Koha/Exceptions/Patron/Modification.pm diff --git a/Koha/AudioAlert.pm b/Koha/AudioAlert.pm index e23e46b534..d86d9a17f0 100644 --- a/Koha/AudioAlert.pm +++ b/Koha/AudioAlert.pm @@ -23,6 +23,9 @@ use Carp; use Koha::Database; +use Koha::Patron::Modifications; +use Koha::Exceptions::Patron::Modification; + use base qw(Koha::Object); =head1 NAME @@ -31,7 +34,23 @@ Koha::AudioAlert - Koha Audio Alert object class =head1 API -=head2 Class Methods +=head2 store + +=cut + +sub store { + my ($self) = @_; + + if ( $self->verification_token ) { + if ( Koha::Patron::Modifications->search( { verification_token => $self->verification_token } )->count() ) { + Koha::Exceptions::Koha::Patron::Modification::DuplicateVerificationToken->throw; + } + } + + return $self->SUPER::store(); +} + +=head2 approve =head3 store diff --git a/Koha/Exceptions/Patron/Modification.pm b/Koha/Exceptions/Patron/Modification.pm new file mode 100644 index 0000000000..1068fbb549 --- /dev/null +++ b/Koha/Exceptions/Patron/Modification.pm @@ -0,0 +1,12 @@ +package Koha::Exceptions::Patron::Modification; + +use Modern::Perl; + +use Exception::Class ( + 'Koha::Exceptions::Koha::Patron::Modification::DuplicateVerificationToken' => { + isa => 'Koha::Exceptions::Object', + description => "The verification token given already exists", + }, +); + +1; diff --git a/opac/opac-memberentry.pl b/opac/opac-memberentry.pl index 633ad048aa..bfde46398b 100755 --- a/opac/opac-memberentry.pl +++ b/opac/opac-memberentry.pl @@ -124,6 +124,11 @@ if ( $action eq 'create' ) { $template->param( 'email' => $borrower{'email'} ); my $verification_token = md5_hex( time().{}.rand().{}.$$ ); + + while ( Koha::Patron::Modifications->search( { verification_token => $verification_token } )->count() ) { + $verification_token = md5_hex( time().{}.rand().{}.$$ ); + } + $borrower{'password'} = random_string(".........."); Koha::Patron::Modifications->new( diff --git a/t/db_dependent/Koha_borrower_modifications.t b/t/db_dependent/Koha_borrower_modifications.t index f98dfebb41..4d5daf8502 100755 --- a/t/db_dependent/Koha_borrower_modifications.t +++ b/t/db_dependent/Koha_borrower_modifications.t @@ -1,10 +1,12 @@ #!/usr/bin/perl use Modern::Perl; -use Test::More tests => 14; +use Test::More tests => 15; +use Try::Tiny; -use C4::Context; use t::lib::TestBuilder; + +use C4::Context; use C4::Members; use Koha::Patron::Modifications; @@ -19,6 +21,20 @@ $dbh->do("DELETE FROM borrower_modifications"); Koha::Patron::Modifications->new( verification_token => '1234567890' ) ->AddModifications( { surname => 'Hall', firstname => 'Kyle' } ); +## Ensure duplicate verification tokens cannot be added to the database +try { + Koha::Patron::Modification->new( + { + verification_token => '1234567890', + surname => 'Hall', + firstname => 'Daria' + } + )->store(); +} catch { + ok( $_->isa('Koha::Exceptions::Koha::Patron::Modification::DuplicateVerificationToken'), + 'Attempting to add a duplicate verification token to the database should raise a Koha::Exceptions::Koha::Patron::Modification::DuplicateVerificationToken exception' ); +}; + ## Get the new pending modification my $borrower = Koha::Patron::Modifications->GetModifications( { verification_token => '1234567890' } ); -- 2.39.5