View | Details | Raw Unified | Return to bug 33462
Collapse All | Expand All

(-)a/C4/Auth.pm (+2 lines)
Lines 1320-1325 sub checkauth { Link Here
1320
1320
1321
        track_login_daily( $userid );
1321
        track_login_daily( $userid );
1322
1322
1323
1323
        # In case, that this request was a login attempt, we want to prevent that users can repost the opac login
1324
        # In case, that this request was a login attempt, we want to prevent that users can repost the opac login
1324
        # request. We therefore redirect the user to the requested page again without the login parameters.
1325
        # request. We therefore redirect the user to the requested page again without the login parameters.
1325
        # See Post/Redirect/Get (PRG) design pattern: https://en.wikipedia.org/wiki/Post/Redirect/Get
1326
        # See Post/Redirect/Get (PRG) design pattern: https://en.wikipedia.org/wiki/Post/Redirect/Get
Lines 1389-1394 sub checkauth { Link Here
1389
        opac_css_override                     => $ENV{'OPAC_CSS_OVERRIDE'},
1390
        opac_css_override                     => $ENV{'OPAC_CSS_OVERRIDE'},
1390
        too_many_login_attempts               => ( $patron and $patron->account_locked ),
1391
        too_many_login_attempts               => ( $patron and $patron->account_locked ),
1391
        password_has_expired                  => ( $patron and $patron->password_expired ),
1392
        password_has_expired                  => ( $patron and $patron->password_expired ),
1393
        needs_password_reset                  => ( $patron and $patron->needs_password_reset),
1392
        auth_error                            => $auth_error,
1394
        auth_error                            => $auth_error,
1393
    );
1395
    );
1394
1396
(-)a/Koha/Database/Columns.pm (+1 lines)
Lines 168-173 sub columns { Link Here
168
            "lost"                        => __("Lost card flag"),
168
            "lost"                        => __("Lost card flag"),
169
            "middle_name"                 => __("Middle name"),
169
            "middle_name"                 => __("Middle name"),
170
            "mobile"                      => __("Other phone"),
170
            "mobile"                      => __("Other phone"),
171
            "needs_password_reset"        => __("Needs password reset"),
171
            "opacnote"                    => __("OPAC note"),
172
            "opacnote"                    => __("OPAC note"),
172
            "othernames"                  => __("Other name"),
173
            "othernames"                  => __("Other name"),
173
            "overdrive_auth_token"        => __("Overdrive auth token"),
174
            "overdrive_auth_token"        => __("Overdrive auth token"),
(-)a/Koha/Patron.pm (-3 / +10 lines)
Lines 272-280 sub store { Link Here
272
                # Make a copy of the plain text password for later use
272
                # Make a copy of the plain text password for later use
273
                $self->plain_text_password( $self->password );
273
                $self->plain_text_password( $self->password );
274
274
275
                $self->password_expiration_date( $self->password
275
                if($self->category->effective_force_password_reset_when_set_by_staff and ($self->categorycode ne C4::Context->preference("PatronSelfRegistrationDefaultCategory"))){
276
                    ? $self->category->get_password_expiry_date || undef
276
                    $self->password_expiration_date(dt_from_string);
277
                    : undef );
277
                    $self->needs_password_reset(1);
278
                }
279
                else{
280
                    $self->password_expiration_date( $self->password
281
                        ? $self->category->get_password_expiry_date || undef
282
                        : undef );
283
                }
278
                # Create a disabled account if no password provided
284
                # Create a disabled account if no password provided
279
                $self->password( $self->password
285
                $self->password( $self->password
280
                    ? Koha::AuthUtils::hash_password( $self->password )
286
                    ? Koha::AuthUtils::hash_password( $self->password )
Lines 2159-2164 sub to_api_mapping { Link Here
2159
        altcontactzipcode   => 'altcontact_postal_code',
2165
        altcontactzipcode   => 'altcontact_postal_code',
2160
        password_expiration_date => undef,
2166
        password_expiration_date => undef,
2161
        primary_contact_method => undef,
2167
        primary_contact_method => undef,
2168
        needs_password_reset     => undef,
2162
        secret              => undef,
2169
        secret              => undef,
2163
        auth_method         => undef,
2170
        auth_method         => undef,
2164
    };
2171
    };
(-)a/Koha/Patron/Category.pm (+16 lines)
Lines 187-192 sub effective_require_strong_password { Link Here
187
    return $self->require_strong_password // C4::Context->preference('RequireStrongPassword');
187
    return $self->require_strong_password // C4::Context->preference('RequireStrongPassword');
188
}
188
}
189
189
190
=head3 effective_force_password_reset_when_set_by_staff
191
192
    $category->effective_force_password_reset_when_set_by_staff()
193
194
Returns if new staff created patrons in this category are forced to reset their password. If set in $self->force_password_reset_when_set_by_staff
195
or, if undef, falls back to the ForcePasswordResetWhenSetByStaff system preference.
196
197
=cut
198
199
sub effective_force_password_reset_when_set_by_staff {
200
    my ($self) = @_;
201
202
    return $self->force_password_reset_when_set_by_staff // C4::Context->preference('ForcePasswordResetWhenSetByStaff');
203
}
204
205
190
=head3 override_hidden_items
206
=head3 override_hidden_items
191
207
192
    if ( $patron->category->override_hidden_items ) {
208
    if ( $patron->category->override_hidden_items ) {
(-)a/admin/categories.pl (-21 / +25 lines)
Lines 80-90 elsif ( $op eq 'add_validate' ) { Link Here
80
    my $require_strong_password = $input->param('require_strong_password');
80
    my $require_strong_password = $input->param('require_strong_password');
81
    my @branches = grep { $_ ne q{} } $input->multi_param('branches');
81
    my @branches = grep { $_ ne q{} } $input->multi_param('branches');
82
    my $can_be_guarantee = $input->param('can_be_guarantee');
82
    my $can_be_guarantee = $input->param('can_be_guarantee');
83
    my $force_password_reset_when_set_by_staff = $input->param('force_password_reset_when_set_by_staff');
83
84
84
    $reset_password = undef if $reset_password eq -1;
85
    $reset_password = undef if $reset_password eq -1;
85
    $change_password = undef if $change_password eq -1;
86
    $change_password = undef if $change_password eq -1;
86
    $min_password_length = undef unless length($min_password_length);
87
    $min_password_length = undef unless length($min_password_length);
87
    $require_strong_password = undef if $require_strong_password eq -1;
88
    $require_strong_password = undef if $require_strong_password eq -1;
89
    $force_password_reset_when_set_by_staff = undef if $force_password_reset_when_set_by_staff eq -1;
88
90
89
    my $is_a_modif = $input->param("is_a_modif");
91
    my $is_a_modif = $input->param("is_a_modif");
90
92
Lines 111-116 elsif ( $op eq 'add_validate' ) { Link Here
111
        $category->exclude_from_local_holds_priority($exclude_from_local_holds_priority);
113
        $category->exclude_from_local_holds_priority($exclude_from_local_holds_priority);
112
        $category->min_password_length($min_password_length);
114
        $category->min_password_length($min_password_length);
113
        $category->require_strong_password($require_strong_password);
115
        $category->require_strong_password($require_strong_password);
116
        $category->force_password_reset_when_set_by_staff($force_password_reset_when_set_by_staff);
114
        eval {
117
        eval {
115
            $category->store;
118
            $category->store;
116
            $category->replace_library_limits( \@branches );
119
            $category->replace_library_limits( \@branches );
Lines 123-149 elsif ( $op eq 'add_validate' ) { Link Here
123
    }
126
    }
124
    else {
127
    else {
125
        my $category = Koha::Patron::Category->new({
128
        my $category = Koha::Patron::Category->new({
126
            categorycode => $categorycode,
129
            categorycode                           => $categorycode,
127
            description => $description,
130
            description                            => $description,
128
            enrolmentperiod => $enrolmentperiod,
131
            enrolmentperiod                        => $enrolmentperiod,
129
            enrolmentperioddate => $enrolmentperioddate,
132
            enrolmentperioddate                    => $enrolmentperioddate,
130
            password_expiry_days => $password_expiry_days,
133
            password_expiry_days                   => $password_expiry_days,
131
            upperagelimit => $upperagelimit,
134
            upperagelimit                          => $upperagelimit,
132
            dateofbirthrequired => $dateofbirthrequired,
135
            dateofbirthrequired                    => $dateofbirthrequired,
133
            enrolmentfee => $enrolmentfee,
136
            enrolmentfee                           => $enrolmentfee,
134
            reservefee => $reservefee,
137
            reservefee                             => $reservefee,
135
            hidelostitems => $hidelostitems,
138
            hidelostitems                          => $hidelostitems,
136
            overduenoticerequired => $overduenoticerequired,
139
            overduenoticerequired                  => $overduenoticerequired,
137
            category_type => $category_type,
140
            category_type                          => $category_type,
138
            can_be_guarantee => $can_be_guarantee,
141
            can_be_guarantee                       => $can_be_guarantee,
139
            BlockExpiredPatronOpacActions => $BlockExpiredPatronOpacActions,
142
            BlockExpiredPatronOpacActions          => $BlockExpiredPatronOpacActions,
140
            checkprevcheckout => $checkPrevCheckout,
143
            checkprevcheckout                      => $checkPrevCheckout,
141
            default_privacy => $default_privacy,
144
            default_privacy                        => $default_privacy,
142
            reset_password => $reset_password,
145
            reset_password                         => $reset_password,
143
            change_password => $change_password,
146
            change_password                        => $change_password,
144
            exclude_from_local_holds_priority => $exclude_from_local_holds_priority,
147
            exclude_from_local_holds_priority      => $exclude_from_local_holds_priority,
145
            min_password_length => $min_password_length,
148
            min_password_length                    => $min_password_length,
146
            require_strong_password => $require_strong_password,
149
            require_strong_password                => $require_strong_password,
150
            force_password_reset_when_set_by_staff => $force_password_reset_when_set_by_staff,
147
        });
151
        });
148
        eval {
152
        eval {
149
            $category->store;
153
            $category->store;
(-)a/installer/data/mysql/atomicupdate/bug_33462.pl (+36 lines)
Line 0 Link Here
1
use Modern::Perl;
2
3
return {
4
    bug_number => "33462",
5
    description => "Force password reset for new patrons entered by staff",
6
    up => sub {
7
        my ($args) = @_;
8
        my ($dbh, $out) = @$args{qw(dbh out)};
9
        $dbh->do(q{
10
        INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` )
11
VALUES ('ForcePasswordResetWhenSetByStaff', '0', NULL,'Force a staff created patron account to reset its password after its first OPAC login.', 'YesNo')
12
        });
13
        say $out "Added new system preference 'ForcePasswordResetWhenSetByStaff'";
14
15
        if( !column_exists( 'categories', 'force_password_reset_when_set_by_staff' ) ) {
16
            $dbh->do("ALTER TABLE categories ADD COLUMN `force_password_reset_when_set_by_staff` TINYINT(1) NULL DEFAULT NULL AFTER `require_strong_password` -- if patrons of this category are required to reset password after being created by a staff member");
17
        }
18
        say $out "Added column to categories 'force_password_reset_when_set_by_staff'";
19
20
        if( !column_exists( 'borrowers', 'needs_password_reset' ) ) {
21
            $dbh->do("ALTER TABLE borrowers ADD COLUMN `needs_password_reset` TINYINT(1) NULL DEFAULT NULL AFTER `primary_contact_method` -- tracks if a patron needs to reset their password after account creation");
22
        }
23
        say $out "Added column to borrowers 'needs_password_reset'";
24
25
        if( !column_exists( 'borrower_modifications', 'needs_password_reset' ) ) {
26
            $dbh->do("ALTER TABLE borrower_modifications ADD COLUMN `needs_password_reset` TINYINT(1) NULL DEFAULT NULL AFTER `primary_contact_method` -- tracks if a patron needs to reset their password after account creation");
27
        }
28
        say $out "Added column to borrower_modifications 'needs_password_reset'";
29
30
        if( !column_exists( 'deletedborrowers', 'needs_password_reset' ) ) {
31
            $dbh->do("ALTER TABLE deletedborrowers ADD COLUMN `needs_password_reset` TINYINT(1) NULL DEFAULT NULL AFTER `primary_contact_method` -- tracks if a patron needs to reset their password after account creation");
32
        }
33
        say $out "Added column to deletedborrowers 'needs_password_reset'";
34
35
    },
36
};
(-)a/installer/data/mysql/kohastructure.sql (+4 lines)
Lines 1410-1415 CREATE TABLE `borrower_modifications` ( Link Here
1410
  `extended_attributes` mediumtext DEFAULT NULL,
1410
  `extended_attributes` mediumtext DEFAULT NULL,
1411
  `gdpr_proc_consent` datetime DEFAULT NULL COMMENT 'data processing consent',
1411
  `gdpr_proc_consent` datetime DEFAULT NULL COMMENT 'data processing consent',
1412
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1412
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1413
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
1413
  PRIMARY KEY (`verification_token`(191),`borrowernumber`),
1414
  PRIMARY KEY (`verification_token`(191),`borrowernumber`),
1414
  KEY `verification_token` (`verification_token`(191)),
1415
  KEY `verification_token` (`verification_token`(191)),
1415
  KEY `borrowernumber` (`borrowernumber`)
1416
  KEY `borrowernumber` (`borrowernumber`)
Lines 1542-1547 CREATE TABLE `borrowers` ( Link Here
1542
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
1543
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
1543
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
1544
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
1544
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1545
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1546
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
1545
  PRIMARY KEY (`borrowernumber`),
1547
  PRIMARY KEY (`borrowernumber`),
1546
  UNIQUE KEY `cardnumber` (`cardnumber`),
1548
  UNIQUE KEY `cardnumber` (`cardnumber`),
1547
  UNIQUE KEY `userid` (`userid`),
1549
  UNIQUE KEY `userid` (`userid`),
Lines 1749-1754 CREATE TABLE `categories` ( Link Here
1749
  `min_password_length` smallint(6) DEFAULT NULL COMMENT 'set minimum password length for patrons in this category',
1751
  `min_password_length` smallint(6) DEFAULT NULL COMMENT 'set minimum password length for patrons in this category',
1750
  `require_strong_password` tinyint(1) DEFAULT NULL COMMENT 'set required password strength for patrons in this category',
1752
  `require_strong_password` tinyint(1) DEFAULT NULL COMMENT 'set required password strength for patrons in this category',
1751
  `exclude_from_local_holds_priority` tinyint(1) DEFAULT NULL COMMENT 'Exclude patrons of this category from local holds priority',
1753
  `exclude_from_local_holds_priority` tinyint(1) DEFAULT NULL COMMENT 'Exclude patrons of this category from local holds priority',
1754
  `force_password_reset_when_set_by_staff` tinyint(1) DEFAULT NULL COMMENT 'if patrons of this category are required to reset password after being created by a staff member',
1752
  PRIMARY KEY (`categorycode`),
1755
  PRIMARY KEY (`categorycode`),
1753
  UNIQUE KEY `categorycode` (`categorycode`)
1756
  UNIQUE KEY `categorycode` (`categorycode`)
1754
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1757
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Lines 2669-2674 CREATE TABLE `deletedborrowers` ( Link Here
2669
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
2672
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
2670
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
2673
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
2671
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
2674
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
2675
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
2672
  KEY `borrowernumber` (`borrowernumber`),
2676
  KEY `borrowernumber` (`borrowernumber`),
2673
  KEY `cardnumber` (`cardnumber`),
2677
  KEY `cardnumber` (`cardnumber`),
2674
  KEY `sms_provider_id` (`sms_provider_id`)
2678
  KEY `sms_provider_id` (`sms_provider_id`)
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+1 lines)
Lines 255-260 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
255
('FinesIncludeGracePeriod','1',NULL,'If enabled, fines calculations will include the grace period.','YesNo'),
255
('FinesIncludeGracePeriod','1',NULL,'If enabled, fines calculations will include the grace period.','YesNo'),
256
('FinesLog','1',NULL,'If ON, log fines','YesNo'),
256
('FinesLog','1',NULL,'If ON, log fines','YesNo'),
257
('finesMode','off','off|production','Choose the fines mode, \'off\' (no charges), \'production\' (accrue overdue fines).  Requires accruefines cronjob.','Choice'),
257
('finesMode','off','off|production','Choose the fines mode, \'off\' (no charges), \'production\' (accrue overdue fines).  Requires accruefines cronjob.','Choice'),
258
('ForcePasswordResetWhenSetByStaff','0', NULL, 'Forces a staff created patron account to reset its password after its first OPAC login.','YesNo'),
258
('FRBRizeEditions','0','','If ON, Koha will query one or more ISBN web services for associated ISBNs and display an Editions tab on the details pages','YesNo'),
259
('FRBRizeEditions','0','','If ON, Koha will query one or more ISBN web services for associated ISBNs and display an Editions tab on the details pages','YesNo'),
259
('GenerateAuthorityField667', 'Machine generated authority record', NULL, 'When BiblioAddsAuthorities and AutoCreateAuthorities are enabled, use this as a default value for the 667$a field of MARC21 records', 'free'),
260
('GenerateAuthorityField667', 'Machine generated authority record', NULL, 'When BiblioAddsAuthorities and AutoCreateAuthorities are enabled, use this as a default value for the 667$a field of MARC21 records', 'free'),
260
('GenerateAuthorityField670', 'Work cat.', NULL, 'When BiblioAddsAuthorities and AutoCreateAuthorities are enabled, use this as a default value for the 670$a field of MARC21 records', 'free'),
261
('GenerateAuthorityField670', 'Work cat.', NULL, 'When BiblioAddsAuthorities and AutoCreateAuthorities are enabled, use this as a default value for the 670$a field of MARC21 records', 'free'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/categories.tt (+35 lines)
Lines 337-342 Link Here
337
                      [% END %]
337
                      [% END %]
338
                    </select>
338
                    </select>
339
                </li>
339
                </li>
340
                <li>
341
                    <label for="force_password_reset_when_set_by_staff">Force new patron password reset: </label>
342
                    <select name="force_password_reset_when_set_by_staff" id="force_password_reset_when_set_by_staff">
343
                      [% IF category.force_password_reset_when_set_by_staff.defined %]
344
                        [% IF category.force_password_reset_when_set_by_staff %]
345
                          [% IF Koha.Preference('ForcePasswordResetWhenSetByStaff') %]
346
                            <option value="-1">Follow system preference ForcePasswordResetWhenSetByStaff (Force)</option>
347
                          [% ELSE %]
348
                            <option value="-1">Follow system preference ForcePasswordResetWhenSetByStaff (Don't force)</option>
349
                          [% END %]
350
                            <option value="1" selected="selected">Force</option>
351
                            <option value="0">Don't force</option>
352
                        [% ELSE %]
353
                          [% IF Koha.Preference('ForcePasswordResetWhenSetByStaff') %]
354
                            <option value="-1">Follow system preference ForcePasswordResetWhenSetByStaff (Force)</option>
355
                          [% ELSE %]
356
                            <option value="-1">Follow system preference ForcePasswordResetWhenSetByStaff (Don't force)</option>
357
                          [% END %]
358
                            <option value="1">Force</option>
359
                            <option value="0" selected="selected">Don't force</option>
360
                        [% END %]
361
                      [% ELSE %]
362
                          [% IF Koha.Preference('ForcePasswordResetWhenSetByStaff') %]
363
                            <option value="-1" selected="selected">Follow system preference ForcePasswordResetWhenSetByStaff (Force)</option>
364
                          [% ELSE %]
365
                            <option value="-1" selected="selected">Follow system preference ForcePasswordResetWhenSetByStaff (Don't force)</option>
366
                          [% END %]
367
                            <option value="1">Force</option>
368
                            <option value="0">Don't force</option>
369
                      [% END %]
370
                    </select>
371
                    <div class="hint">
372
                        Choose whether staff created patrons of this category be forced into resetting their password after their first OPAC login.
373
                    </div>
374
                </li>
340
                <li><label for="block_expired">Block expired patrons:</label>
375
                <li><label for="block_expired">Block expired patrons:</label>
341
                    <select name="BlockExpiredPatronOpacActions" id="block_expired">
376
                    <select name="BlockExpiredPatronOpacActions" id="block_expired">
342
                        [% IF not category or category.BlockExpiredPatronOpacActions == -1%]
377
                        [% IF not category or category.BlockExpiredPatronOpacActions == -1%]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref (+6 lines)
Lines 414-419 Patrons: Link Here
414
         - pref: FailedLoginAttempts
414
         - pref: FailedLoginAttempts
415
           class: integer
415
           class: integer
416
         - failed login attempts.
416
         - failed login attempts.
417
     -
418
         - pref: ForcePasswordResetWhenSetByStaff
419
           choices:
420
               1: "Force"
421
               0: "Don't force"
422
         - a staff created patron account to reset its password after its first OPAC login.
417
     -
423
     -
418
         - pref: Pseudonymization
424
         - pref: Pseudonymization
419
           choices:
425
           choices:
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth.tt (-3 / +9 lines)
Lines 194-202 Link Here
194
                        [% END # /UNLESS OPACShibOnly %]
194
                        [% END # /UNLESS OPACShibOnly %]
195
195
196
                        [% IF !(invalid_username_or_password || too_many_login_attempts) and password_has_expired %]
196
                        [% IF !(invalid_username_or_password || too_many_login_attempts) and password_has_expired %]
197
                            <div class="alert alert-info">
197
                            [% IF needs_password_reset %]
198
                                <p><strong>Error: </strong>Your password has expired!</p>
198
                                 <div class="alert alert-info">
199
                            </div>
199
                                     <p><strong>Error: </strong>It's your first login! You need to reset your password.</p>
200
                                 </div>
201
                            [% ELSE %]
202
                                <div class="alert alert-info">
203
                                    <p><strong>Error: </strong>Your password has expired!</p>
204
                                </div>
205
                            [% END %]
200
                            [% IF Koha.Preference('EnableExpiredPasswordReset') %]
206
                            [% IF Koha.Preference('EnableExpiredPasswordReset') %]
201
                                <a href="/cgi-bin/koha/opac-reset-password.pl">Reset your password</a>.
207
                                <a href="/cgi-bin/koha/opac-reset-password.pl">Reset your password</a>.
202
                            [% ELSIF Koha.Preference('OpacPasswordChange') && Categories.can_any_reset_password %]
208
                            [% ELSIF Koha.Preference('OpacPasswordChange') && Categories.can_any_reset_password %]
(-)a/opac/opac-reset-password.pl (-1 / +1 lines)
Lines 79-84 if ( $op eq 'update' ) { Link Here
79
                            'Koha::Exceptions::Password::WhitespaceCharacters');
79
                            'Koha::Exceptions::Password::WhitespaceCharacters');
80
                        $template->param( 'error' => $error );
80
                        $template->param( 'error' => $error );
81
                    };
81
                    };
82
                    $patron->needs_password_reset(0)->store;
82
                }
83
                }
83
            }
84
            }
84
            else {
85
            else {
85
- 

Return to bug 33462