From fec183ca63a481a1619d9a90cffe01ffeddcd4c9 Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Fri, 19 Oct 2018 16:43:07 +0200 Subject: [PATCH] TT#46159 fix saving sip_username re in Intrecept-SOAP Change-Id: I00e789ce2f0392f884358299b66d2737f885e366 --- .../Panel/Controller/API/Interceptions.pm | 34 +++++++--------- lib/NGCP/Panel/Controller/SOAP/Intercept.pm | 35 ++++++++++------- lib/NGCP/Panel/Role/API/Interceptions.pm | 39 +++---------------- lib/NGCP/Panel/Utils/Interception.pm | 29 ++++++++++++++ 4 files changed, 68 insertions(+), 69 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/Interceptions.pm b/lib/NGCP/Panel/Controller/API/Interceptions.pm index c1d2c68b20..e57808b68a 100644 --- a/lib/NGCP/Panel/Controller/API/Interceptions.pm +++ b/lib/NGCP/Panel/Controller/API/Interceptions.pm @@ -137,25 +137,17 @@ sub POST :Allow { form => $form, ); - my $num_rs = $c->model('DB')->resultset('voip_numbers')->search( - \[ 'concat(cc,ac,sn) = ?', [ {} => $resource->{number} ]] - ); - unless($num_rs->first) { - $c->log->error("invalid number '$$resource{number}'"); - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Number does not exist"); - last; - } - # use the long way, since with ossbss provisioning, the reseller_id - # is not set in this case - $resource->{reseller_id} = $num_rs->first->subscriber->contract->contact->reseller_id; - - my $sub = $num_rs->first->subscriber; - unless($sub) { - $c->log->error("invalid number '$$resource{number}', not assigned to any subscriber"); - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Number is not active"); - last; - } - $resource->{sip_username} = NGCP::Panel::Utils::Interception::username_to_regexp_pattern($c,$num_rs->first,$sub->username); + my ($sub, $reseller, $voip_number) = NGCP::Panel::Utils::Interception::subresnum_from_number($c, $resource->{number}, sub { + my ($msg,$field,$response) = @_; + $c->log->error($msg); + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, $response); + return 0; + }); + last unless($sub && $reseller); + + $resource->{reseller_id} = $reseller->id; + + $resource->{sip_username} = NGCP::Panel::Utils::Interception::username_to_regexp_pattern($c,$voip_number,$sub->username); $resource->{sip_domain} = $sub->domain->domain; if($resource->{x3_required} && (!defined $resource->{x3_host} || !defined $resource->{x3_port})) { @@ -187,8 +179,8 @@ sub POST :Allow { liid => $resource->{liid}, uuid => $resource->{uuid}, number => $resource->{number}, - sip_username => NGCP::Panel::Utils::Interception::username_to_regexp_pattern($c,$num_rs->first,$sub->username), - sip_domain => $sub->domain->domain, + sip_username => $resource->{sip_username}, + sip_domain => $resource->{sip_domain}, delivery_host => $resource->{x2_host}, delivery_port => $resource->{x2_port}, delivery_user => $resource->{x2_user}, diff --git a/lib/NGCP/Panel/Controller/SOAP/Intercept.pm b/lib/NGCP/Panel/Controller/SOAP/Intercept.pm index 3eae5b68bb..dcd5524601 100644 --- a/lib/NGCP/Panel/Controller/SOAP/Intercept.pm +++ b/lib/NGCP/Panel/Controller/SOAP/Intercept.pm @@ -32,6 +32,7 @@ use Sipwise::Base; use NGCP::Panel::Form; use Data::Structure::Util qw/unbless/; use NGCP::Panel::Utils::SOAP qw/typed/; +use NGCP::Panel::Utils::Interception qw(); use UUID; use Moose; use NGCP::Panel::Utils::Admin; @@ -119,30 +120,33 @@ sub create_interception { $self->_auth($auth); $self->_validate(NGCP::Panel::Form::get("NGCP::Panel::Form::Intercept::Create", $c), $params); - my $i; - my $num; + my ($sub, $reseller, $voip_number, $sip_username, $sip_domain); try { - $num = $c->model('DB')->resultset('voip_dbaliases')->find({ - username => $params->{number} + ($sub, $reseller, $voip_number) = NGCP::Panel::Utils::Interception::subresnum_from_number($c, $params->{number}, sub { + my ($msg,$field,$response) = @_; + die SOAP::Fault + ->faultcode('Client.Voip.NoSuchSubscriber') + ->faultstring($msg); + return 0; }); + $sip_username = NGCP::Panel::Utils::Interception::username_to_regexp_pattern($c,$voip_number,$sub->username); + $sip_domain = $sub->domain->domain; } catch($e) { + die $e if 'SOAP::Fault' eq ref $e; die SOAP::Fault ->faultcode('Server.Internal') ->faultstring($e); } - unless($num) { - die SOAP::Fault - ->faultcode('Client.Voip.NoSuchSubscriber') - ->faultstring("number '$$params{number}' is not assigned to any subscriber"); - } + my ($uuid_bin, $uuid_string); UUID::generate($uuid_bin); UUID::unparse($uuid_bin, $uuid_string); my $guard = $c->model('DB')->txn_scope_guard; + my $i; { try { - $i = $self->c->model('DB')->resultset('voip_intercept')->create({ - reseller_id => $num->subscriber->voip_subscriber->contract->contact->reseller_id, + $i = $self->c->model('InterceptDB')->resultset('voip_intercept')->create({ + reseller_id => $reseller->id, LIID => $params->{LIID}, number => $params->{number}, cc_required => $params->{cc_required}, @@ -152,8 +156,8 @@ sub create_interception { delivery_pass => $params->{iri_delivery}->{pass}, deleted => 0, uuid => $uuid_string, - sip_username => $num->subscriber->username, - sip_domain => $num->domain->domain, + sip_username => $sip_username, + sip_domain => $sip_domain, create_timestamp => \['NOW()'], $params->{cc_required} ? (cc_delivery_host => $params->{cc_delivery}->{host}) : (), $params->{cc_required} ? (cc_delivery_port => $params->{cc_delivery}->{port}) : (), @@ -164,8 +168,8 @@ sub create_interception { liid => $i->LIID, uuid => $i->uuid, number => $i->number, - sip_username => $num->subscriber->username, - sip_domain => $num->domain->domain, + sip_username => $sip_username, + sip_domain => $sip_domain, delivery_host => $i->delivery_host, delivery_port => $i->delivery_port, delivery_user => $i->delivery_user, @@ -221,6 +225,7 @@ sub update_interception { $i->cc_delivery_port($params->{data}->{cc_delivery}->{port}); } $i->cc_required($params->{data}->{cc_required}); + # not applying changed number/domain? try { $i->update(); diff --git a/lib/NGCP/Panel/Role/API/Interceptions.pm b/lib/NGCP/Panel/Role/API/Interceptions.pm index 0f2838f534..a033292133 100644 --- a/lib/NGCP/Panel/Role/API/Interceptions.pm +++ b/lib/NGCP/Panel/Role/API/Interceptions.pm @@ -129,7 +129,12 @@ sub update_item { resource => $resource, ); - my ($sub, $reseller, $voip_number) = $self->subresnum_from_number($c, $resource->{number}); + my ($sub, $reseller, $voip_number) = NGCP::Panel::Utils::Interception::subresnum_from_number($c, $resource->{number}, sub { + my ($msg,$field,$response) = @_; + $c->log->error($msg); + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, $response); + return 0; + }); return unless($sub && $reseller); $resource->{reseller_id} = $reseller->id; @@ -180,37 +185,5 @@ sub update_item { return $item; } -sub subresnum_from_number { - my ($self, $c, $number) = @_; - my $num_rs = $c->model('DB')->resultset('voip_numbers')->search( - \[ 'concat(cc,ac,sn) = ?', [ {} => $number ]] - ); - unless($num_rs->first) { - $c->log->error("invalid number '$number'"); - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Number does not exist"); - return; - } - my $sub = $num_rs->first->subscriber; - unless($sub) { - $c->log->error("invalid number '$number', not assigned to any subscriber"); - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Number is not active"); - return; - } - - my $res = $num_rs->first->reseller; - unless($res) { - # with ossbss provisioning, reseller is not set on number, - # so take the long way here - $res = $sub->contract->contact->reseller; - unless($res) { - $c->log->error("invalid number '$number', not assigned to any reseller"); - $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Number is not active"); - return; - } - } - - return ($sub, $res, $num_rs->first); -} - 1; # vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Utils/Interception.pm b/lib/NGCP/Panel/Utils/Interception.pm index 6d2f8dcf75..a19fcc6ec1 100644 --- a/lib/NGCP/Panel/Utils/Interception.pm +++ b/lib/NGCP/Panel/Utils/Interception.pm @@ -113,4 +113,33 @@ sub username_to_regexp_pattern { } +sub subresnum_from_number { + my ($c, $number, $err_code) = @_; + if (!defined $err_code || ref $err_code ne 'CODE') { + $err_code = sub { return 0; }; + } + my $num_rs = $c->model('DB')->resultset('voip_numbers')->search( + \[ 'concat(cc,ac,sn) = ?', [ {} => $number ]] + ); + unless($num_rs->first) { + return 0 unless &{$err_code}("invalid number '$number'",'number',"Number does not exist"); + } + my $sub = $num_rs->first->subscriber; + unless($sub) { + return 0 unless &{$err_code}("invalid number '$number', not assigned to any subscriber",'number',"Number is not active"); + } + + my $res = $num_rs->first->reseller; + unless($res) { + # with ossbss provisioning, reseller is not set on number, + # so take the long way here + $res = $sub->contract->contact->reseller; + unless($res) { + return 0 unless &{$err_code}("invalid number '$number', not assigned to any reseller",'number',"Number is not active"); + } + } + + return ($sub, $res, $num_rs->first); +} + 1;