use C4::Members;
use C4::Members::Attributes qw( GetBorrowerAttributes );
use C4::Form::MessagingPreferences;
+use Koha::AuthUtils;
+use Koha::Patrons;
+use Koha::Patron::Modification;
+use Koha::Patron::Modifications;
use C4::Scrubber;
use Email::Valid;
use Koha::DateUtils;
$verification_token = md5_hex( time().{}.rand().{}.$$ );
}
- $borrower{password} = random_string("..........");
+ $borrower{password} = Koha::AuthUtils::generate_password unless $borrower{password};
$borrower{verification_token} = $verification_token;
Koha::Patron::Modification->new( \%borrower )->store();
my $letter = C4::Letters::GetPreparedLetter(
module => 'members',
letter_code => 'OPAC_REG_VERIFY',
+ lang => 'default', # Patron does not have a preferred language defined yet
tables => {
borrower_modifications => $verification_token,
},
$template->param( OpacPasswordChange =>
C4::Context->preference('OpacPasswordChange') );
- my ( $borrowernumber, $password ) = AddMember_Opac(%borrower);
- C4::Members::Attributes::SetBorrowerAttributes( $borrowernumber, $attributes );
- C4::Form::MessagingPreferences::handle_form_action($cgi, { borrowernumber => $borrowernumber }, $template, 1, C4::Context->preference('PatronSelfRegistrationDefaultCategory') ) if $borrowernumber && C4::Context->preference('EnhancedMessagingPreferences');
+ $borrower{categorycode} ||= C4::Context->preference('PatronSelfRegistrationDefaultCategory');
+ $borrower{password} ||= Koha::AuthUtils::generate_password;
+ my $patron = Koha::Patron->new( \%borrower )->store;
+ if ( $patron ) {
+ C4::Members::Attributes::SetBorrowerAttributes( $patron->borrowernumber, $attributes );
+ if ( C4::Context->preference('EnhancedMessagingPreferences') ) {
+ C4::Form::MessagingPreferences::handle_form_action(
+ $cgi,
+ { borrowernumber => $patron->borrowernumber },
+ $template,
+ 1,
+ C4::Context->preference('PatronSelfRegistrationDefaultCategory')
+ );
+ }
- $template->param( password_cleartext => $password );
- $template->param(
- borrower => GetMember( borrowernumber => $borrowernumber ) );
+ $template->param( password_cleartext => $patron->plain_text_password );
+ $template->param( borrower => $patron->unblessed );
+ } else {
+ # FIXME Handle possible errors here
+ }
$template->param(
PatronSelfRegistrationAdditionalInstructions =>
C4::Context->preference(
}
elsif ( $action eq 'update' ) {
- my $borrower = GetMember( borrowernumber => $borrowernumber );
+ my $borrower = Koha::Patrons->find( $borrowernumber )->unblessed;
die "Wrong CSRF token"
unless Koha::Token->new->check_csrf({
session_id => scalar $cgi->cookie('CGISESSID'),
});
my %borrower = ParseCgiForBorrower($cgi);
+ $borrower{borrowernumber} = $borrowernumber;
my %borrower_changes = DelEmptyFields(%borrower);
my @empty_mandatory_fields =
$borrower_changes{borrowernumber} = $borrowernumber;
$borrower_changes{extended_attributes} = to_json($extended_attributes_changes);
- # FIXME update the following with
- # Koha::Patron::Modifications->search({ borrowernumber => $borrowernumber })->delete;
- # when bug 17091 will be pushed
- my $patron_modifications = Koha::Patron::Modifications->search({ borrowernumber => $borrowernumber });
- while ( my $patron_modification = $patron_modifications->next ) {
- $patron_modification->delete;
- }
+ Koha::Patron::Modifications->search({ borrowernumber => $borrowernumber })->delete;
my $m = Koha::Patron::Modification->new( \%borrower_changes )->store();
- $template->param(
- borrower => GetMember( borrowernumber => $borrowernumber ),
- );
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ $template->param( borrower => $patron->unblessed );
}
else {
+ my $patron = Koha::Patrons->find( $borrowernumber );
$template->param(
action => 'edit',
nochanges => 1,
- borrower => GetMember( borrowernumber => $borrowernumber ),
+ borrower => $patron->unblessed,
patron_attribute_classes => GeneratePatronAttributesForm( $borrowernumber, $attributes ),
csrf_token => Koha::Token->new->generate_csrf({
session_id => scalar $cgi->cookie('CGISESSID'),
}
}
elsif ( $action eq 'edit' ) { #Display logged in borrower's data
- my $borrower = GetMember( borrowernumber => $borrowernumber );
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ my $borrower = $patron->unblessed;
$template->param(
borrower => $borrower,
);
if (C4::Context->preference('OPACpatronimages')) {
- my $patron_image = Koha::Patron::Images->find($borrower->{borrowernumber});
- $template->param( display_patron_image => 1 ) if $patron_image;
+ $template->param( display_patron_image => 1 ) if $patron->image;
}
$template->param( patron_attribute_classes => GeneratePatronAttributesForm( $borrowernumber ) );
}
sub CheckForInvalidFields {
- my $minpw = C4::Context->preference('minPasswordLength');
my $borrower = shift;
my @invalidFields;
if ($borrower->{'email'}) {
unless ( Email::Valid->address($borrower->{'email'}) ) {
push(@invalidFields, "email");
} elsif ( C4::Context->preference("PatronSelfRegistrationEmailMustBeUnique") ) {
- my $patrons_with_same_email = Koha::Patrons->search( { email => $borrower->{email} })->count;
+ my $patrons_with_same_email = Koha::Patrons->search( # FIXME Should be search_limited?
+ {
+ email => $borrower->{email},
+ (
+ exists $borrower->{borrowernumber}
+ ? ( borrowernumber =>
+ { '!=' => $borrower->{borrowernumber} } )
+ : ()
+ )
+ }
+ )->count;
if ( $patrons_with_same_email ) {
push @invalidFields, "duplicate_email";
}
{
push( @invalidFields, "password_match" );
}
- if ( $borrower->{'password'} && $minpw && (length($borrower->{'password'}) < $minpw) ) {
- push(@invalidFields, "password_invalid");
- }
if ( $borrower->{'password'} ) {
- push(@invalidFields, "password_spaces") if ($borrower->{'password'} =~ /^\s/ or $borrower->{'password'} =~ /\s$/);
+ my ( $is_valid, $error ) = Koha::AuthUtils::is_password_valid( $borrower->{password} );
+ unless ( $is_valid ) {
+ push @invalidFields, 'password_too_short' if $error eq 'too_short';
+ push @invalidFields, 'password_too_weak' if $error eq 'too_weak';
+ push @invalidFields, 'password_has_whitespaces' if $error eq 'has_whitespaces';
+ }
}
return \@invalidFields;
my $scrubber = C4::Scrubber->new();
my %borrower;
- foreach ( $cgi->param ) {
- if ( $_ =~ '^borrower_' ) {
- my ($key) = substr( $_, 9 );
- $borrower{$key} = $scrubber->scrub( scalar $cgi->param($_) );
+ foreach my $field ( $cgi->param ) {
+ if ( $field =~ '^borrower_' ) {
+ my ($key) = substr( $field, 9 );
+ if ( $field !~ '^borrower_password' ) {
+ $borrower{$key} = $scrubber->scrub( scalar $cgi->param($field) );
+ } else {
+ # Allow html characters for passwords
+ $borrower{$key} = $cgi->param($field);
+ }
}
}
sub DelUnchangedFields {
my ( $borrowernumber, %new_data ) = @_;
- my $current_data = GetMember( borrowernumber => $borrowernumber );
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ my $current_data = $patron->unblessed;
foreach my $key ( keys %new_data ) {
if ( $current_data->{$key} eq $new_data{$key} ) {