You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcp-panel/lib/NGCP/Panel/Field/URI.pm

125 lines
3.9 KiB

package NGCP::Panel::Field::URI;
use Sipwise::Base;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Field::Text';
use NGCP::Panel::Utils::Subscriber;
our $class_messages = {
'uri_format' => 'URI must be in format "username", "username@domain" or phone number',
};
sub get_class_messages {
my $self = shift;
return {
%{ $self->next::method },
%{ $class_messages },
};
}
apply(
[
{
transform => sub {
lc($_[0]);
},
},
{
transform => sub {
my ($v, $field) = @_;
my $c = $field->form->ctx;
return $v unless($c);
my $sub = $c->stash->{subscriber};
return $v unless($sub);
$v =~ s/^sips?://;
my ($user, $domain) = split(/\@/, $v);
$domain = $sub->domain->domain unless($domain);
my $uri;
if($c->user->roles eq "subscriberadmin" || $c->user->roles eq "subscriber") {
$user = NGCP::Panel::Utils::Subscriber::apply_rewrite(
c => $c, subscriber => $sub, number => $user, direction => 'callee_in',
);
}
$uri = 'sip:' . $user . '@' . $domain;
return $uri;
},
},
{
check => sub {
my ( $value, $field ) = @_;
#we will not follow to rfc absolutely, so we will not check headers and uri parameters
#but we will include all allowed characters to username
my $domain_chars = '[:alnum:].+:-';# "+" here is from old code, I didn't remove it
my $unreserved_chars = '-_.!~*\'()';
# "#" is from dtmf-digit => local-phone-number => telephone-subscriber
# "%" is from escaped
# ":" we will not separate username and password
my $userinfo_unreserved_chars = '&=+$,;?/#%:';
my ($user, $domain) = split(/\@/, $value);
#https://metacpan.org/pod/URI#PARSING-URIs-WITH-REGEXP
#my($scheme, $authority, $path, $query, $fragment) =
#$uri =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
my $checked;
if ($user && $domain) {
my ($proto, $user_clean, $domain_clean, $rest);
($proto, $user_clean) = ($user =~/(sip[s]?:)?(.+?)$/i);
($domain_clean, $rest) = split(/[^$domain_chars]+/, $domain, 2);
if ( $user_clean =~ m/^[[:alnum:]\Q$unreserved_chars$userinfo_unreserved_chars\E]+$/ &&
$domain_clean =~ m/^[$domain_chars]+$/i ) {
$checked = $value;
}
}
$field->value($checked)
if $checked;
},
message => sub {
my ( $value, $field ) = @_;
return $field->get_message('uri_format');
},
},
],
);
has '+deflate_method' => ( default => sub { \&uri_deflate } );
sub uri_deflate {
my ( $field, $v ) = @_;
return unless($v);
my $c = $field->form->ctx;
return $v unless($c);
my $sub = $c->stash->{subscriber};
return $v unless($sub);
$v =~ s/^sips?://;
my $t;
my ($user, $domain) = split(/\@/, $v);
if($c->user->roles eq "subscriberadmin" || $c->user->roles eq "subscriber") {
$user = NGCP::Panel::Utils::Subscriber::apply_rewrite(
c => $c, subscriber => $sub, number => $user, direction => 'caller_out',
);
}
if($domain eq $sub->domain->domain) {
$v = $user;
} else {
$v = $user . '@' . $domain;
}
return $v;
}
no Moose;
__PACKAGE__->meta->make_immutable;
use namespace::autoclean;
1;
# vim: set tabstop=4 expandtab: