Bug 38189

Summary: Odd number of elements in anonymous hash when calling CGI::cookie
Product: Koha Reporter: Marcel de Rooy <m.de.rooy>
Component: Architecture, internals, and plumbingAssignee: Bugs List <koha-bugs>
Status: NEW --- QA Contact: Testopia <testopia>
Severity: normal    
Priority: P5 - low CC: jonathan.druart, martin.renvoize
Version: Main   
Hardware: All   
OS: All   
GIT URL: Change sponsored?: ---
Patch complexity: --- Documentation contact:
Documentation submission: Text to go in the release notes:
Version(s) released in:
Circulation function:

Description Marcel de Rooy 2024-10-17 06:21:30 UTC
Found this warn in moremember on 22.11 (no longer in master):
[2024/10/16 09:57:01] [WARN] Odd number of elements in anonymous hash at /usr/share/koha/members/moremember.pl line 127.
Coming from:
$template->param(     csrf_token => Koha::Token->new->generate_csrf({ session_id => $input->cookie('CGISESSID'),}),   );

Note that CGI::cookie may return an empty list!
From CGI code:
    return () unless $self->{'.cookies'}->{$name};

So we should put a scalar in front of this call to cookie.

But the problem is wider looking at this grep:
git grep -P "CGISESSID['\"]\),"

C4/Auth.pm:                        $in->{query}->cookie("CGISESSID"),
=> From:
                    $sth->execute( $borrowernumber,
                        $in->{query}->cookie("CGISESSID"),
Note that if there would be no cookie, the parameter order will be wrong.

[OK] C4/Output.pm:                    session_id => scalar $query->cookie('CGISESSID'),
acqui/check_uniqueness.pl:    check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } );
=> Wrong. No cookie: wrong order. Etc.

authorities/authorities-home.pl:                sessionid => $query->cookie("CGISESSID"),
authorities/ysearch.pl:my ( $auth_status) = check_cookie_auth( $query->cookie('CGISESSID'), { catalogue => 1 } );
catalogue/image.pl:    check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } );
catalogue/search-history.pl:        sessionid => $cgi->cookie("CGISESSID"),
catalogue/search.pl:                    sessionid => $cgi->cookie("CGISESSID"),
cataloguing/plugin_launcher.pl:    check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } );
cataloguing/ysearch.pl:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { editcatalogue => '*' } );
labels/label-create-csv.pl:    check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } );
labels/label-create-xml.pl:    check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } );
members/two_factor_auth.pl:        session_id => scalar $cgi->cookie('CGISESSID'),
opac/opac-authorities-home.pl:                    sessionid => $query->cookie("CGISESSID"),
opac/opac-search-history.pl:            sessionid => $cgi->cookie("CGISESSID"),
opac/opac-search.pl:                            sessionid  => $cgi->cookie("CGISESSID"),
opac/svc/checkout_notes:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), {} );
plugins/plugins-enable.pl:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { plugins => 'manage' } );
serials/create-numberpattern.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' });
serials/lateissues-export.pl:    check_cookie_auth( $query->cookie('CGISESSID'), { catalogue => 1 } );
serials/subscription-frequency.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' });
serials/subscription-numberpattern.pl:my ($auth_status) = check_cookie_auth($input->cookie('CGISESSID'), { serials => '*' });
svc/article_request:  check_cookie_auth( $cgi->cookie('CGISESSID'), { circulate => 'circulate_remaining_permissions' } );
svc/barcode:my ( $auth_status ) = check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => '*' } );
svc/cataloguing/automatic_linker.pl:  C4::Auth::check_cookie_auth( $input->cookie('CGISESSID'), {
svc/checkin:  check_cookie_auth( $input->cookie('CGISESSID'),
svc/checkout_notes:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), { circulate => 'manage_checkout_notes' } );
svc/club/cancel_enrollment:  check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } );
svc/club/delete:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_clubs' } );
svc/club/enroll:    check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'enroll' } );
svc/club/template/delete:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { clubs => 'edit_templates' } );
svc/cover_images:            $input->cookie('CGISESSID'),
svc/creator_batches:my ( $auth_status ) = check_cookie_auth( $cgi->cookie('CGISESSID'), { catalogue => 1 } );
svc/holds:  check_cookie_auth( $input->cookie('CGISESSID'),
svc/mana/increment:  check_cookie_auth( $input->cookie('CGISESSID'),
svc/mana/share:  check_cookie_auth( $input->cookie('CGISESSID'),
svc/mana/use:  check_cookie_auth( $input->cookie('CGISESSID'),
svc/members/add_to_list:    $input->cookie('CGISESSID'),
svc/problem_reports:my ( $auth_status ) = check_cookie_auth( $query->cookie('CGISESSID'), { problem_reports => 1 } );
svc/recall:my ( $auth_status, $sessionID ) = check_cookie_auth( $input->cookie('CGISESSID'), { recall => 'manage_recalls' } );
svc/renew:  check_cookie_auth( $input->cookie('CGISESSID'),
tools/batch_records_ajax.pl:  check_cookie_auth( $input->cookie('CGISESSID'), { tools => 'manage_staged_marc' } );