From 2ed892b38ca99220f367e5c09c60134c2ffba356 Mon Sep 17 00:00:00 2001 From: Pedro Amorim Date: Fri, 9 May 2025 13:16:22 +0000 Subject: [PATCH] Bug 37893: (QA follow-up): Check if port already in use when storing a listener To test: 1) Ensure a port is already in use in the server 2) Try creating a new listener using that same port. 3) Notice the error 'Something went wrong: Error: Can't listen on port 127.0.0.1:8023/tcp/IPv4. Port already in use.' is shown on the UI Co-authored-by: Martin Renvoize Signed-off-by: Andrew Fuerste Henry Signed-off-by: Lisette Scheer Signed-off-by: Martin Renvoize Signed-off-by: Lucas Gass --- Koha/REST/V1/SIP2/Listeners.pm | 6 ++++++ Koha/SIP2/Listener.pm | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Koha/REST/V1/SIP2/Listeners.pm b/Koha/REST/V1/SIP2/Listeners.pm index 78adae38d5..b372b5f857 100644 --- a/Koha/REST/V1/SIP2/Listeners.pm +++ b/Koha/REST/V1/SIP2/Listeners.pm @@ -108,6 +108,12 @@ sub add { openapi => { error => "Given " . $to_api_mapping->{ $_->parameter } . " does not exist" } ); } + elsif ( $_->isa('Koha::Exceptions::ObjectNotCreated') ) { + return $c->render( + status => 500, + openapi => { error => $_->error } + ); + } } $c->unhandled_exception($_); diff --git a/Koha/SIP2/Listener.pm b/Koha/SIP2/Listener.pm index cc34a30fad..54c09a57f4 100644 --- a/Koha/SIP2/Listener.pm +++ b/Koha/SIP2/Listener.pm @@ -19,6 +19,8 @@ use Modern::Perl; use base qw(Koha::Object); +use IO::Socket; + =head1 NAME Koha::SIP2::Listener- Koha Sip Listener Object class @@ -29,6 +31,34 @@ Koha::SIP2::Listener- Koha Sip Listener Object class =cut +=head3 store + +store + +=cut + +sub store { + my ($self) = @_; + + my ($port) = $self->port =~ /:(\d+)/; + my ($addr) = $self->port =~ /([0-9.]+)/; + + my $socket = IO::Socket::INET->new( + LocalAddr => $addr, + LocalPort => $port, + Proto => 'tcp', + ReuseAddr => 0, + Listen => 1 + ); + + unless ($socket) { + Koha::Exceptions::ObjectNotCreated->throw( + error => "Can't listen on port " . $self->port . ". Port already in use." ); + } + + return $self->SUPER::store; +} + =head3 get_for_config Returns the listener hashref as expected by C4/SIP/Sip/Configuration->new;