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

(-)a/C4/Auth.pm (+2 lines)
Lines 1308-1313 sub checkauth { Link Here
1308
1308
1309
        track_login_daily( $userid );
1309
        track_login_daily( $userid );
1310
1310
1311
1311
        # In case, that this request was a login attempt, we want to prevent that users can repost the opac login
1312
        # In case, that this request was a login attempt, we want to prevent that users can repost the opac login
1312
        # request. We therefore redirect the user to the requested page again without the login parameters.
1313
        # request. We therefore redirect the user to the requested page again without the login parameters.
1313
        # See Post/Redirect/Get (PRG) design pattern: https://en.wikipedia.org/wiki/Post/Redirect/Get
1314
        # See Post/Redirect/Get (PRG) design pattern: https://en.wikipedia.org/wiki/Post/Redirect/Get
Lines 1377-1382 sub checkauth { Link Here
1377
        opac_css_override                     => $ENV{'OPAC_CSS_OVERRIDE'},
1378
        opac_css_override                     => $ENV{'OPAC_CSS_OVERRIDE'},
1378
        too_many_login_attempts               => ( $patron and $patron->account_locked ),
1379
        too_many_login_attempts               => ( $patron and $patron->account_locked ),
1379
        password_has_expired                  => ( $patron and $patron->password_expired ),
1380
        password_has_expired                  => ( $patron and $patron->password_expired ),
1381
        needs_password_reset                  => ( $patron and $patron->needs_password_reset),
1380
        auth_error                            => $auth_error,
1382
        auth_error                            => $auth_error,
1381
    );
1383
    );
1382
1384
(-)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 1391-1396 CREATE TABLE `borrower_modifications` ( Link Here
1391
  `extended_attributes` mediumtext DEFAULT NULL,
1391
  `extended_attributes` mediumtext DEFAULT NULL,
1392
  `gdpr_proc_consent` datetime DEFAULT NULL COMMENT 'data processing consent',
1392
  `gdpr_proc_consent` datetime DEFAULT NULL COMMENT 'data processing consent',
1393
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1393
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1394
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
1394
  PRIMARY KEY (`verification_token`(191),`borrowernumber`),
1395
  PRIMARY KEY (`verification_token`(191),`borrowernumber`),
1395
  KEY `verification_token` (`verification_token`(191)),
1396
  KEY `verification_token` (`verification_token`(191)),
1396
  KEY `borrowernumber` (`borrowernumber`)
1397
  KEY `borrowernumber` (`borrowernumber`)
Lines 1523-1528 CREATE TABLE `borrowers` ( Link Here
1523
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
1524
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
1524
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
1525
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
1525
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1526
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
1527
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
1526
  PRIMARY KEY (`borrowernumber`),
1528
  PRIMARY KEY (`borrowernumber`),
1527
  UNIQUE KEY `cardnumber` (`cardnumber`),
1529
  UNIQUE KEY `cardnumber` (`cardnumber`),
1528
  UNIQUE KEY `userid` (`userid`),
1530
  UNIQUE KEY `userid` (`userid`),
Lines 1730-1735 CREATE TABLE `categories` ( Link Here
1730
  `min_password_length` smallint(6) DEFAULT NULL COMMENT 'set minimum password length for patrons in this category',
1732
  `min_password_length` smallint(6) DEFAULT NULL COMMENT 'set minimum password length for patrons in this category',
1731
  `require_strong_password` tinyint(1) DEFAULT NULL COMMENT 'set required password strength for patrons in this category',
1733
  `require_strong_password` tinyint(1) DEFAULT NULL COMMENT 'set required password strength for patrons in this category',
1732
  `exclude_from_local_holds_priority` tinyint(1) DEFAULT NULL COMMENT 'Exclude patrons of this category from local holds priority',
1734
  `exclude_from_local_holds_priority` tinyint(1) DEFAULT NULL COMMENT 'Exclude patrons of this category from local holds priority',
1735
  `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',
1733
  PRIMARY KEY (`categorycode`),
1736
  PRIMARY KEY (`categorycode`),
1734
  UNIQUE KEY `categorycode` (`categorycode`)
1737
  UNIQUE KEY `categorycode` (`categorycode`)
1735
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1738
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Lines 2650-2655 CREATE TABLE `deletedborrowers` ( Link Here
2650
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
2653
  `anonymized` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'flag for data anonymization',
2651
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
2654
  `autorenew_checkouts` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'flag for allowing auto-renewal',
2652
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
2655
  `primary_contact_method` varchar(45) DEFAULT NULL COMMENT 'useful for reporting purposes',
2656
  `needs_password_reset` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tracks if a patron needs to reset their password after account creation',
2653
  KEY `borrowernumber` (`borrowernumber`),
2657
  KEY `borrowernumber` (`borrowernumber`),
2654
  KEY `cardnumber` (`cardnumber`),
2658
  KEY `cardnumber` (`cardnumber`),
2655
  KEY `sms_provider_id` (`sms_provider_id`)
2659
  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