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.
125 lines
3.9 KiB
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:
|