Module: kamailio Branch: master Commit: 038158c99da96933c26b11a919ed1cbe29af9fab URL: https://github.com/kamailio/kamailio/commit/038158c99da96933c26b11a919ed1cbe...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2019-10-10T14:25:43+02:00
core: new global parameter uri_host_extra_chars
- allow specifying additional chars to be allowed in host part - example:
uri_host_extra_chars = "_"
---
Modified: src/core/cfg.lex Modified: src/core/cfg.y Modified: src/core/globals.h Modified: src/core/parser/parse_uri.c
---
Diff: https://github.com/kamailio/kamailio/commit/038158c99da96933c26b11a919ed1cbe... Patch: https://github.com/kamailio/kamailio/commit/038158c99da96933c26b11a919ed1cbe...
---
diff --git a/src/core/cfg.lex b/src/core/cfg.lex index a640bd158f..25671d1127 100644 --- a/src/core/cfg.lex +++ b/src/core/cfg.lex @@ -470,6 +470,8 @@ LATENCY_LIMIT_DB latency_limit_db LATENCY_LIMIT_ACTION latency_limit_action LATENCY_LIMIT_CFG latency_limit_cfg
+URI_HOST_EXTRA_CHARS "uri_host_extra_chars" + MSG_TIME msg_time ONSEND_RT_REPLY "onsend_route_reply" CFG_DESCRIPTION "description"|"descr"|"desc" @@ -980,6 +982,7 @@ IMPORTFILE "import_file" <INITIAL>{LOADPATH} { count(); yylval.strval=yytext; return LOADPATH; } <INITIAL>{MODPARAM} { count(); yylval.strval=yytext; return MODPARAM; } <INITIAL>{CFGENGINE} { count(); yylval.strval=yytext; return CFGENGINE; } +<INITIAL>{URI_HOST_EXTRA_CHARS} { yylval.strval=yytext; return URI_HOST_EXTRA_CHARS; }
<INITIAL>{EQUAL} { count(); return EQUAL; } <INITIAL>{ADDEQ} { count(); return ADDEQ; } diff --git a/src/core/cfg.y b/src/core/cfg.y index 0042af8327..56a8c9ab8c 100644 --- a/src/core/cfg.y +++ b/src/core/cfg.y @@ -503,6 +503,7 @@ extern char *default_routename; %token LATENCY_LIMIT_CFG %token MSG_TIME %token ONSEND_RT_REPLY +%token URI_HOST_EXTRA_CHARS
%token FLAGS_DECL %token AVPFLAGS_DECL @@ -1437,6 +1438,8 @@ assign_stm: user_agent_hdr.len=strlen(user_agent_hdr.s); } | USER_AGENT_HEADER EQUAL error { yyerror("string value expected"); } + | URI_HOST_EXTRA_CHARS EQUAL STRING { _sr_uri_host_extra_chars=$3; } + | URI_HOST_EXTRA_CHARS EQUAL error { yyerror("string value expected"); } | REPLY_TO_VIA EQUAL NUMBER { reply_to_via=$3; } | REPLY_TO_VIA EQUAL error { yyerror("boolean value expected"); } | LISTEN EQUAL id_lst { diff --git a/src/core/globals.h b/src/core/globals.h index 2149eeccd6..81fad0b284 100644 --- a/src/core/globals.h +++ b/src/core/globals.h @@ -215,6 +215,8 @@ extern int ksr_route_locks_size; extern str _ksr_xavp_via_params; extern str _ksr_xavp_via_fields;
+extern char *_sr_uri_host_extra_chars; + #ifdef USE_DNS_CACHE extern int dns_cache_init; /* if 0, the DNS cache is not initialized at startup */ extern unsigned int dns_timer_interval; /* gc timer interval in s */ diff --git a/src/core/parser/parse_uri.c b/src/core/parser/parse_uri.c index dbf5a7f9f7..ec39ea7cf2 100644 --- a/src/core/parser/parse_uri.c +++ b/src/core/parser/parse_uri.c @@ -37,6 +37,25 @@ static char _sr_uri_empty_buf[2] = {0}; static str _sr_uri_empty = { _sr_uri_empty_buf, 0 };
+/* extra chars that should be allowed in URI host */ +char *_sr_uri_host_extra_chars = ""; + +int uri_host_char_allowed(char c) +{ + int i = 0; + + if(_sr_uri_host_extra_chars==NULL || _sr_uri_host_extra_chars[0]=='\0') { + return 0; + } + while(_sr_uri_host_extra_chars[i]!='\0') { + if(_sr_uri_host_extra_chars[i]==c) { + return 1; + } + i++; + } + return 0; +} + /* buf= pointer to begining of uri (sip:x@foo.bar:5060;a=b?h=i) * len= len of uri * returns: fills uri & returns <0 on error or 0 if ok @@ -542,7 +561,8 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) switch(*p) { check_host_end; default: - if(!isalnum(*p) && (*p != '.') && (*p != '-')) { + if(!isalnum(*p) && (*p != '.') && (*p != '-') + && !uri_host_char_allowed(*p)) { goto error_bad_host; } }