use C4::Members;
use C4::Members::Attributes qw( GetBorrowerAttributes );
use C4::Form::MessagingPreferences;
+use Koha::AuthUtils;
+use Koha::Patrons;
+use Koha::Patron::Consent;
+use Koha::Patron::Modification;
+use Koha::Patron::Modifications;
use C4::Scrubber;
use Email::Valid;
use Koha::DateUtils;
$template->param(
action => $action,
- hidden => GetHiddenFields( $mandatory, 'registration' ),
+ hidden => GetHiddenFields( $mandatory, $action ),
mandatory => $mandatory,
libraries => \@libraries,
OPACPatronDetails => C4::Context->preference('OPACPatronDetails'),
$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();
$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 $consent_dt = delete $borrower{gdpr_proc_consent};
+ my $patron = Koha::Patron->new( \%borrower )->store;
+ Koha::Patron::Consent->new({ borrowernumber => $patron->borrowernumber, type => 'GDPR_PROCESSING', given_on => $consent_dt })->store if $consent_dt;
+ 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 );
- my $patron = Koha::Patrons->find( $borrowernumber );
- $template->param( borrower => $patron->unblessed );
+ $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(
});
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 => $borrower,
guarantor => scalar Koha::Patrons->find($borrowernumber)->guarantor(),
- hidden => GetHiddenFields( $mandatory, 'modification' ),
+ hidden => GetHiddenFields( $mandatory, 'edit' ),
csrf_token => Koha::Token->new->generate_csrf({
session_id => scalar $cgi->cookie('CGISESSID'),
}),
my ( $mandatory, $action ) = @_;
my %hidden_fields;
- my $BorrowerUnwantedField = $action eq 'modification' ?
+ my $BorrowerUnwantedField = $action eq 'edit' || $action eq 'update' ?
C4::Context->preference( "PatronSelfModificationBorrowerUnwantedField" ) :
C4::Context->preference( "PatronSelfRegistrationBorrowerUnwantedField" );
C4::Context->preference("PatronSelfRegistrationBorrowerMandatoryField");
my @fields = split( /\|/, $BorrowerMandatoryField );
+ push @fields, 'gdpr_proc_consent' if C4::Context->preference('GDPR_Policy');
foreach (@fields) {
$mandatory_fields{$_} = 1;
}
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);
+ }
}
}
$borrower{'dateofbirth'} = undef;
}
+ # Replace checkbox 'agreed' by datetime in gdpr_proc_consent
+ $borrower{gdpr_proc_consent} = dt_from_string if $borrower{gdpr_proc_consent} && $borrower{gdpr_proc_consent} eq 'agreed';
+
return %borrower;
}