Bug 25774: Handle utf8 chars in REST API queries

We must utf8 encode the string before json decoding it.

Test plan:
Use "❤" and play with the library search (bug 25288) and Postman to
generate queries using it.

This patch prevents 500:
[2020/06/16 14:11:37] [ERROR] GET /api/v1/libraries: unhandled exception (Mojo::Exception)<<Wide character in subroutine entry at /kohadevbox/koha/Koha/REST/Plugin/Objects.pm line 107.>> Koha::REST::Plugin::Exceptions::__ANON__ /kohadevbox/koha/Koha/REST/Plugin/Exceptions.pm (73)

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
(cherry picked from commit b1af5a62cb)
This commit is contained in:
Jonathan Druart 2020-06-17 09:43:40 +02:00
parent 2c1bc17f6c
commit 1cb8d2a59d
2 changed files with 26 additions and 5 deletions

View File

@ -19,7 +19,7 @@ use Modern::Perl;
use Mojo::Base 'Mojolicious::Plugin';
use JSON qw(decode_json);
use JSON;
=head1 NAME
@ -104,8 +104,9 @@ sub register {
my @query_params_array;
my $query_params;
push @query_params_array, $reserved_params->{query} if defined $reserved_params->{query};
push @query_params_array, decode_json($reserved_params->{q}) if defined $reserved_params->{q};
push @query_params_array, decode_json($reserved_params->{'x-koha-query'}) if defined $reserved_params->{'x-koha-query'};
my $json = JSON->new;
push @query_params_array, $json->decode($reserved_params->{q}) if defined $reserved_params->{q};
push @query_params_array, $json->decode($reserved_params->{'x-koha-query'}) if defined $reserved_params->{'x-koha-query'};
if(scalar(@query_params_array) > 1) {
$query_params = {'-and' => \@query_params_array};

View File

@ -77,7 +77,7 @@ get '/biblios' => sub {
# The tests
use Test::More tests => 9;
use Test::More tests => 10;
use Test::Mojo;
use t::lib::TestBuilder;
@ -206,6 +206,26 @@ subtest 'objects.search helper, sorting on mapped column' => sub {
$schema->storage->txn_rollback;
};
subtest 'objects.search helper, encoding' => sub {
plan tests => 5;
$schema->storage->txn_begin;
Koha::Cities->delete;
$builder->build_object({ class => 'Koha::Cities', value => { city_name => 'A', city_country => 'Argentina' } });
$builder->build_object({ class => 'Koha::Cities', value => { city_name => 'B', city_country => '❤Argentina❤' } });
$t->get_ok('/cities?q={"country": "❤Argentina❤"}')
->status_is(200)
->json_has('/0')
->json_hasnt('/1')
->json_is('/0/name' => 'B');
$schema->storage->txn_rollback;
};
subtest 'objects.search helper, embed' => sub {
plan tests => 2;
@ -363,4 +383,4 @@ subtest 'object.search helper order by embedded columns' => sub {
->json_is('/biblios/1/biblio_id' => $biblio1->biblionumber, 'Biblio 1 should be second');
$schema->storage->txn_begin;
}
}