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:
 |