|
@@ -168,23 +168,23 @@ int uri_param_2(struct sip_msg* _msg, char* _param, char* _value)
|
|
value = (str*)_value;
|
|
value = (str*)_value;
|
|
|
|
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
- LM_ERR("ruri parsing failed\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("ruri parsing failed\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
t = _msg->parsed_uri.params;
|
|
t = _msg->parsed_uri.params;
|
|
|
|
|
|
if (parse_params(&t, CLASS_ANY, &hooks, ¶ms) < 0) {
|
|
if (parse_params(&t, CLASS_ANY, &hooks, ¶ms) < 0) {
|
|
- LM_ERR("ruri parameter parsing failed\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("ruri parameter parsing failed\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
for (pit = params; pit; pit = pit->next) {
|
|
for (pit = params; pit; pit = pit->next) {
|
|
if ((pit->name.len == param->len) &&
|
|
if ((pit->name.len == param->len) &&
|
|
- (strncmp(pit->name.s, param->s, param->len) == 0)) {
|
|
|
|
|
|
+ (strncmp(pit->name.s, param->s, param->len) == 0)) {
|
|
if (value) {
|
|
if (value) {
|
|
if ((value->len == pit->body.len) &&
|
|
if ((value->len == pit->body.len) &&
|
|
- strncmp(value->s, pit->body.s, value->len) == 0) {
|
|
|
|
|
|
+ strncmp(value->s, pit->body.s, value->len) == 0) {
|
|
goto ok;
|
|
goto ok;
|
|
} else {
|
|
} else {
|
|
goto nok;
|
|
goto nok;
|
|
@@ -198,7 +198,7 @@ int uri_param_2(struct sip_msg* _msg, char* _param, char* _value)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
nok:
|
|
nok:
|
|
free_params(params);
|
|
free_params(params);
|
|
return -1;
|
|
return -1;
|
|
@@ -226,8 +226,8 @@ int add_uri_param(struct sip_msg* _msg, char* _param, char* _s2)
|
|
}
|
|
}
|
|
|
|
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
- LM_ERR("ruri parsing failed\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("ruri parsing failed\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
parsed_uri = &(_msg->parsed_uri);
|
|
parsed_uri = &(_msg->parsed_uri);
|
|
@@ -264,7 +264,7 @@ int add_uri_param(struct sip_msg* _msg, char* _param, char* _s2)
|
|
parsed_uri->params.len + param->len + 1 +
|
|
parsed_uri->params.len + param->len + 1 +
|
|
parsed_uri->headers.len + 1;
|
|
parsed_uri->headers.len + 1;
|
|
if (new_uri.len > MAX_URI_SIZE) {
|
|
if (new_uri.len > MAX_URI_SIZE) {
|
|
- LM_ERR("new ruri too long\n");
|
|
|
|
|
|
+ LM_ERR("new ruri too long\n");
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -328,83 +328,83 @@ ok:
|
|
*/
|
|
*/
|
|
int tel2sip(struct sip_msg* _msg, char* _uri, char* _hostpart, char* _res)
|
|
int tel2sip(struct sip_msg* _msg, char* _uri, char* _hostpart, char* _res)
|
|
{
|
|
{
|
|
- str uri, hostpart, tel_uri, sip_uri;
|
|
|
|
- char *at;
|
|
|
|
- int i, j, in_tel_parameters = 0;
|
|
|
|
- pv_spec_t *res;
|
|
|
|
- pv_value_t res_val;
|
|
|
|
-
|
|
|
|
- /* get parameters */
|
|
|
|
- if (get_str_fparam(&uri, _msg, (fparam_t*)_uri) < 0) {
|
|
|
|
- LM_ERR("failed to get uri value\n");
|
|
|
|
- }
|
|
|
|
- if (get_str_fparam(&hostpart, _msg, (fparam_t*)_hostpart) < 0) {
|
|
|
|
- LM_ERR("failed to get hostpart value\n");
|
|
|
|
- }
|
|
|
|
- res = (pv_spec_t *)_res;
|
|
|
|
-
|
|
|
|
- /* check if anything needs to be done */
|
|
|
|
- if (uri.len < 4) return 1;
|
|
|
|
- if (strncasecmp(uri.s, "tel:", 4) != 0) return 1;
|
|
|
|
-
|
|
|
|
- /* reserve memory for clean tel uri */
|
|
|
|
- tel_uri.s = pkg_malloc(uri.len+1);
|
|
|
|
- if (tel_uri.s == 0) {
|
|
|
|
- LM_ERR("no more pkg memory\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* Remove visual separators before converting to SIP URI. Don't remove
|
|
|
|
- visual separators in TEL URI parameters (after the first ";") */
|
|
|
|
- for (i=0, j=0; i < uri.len; i++) {
|
|
|
|
- if (in_tel_parameters == 0) {
|
|
|
|
- if (uri.s[i] == ';')
|
|
|
|
- in_tel_parameters = 1;
|
|
|
|
- }
|
|
|
|
- if (in_tel_parameters == 0) {
|
|
|
|
- if ((uri.s[i] != '-') && (uri.s[i] != '.') &&
|
|
|
|
- (uri.s[i] != '(') && (uri.s[i] != ')'))
|
|
|
|
- tel_uri.s[j++] = tolower(uri.s[i]);
|
|
|
|
- } else {
|
|
|
|
- tel_uri.s[j++] = tolower(uri.s[i]);
|
|
|
|
|
|
+ str uri, hostpart, tel_uri, sip_uri;
|
|
|
|
+ char *at;
|
|
|
|
+ int i, j, in_tel_parameters = 0;
|
|
|
|
+ pv_spec_t *res;
|
|
|
|
+ pv_value_t res_val;
|
|
|
|
+
|
|
|
|
+ /* get parameters */
|
|
|
|
+ if (get_str_fparam(&uri, _msg, (fparam_t*)_uri) < 0) {
|
|
|
|
+ LM_ERR("failed to get uri value\n");
|
|
|
|
+ }
|
|
|
|
+ if (get_str_fparam(&hostpart, _msg, (fparam_t*)_hostpart) < 0) {
|
|
|
|
+ LM_ERR("failed to get hostpart value\n");
|
|
|
|
+ }
|
|
|
|
+ res = (pv_spec_t *)_res;
|
|
|
|
+
|
|
|
|
+ /* check if anything needs to be done */
|
|
|
|
+ if (uri.len < 4) return 1;
|
|
|
|
+ if (strncasecmp(uri.s, "tel:", 4) != 0) return 1;
|
|
|
|
+
|
|
|
|
+ /* reserve memory for clean tel uri */
|
|
|
|
+ tel_uri.s = pkg_malloc(uri.len+1);
|
|
|
|
+ if (tel_uri.s == 0) {
|
|
|
|
+ LM_ERR("no more pkg memory\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Remove visual separators before converting to SIP URI. Don't remove
|
|
|
|
+ visual separators in TEL URI parameters (after the first ";") */
|
|
|
|
+ for (i=0, j=0; i < uri.len; i++) {
|
|
|
|
+ if (in_tel_parameters == 0) {
|
|
|
|
+ if (uri.s[i] == ';')
|
|
|
|
+ in_tel_parameters = 1;
|
|
|
|
+ }
|
|
|
|
+ if (in_tel_parameters == 0) {
|
|
|
|
+ if ((uri.s[i] != '-') && (uri.s[i] != '.') &&
|
|
|
|
+ (uri.s[i] != '(') && (uri.s[i] != ')'))
|
|
|
|
+ tel_uri.s[j++] = tolower(uri.s[i]);
|
|
|
|
+ } else {
|
|
|
|
+ tel_uri.s[j++] = tolower(uri.s[i]);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- tel_uri.s[j] = '\0';
|
|
|
|
- tel_uri.len = strlen(tel_uri.s);
|
|
|
|
|
|
+ tel_uri.s[j] = '\0';
|
|
|
|
+ tel_uri.len = strlen(tel_uri.s);
|
|
|
|
|
|
- /* reserve memory for resulting sip uri */
|
|
|
|
- sip_uri.len = 4 + tel_uri.len - 4 + 1 + hostpart.len + 1 + 10;
|
|
|
|
- sip_uri.s = pkg_malloc(sip_uri.len);
|
|
|
|
- if (sip_uri.s == 0) {
|
|
|
|
- LM_ERR("no more pkg memory\n");
|
|
|
|
|
|
+ /* reserve memory for resulting sip uri */
|
|
|
|
+ sip_uri.len = 4 + tel_uri.len - 4 + 1 + hostpart.len + 1 + 10;
|
|
|
|
+ sip_uri.s = pkg_malloc(sip_uri.len);
|
|
|
|
+ if (sip_uri.s == 0) {
|
|
|
|
+ LM_ERR("no more pkg memory\n");
|
|
|
|
+ pkg_free(tel_uri.s);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* create resulting sip uri */
|
|
|
|
+ at = sip_uri.s;
|
|
|
|
+ append_str(at, "sip:", 4);
|
|
|
|
+ append_str(at, tel_uri.s + 4, tel_uri.len - 4);
|
|
|
|
+ append_chr(at, '@');
|
|
|
|
+ append_str(at, hostpart.s, hostpart.len);
|
|
|
|
+ append_chr(at, ';');
|
|
|
|
+ append_str(at, "user=phone", 10);
|
|
|
|
+
|
|
|
|
+ /* tel_uri is not needed anymore */
|
|
pkg_free(tel_uri.s);
|
|
pkg_free(tel_uri.s);
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* create resulting sip uri */
|
|
|
|
- at = sip_uri.s;
|
|
|
|
- append_str(at, "sip:", 4);
|
|
|
|
- append_str(at, tel_uri.s + 4, tel_uri.len - 4);
|
|
|
|
- append_chr(at, '@');
|
|
|
|
- append_str(at, hostpart.s, hostpart.len);
|
|
|
|
- append_chr(at, ';');
|
|
|
|
- append_str(at, "user=phone", 10);
|
|
|
|
-
|
|
|
|
- /* tel_uri is not needed anymore */
|
|
|
|
- pkg_free(tel_uri.s);
|
|
|
|
-
|
|
|
|
- /* set result pv value and write sip uri to result pv */
|
|
|
|
- res_val.rs = sip_uri;
|
|
|
|
- res_val.flags = PV_VAL_STR;
|
|
|
|
- if (res->setf(_msg, &res->pvp, (int)EQ_T, &res_val) != 0) {
|
|
|
|
- LM_ERR("failed to set result pvar\n");
|
|
|
|
- pkg_free(sip_uri.s);
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
|
|
- /* free allocated pkg memory and return */
|
|
|
|
- pkg_free(sip_uri.s);
|
|
|
|
- return 1;
|
|
|
|
|
|
+ /* set result pv value and write sip uri to result pv */
|
|
|
|
+ res_val.rs = sip_uri;
|
|
|
|
+ res_val.flags = PV_VAL_STR;
|
|
|
|
+ if (res->setf(_msg, &res->pvp, (int)EQ_T, &res_val) != 0) {
|
|
|
|
+ LM_ERR("failed to set result pvar\n");
|
|
|
|
+ pkg_free(sip_uri.s);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* free allocated pkg memory and return */
|
|
|
|
+ pkg_free(sip_uri.s);
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -432,26 +432,26 @@ static inline int e164_check(str* _user)
|
|
*/
|
|
*/
|
|
int is_e164(struct sip_msg* _m, char* _sp, char* _s2)
|
|
int is_e164(struct sip_msg* _m, char* _sp, char* _s2)
|
|
{
|
|
{
|
|
- pv_spec_t *sp;
|
|
|
|
- pv_value_t pv_val;
|
|
|
|
|
|
+ pv_spec_t *sp;
|
|
|
|
+ pv_value_t pv_val;
|
|
|
|
|
|
- sp = (pv_spec_t *)_sp;
|
|
|
|
|
|
+ sp = (pv_spec_t *)_sp;
|
|
|
|
|
|
- if (sp && (pv_get_spec_value(_m, sp, &pv_val) == 0)) {
|
|
|
|
- if (pv_val.flags & PV_VAL_STR) {
|
|
|
|
- if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
|
|
|
|
- LM_DBG("missing argument\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- return e164_check(&(pv_val.rs));
|
|
|
|
|
|
+ if (sp && (pv_get_spec_value(_m, sp, &pv_val) == 0)) {
|
|
|
|
+ if (pv_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
|
|
|
|
+ LM_DBG("missing argument\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ return e164_check(&(pv_val.rs));
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("pseudo variable value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- LM_ERR("pseudo variable value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("failed to get pseudo variable value\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get pseudo variable value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -460,45 +460,45 @@ int is_e164(struct sip_msg* _m, char* _sp, char* _s2)
|
|
*/
|
|
*/
|
|
int w_is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2)
|
|
int w_is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2)
|
|
{
|
|
{
|
|
- pv_spec_t *sp;
|
|
|
|
- pv_value_t pv_val;
|
|
|
|
|
|
+ pv_spec_t *sp;
|
|
|
|
+ pv_value_t pv_val;
|
|
|
|
|
|
- sp = (pv_spec_t *)_sp;
|
|
|
|
|
|
+ sp = (pv_spec_t *)_sp;
|
|
|
|
|
|
- if (sp && (pv_get_spec_value(_m, sp, &pv_val) == 0)) {
|
|
|
|
- if (pv_val.flags & PV_VAL_STR) {
|
|
|
|
- if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
|
|
|
|
- LM_DBG("missing uri\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- return is_uri_user_e164(&pv_val.rs);
|
|
|
|
|
|
+ if (sp && (pv_get_spec_value(_m, sp, &pv_val) == 0)) {
|
|
|
|
+ if (pv_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (pv_val.rs.len == 0 || pv_val.rs.s == NULL) {
|
|
|
|
+ LM_DBG("missing uri\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ return is_uri_user_e164(&pv_val.rs);
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("pseudo variable value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- LM_ERR("pseudo variable value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("failed to get pseudo variable value\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get pseudo variable value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
int is_uri_user_e164(str *uri)
|
|
int is_uri_user_e164(str *uri)
|
|
{
|
|
{
|
|
- char *chr;
|
|
|
|
- str user;
|
|
|
|
|
|
+ char *chr;
|
|
|
|
+ str user;
|
|
|
|
|
|
- chr = memchr(uri->s, ':', uri->len);
|
|
|
|
- if (chr == NULL) {
|
|
|
|
- LM_ERR("parsing URI failed\n");
|
|
|
|
- return -1;
|
|
|
|
- };
|
|
|
|
- user.s = chr + 1;
|
|
|
|
- chr = memchr(user.s, '@', uri->len - (user.s - uri->s));
|
|
|
|
- if (chr == NULL) return -1;
|
|
|
|
- user.len = chr - user.s;
|
|
|
|
|
|
+ chr = memchr(uri->s, ':', uri->len);
|
|
|
|
+ if (chr == NULL) {
|
|
|
|
+ LM_ERR("parsing URI failed\n");
|
|
|
|
+ return -1;
|
|
|
|
+ };
|
|
|
|
+ user.s = chr + 1;
|
|
|
|
+ chr = memchr(user.s, '@', uri->len - (user.s - uri->s));
|
|
|
|
+ if (chr == NULL) return -1;
|
|
|
|
+ user.len = chr - user.s;
|
|
|
|
|
|
- return e164_check(&user);
|
|
|
|
|
|
+ return e164_check(&user);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -506,87 +506,87 @@ int is_uri_user_e164(str *uri)
|
|
*/
|
|
*/
|
|
int set_uri_user(struct sip_msg* _m, char* _uri, char* _value)
|
|
int set_uri_user(struct sip_msg* _m, char* _uri, char* _value)
|
|
{
|
|
{
|
|
- pv_spec_t *uri_pv, *value_pv;
|
|
|
|
- pv_value_t uri_val, value_val, res_val;
|
|
|
|
- str uri, value;
|
|
|
|
- char *at, *colon, *c;
|
|
|
|
- char new_uri[MAX_URI_SIZE + 1];
|
|
|
|
-
|
|
|
|
- uri_pv = (pv_spec_t *)_uri;
|
|
|
|
- if (uri_pv && (pv_get_spec_value(_m, uri_pv, &uri_val) == 0)) {
|
|
|
|
- if (uri_val.flags & PV_VAL_STR) {
|
|
|
|
- if (uri_val.rs.len == 0 || uri_val.rs.s == NULL) {
|
|
|
|
- LM_ERR("missing uri value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ pv_spec_t *uri_pv, *value_pv;
|
|
|
|
+ pv_value_t uri_val, value_val, res_val;
|
|
|
|
+ str uri, value;
|
|
|
|
+ char *at, *colon, *c;
|
|
|
|
+ char new_uri[MAX_URI_SIZE + 1];
|
|
|
|
+
|
|
|
|
+ uri_pv = (pv_spec_t *)_uri;
|
|
|
|
+ if (uri_pv && (pv_get_spec_value(_m, uri_pv, &uri_val) == 0)) {
|
|
|
|
+ if (uri_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (uri_val.rs.len == 0 || uri_val.rs.s == NULL) {
|
|
|
|
+ LM_ERR("missing uri value\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("uri value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- LM_ERR("uri value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get uri value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- uri = uri_val.rs;
|
|
|
|
-
|
|
|
|
- value_pv = (pv_spec_t *)_value;
|
|
|
|
- if (value_pv && (pv_get_spec_value(_m, value_pv, &value_val) == 0)) {
|
|
|
|
- if (value_val.flags & PV_VAL_STR) {
|
|
|
|
- if (value_val.rs.s == NULL) {
|
|
|
|
- LM_ERR("missing uriuser value\n");
|
|
|
|
|
|
+ LM_ERR("failed to get uri value\n");
|
|
return -1;
|
|
return -1;
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ uri = uri_val.rs;
|
|
|
|
+
|
|
|
|
+ value_pv = (pv_spec_t *)_value;
|
|
|
|
+ if (value_pv && (pv_get_spec_value(_m, value_pv, &value_val) == 0)) {
|
|
|
|
+ if (value_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (value_val.rs.s == NULL) {
|
|
|
|
+ LM_ERR("missing uriuser value\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("uriuser value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- LM_ERR("uriuser value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("failed to get uriuser value\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get uriuser value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- value = value_val.rs;
|
|
|
|
|
|
+ value = value_val.rs;
|
|
|
|
|
|
- colon = strchr(uri.s, ':');
|
|
|
|
- if (colon == NULL) {
|
|
|
|
- LM_ERR("uri does not contain ':' character\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- at = strchr(uri.s, '@');
|
|
|
|
- c = &(new_uri[0]);
|
|
|
|
- if (at == NULL) {
|
|
|
|
- if (value.len == 0) return 1;
|
|
|
|
- if (uri.len + value.len > MAX_URI_SIZE) {
|
|
|
|
- LM_ERR("resulting uri would be too large\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ colon = strchr(uri.s, ':');
|
|
|
|
+ if (colon == NULL) {
|
|
|
|
+ LM_ERR("uri does not contain ':' character\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
- append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
- append_str(c, value.s, value.len);
|
|
|
|
- append_chr(c, '@');
|
|
|
|
- append_str(c, colon + 1, uri.len - (colon - uri.s + 1));
|
|
|
|
- res_val.rs.len = uri.len + value.len + 1;
|
|
|
|
- } else {
|
|
|
|
- if (value.len == 0) {
|
|
|
|
- append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
- append_str(c, at + 1, uri.len - (at - uri.s + 1));
|
|
|
|
- res_val.rs.len = uri.len - (at - colon);
|
|
|
|
|
|
+ at = strchr(uri.s, '@');
|
|
|
|
+ c = &(new_uri[0]);
|
|
|
|
+ if (at == NULL) {
|
|
|
|
+ if (value.len == 0) return 1;
|
|
|
|
+ if (uri.len + value.len > MAX_URI_SIZE) {
|
|
|
|
+ LM_ERR("resulting uri would be too large\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
+ append_str(c, value.s, value.len);
|
|
|
|
+ append_chr(c, '@');
|
|
|
|
+ append_str(c, colon + 1, uri.len - (colon - uri.s + 1));
|
|
|
|
+ res_val.rs.len = uri.len + value.len + 1;
|
|
} else {
|
|
} else {
|
|
- if (uri.len + value.len - (at - colon - 1) > MAX_URI_SIZE) {
|
|
|
|
- LM_ERR("resulting uri would be too large\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
- append_str(c, value.s, value.len);
|
|
|
|
- append_str(c, at, uri.len - (at - uri.s));
|
|
|
|
- res_val.rs.len = uri.len + value.len - (at - colon - 1);
|
|
|
|
|
|
+ if (value.len == 0) {
|
|
|
|
+ append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
+ append_str(c, at + 1, uri.len - (at - uri.s + 1));
|
|
|
|
+ res_val.rs.len = uri.len - (at - colon);
|
|
|
|
+ } else {
|
|
|
|
+ if (uri.len + value.len - (at - colon - 1) > MAX_URI_SIZE) {
|
|
|
|
+ LM_ERR("resulting uri would be too large\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ append_str(c, uri.s, colon - uri.s + 1);
|
|
|
|
+ append_str(c, value.s, value.len);
|
|
|
|
+ append_str(c, at, uri.len - (at - uri.s));
|
|
|
|
+ res_val.rs.len = uri.len + value.len - (at - colon - 1);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
- res_val.rs.s = &(new_uri[0]);
|
|
|
|
- LM_DBG("resulting uri: %.*s\n", res_val.rs.len, res_val.rs.s);
|
|
|
|
- res_val.flags = PV_VAL_STR;
|
|
|
|
- uri_pv->setf(_m, &uri_pv->pvp, (int)EQ_T, &res_val);
|
|
|
|
|
|
+ res_val.rs.s = &(new_uri[0]);
|
|
|
|
+ LM_DBG("resulting uri: %.*s\n", res_val.rs.len, res_val.rs.s);
|
|
|
|
+ res_val.flags = PV_VAL_STR;
|
|
|
|
+ uri_pv->setf(_m, &uri_pv->pvp, (int)EQ_T, &res_val);
|
|
|
|
|
|
- return 1;
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -594,80 +594,80 @@ int set_uri_user(struct sip_msg* _m, char* _uri, char* _value)
|
|
*/
|
|
*/
|
|
int set_uri_host(struct sip_msg* _m, char* _uri, char* _value)
|
|
int set_uri_host(struct sip_msg* _m, char* _uri, char* _value)
|
|
{
|
|
{
|
|
- pv_spec_t *uri_pv, *value_pv;
|
|
|
|
- pv_value_t uri_val, value_val, res_val;
|
|
|
|
- str uri, value;
|
|
|
|
- char *at, *colon, *c, *next;
|
|
|
|
- unsigned int host_len;
|
|
|
|
- char new_uri[MAX_URI_SIZE + 1];
|
|
|
|
-
|
|
|
|
- uri_pv = (pv_spec_t *)_uri;
|
|
|
|
- if (uri_pv && (pv_get_spec_value(_m, uri_pv, &uri_val) == 0)) {
|
|
|
|
- if (uri_val.flags & PV_VAL_STR) {
|
|
|
|
- if (uri_val.rs.len == 0 || uri_val.rs.s == NULL) {
|
|
|
|
- LM_ERR("missing uri value\n");
|
|
|
|
|
|
+ pv_spec_t *uri_pv, *value_pv;
|
|
|
|
+ pv_value_t uri_val, value_val, res_val;
|
|
|
|
+ str uri, value;
|
|
|
|
+ char *at, *colon, *c, *next;
|
|
|
|
+ unsigned int host_len;
|
|
|
|
+ char new_uri[MAX_URI_SIZE + 1];
|
|
|
|
+
|
|
|
|
+ uri_pv = (pv_spec_t *)_uri;
|
|
|
|
+ if (uri_pv && (pv_get_spec_value(_m, uri_pv, &uri_val) == 0)) {
|
|
|
|
+ if (uri_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (uri_val.rs.len == 0 || uri_val.rs.s == NULL) {
|
|
|
|
+ LM_ERR("missing uri value\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("uri value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("failed to get uri value\n");
|
|
return -1;
|
|
return -1;
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ uri = uri_val.rs;
|
|
|
|
+
|
|
|
|
+ value_pv = (pv_spec_t *)_value;
|
|
|
|
+ if (value_pv && (pv_get_spec_value(_m, value_pv, &value_val) == 0)) {
|
|
|
|
+ if (value_val.flags & PV_VAL_STR) {
|
|
|
|
+ if (value_val.rs.s == NULL) {
|
|
|
|
+ LM_ERR("missing uri value\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ LM_ERR("uri value is not string\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- LM_ERR("uri value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ LM_ERR("failed to get uri value\n");
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get uri value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- uri = uri_val.rs;
|
|
|
|
-
|
|
|
|
- value_pv = (pv_spec_t *)_value;
|
|
|
|
- if (value_pv && (pv_get_spec_value(_m, value_pv, &value_val) == 0)) {
|
|
|
|
- if (value_val.flags & PV_VAL_STR) {
|
|
|
|
- if (value_val.rs.s == NULL) {
|
|
|
|
- LM_ERR("missing uri value\n");
|
|
|
|
|
|
+ value = value_val.rs;
|
|
|
|
+
|
|
|
|
+ if (value.len == 0) {
|
|
|
|
+ LM_ERR("hostpart of uri cannot be empty\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ if (uri.len + value.len > MAX_URI_SIZE) {
|
|
|
|
+ LM_ERR("resulting uri would be too large\n");
|
|
return -1;
|
|
return -1;
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ colon = strchr(uri.s, ':');
|
|
|
|
+ if (colon == NULL) {
|
|
|
|
+ LM_ERR("uri does not contain ':' character\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ c = &(new_uri[0]);
|
|
|
|
+ at = strchr(colon + 1, '@');
|
|
|
|
+ if (at == NULL) {
|
|
|
|
+ next = colon + 1;
|
|
} else {
|
|
} else {
|
|
- LM_ERR("uri value is not string\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ next = at + 1;
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- LM_ERR("failed to get uri value\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- value = value_val.rs;
|
|
|
|
|
|
+ append_str(c, uri.s, next - uri.s);
|
|
|
|
+ host_len = strcspn(next, ":;?");
|
|
|
|
+ append_str(c, value.s, value.len);
|
|
|
|
+ strcpy(c, next + host_len);
|
|
|
|
+ res_val.rs.len = uri.len + value.len - host_len;
|
|
|
|
+ res_val.rs.s = &(new_uri[0]);
|
|
|
|
|
|
- if (value.len == 0) {
|
|
|
|
- LM_ERR("hostpart of uri cannot be empty\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- if (uri.len + value.len > MAX_URI_SIZE) {
|
|
|
|
- LM_ERR("resulting uri would be too large\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ LM_DBG("resulting uri: %.*s\n", res_val.rs.len, res_val.rs.s);
|
|
|
|
+ res_val.flags = PV_VAL_STR;
|
|
|
|
+ uri_pv->setf(_m, &uri_pv->pvp, (int)EQ_T, &res_val);
|
|
|
|
|
|
- colon = strchr(uri.s, ':');
|
|
|
|
- if (colon == NULL) {
|
|
|
|
- LM_ERR("uri does not contain ':' character\n");
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- c = &(new_uri[0]);
|
|
|
|
- at = strchr(colon + 1, '@');
|
|
|
|
- if (at == NULL) {
|
|
|
|
- next = colon + 1;
|
|
|
|
- } else {
|
|
|
|
- next = at + 1;
|
|
|
|
- }
|
|
|
|
- append_str(c, uri.s, next - uri.s);
|
|
|
|
- host_len = strcspn(next, ":;?");
|
|
|
|
- append_str(c, value.s, value.len);
|
|
|
|
- strcpy(c, next + host_len);
|
|
|
|
- res_val.rs.len = uri.len + value.len - host_len;
|
|
|
|
- res_val.rs.s = &(new_uri[0]);
|
|
|
|
-
|
|
|
|
- LM_DBG("resulting uri: %.*s\n", res_val.rs.len, res_val.rs.s);
|
|
|
|
- res_val.flags = PV_VAL_STR;
|
|
|
|
- uri_pv->setf(_m, &uri_pv->pvp, (int)EQ_T, &res_val);
|
|
|
|
-
|
|
|
|
- return 1;
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -684,7 +684,7 @@ int get_uri_param(struct sip_msg* _msg, char* _param, char* _value)
|
|
|
|
|
|
param = (str*)_param;
|
|
param = (str*)_param;
|
|
dst = (pv_spec_t *) _value;
|
|
dst = (pv_spec_t *) _value;
|
|
-
|
|
|
|
|
|
+
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
if (parse_sip_msg_uri(_msg) < 0) {
|
|
LM_ERR("ruri parsing failed\n");
|
|
LM_ERR("ruri parsing failed\n");
|
|
return -1;
|
|
return -1;
|
|
@@ -710,7 +710,7 @@ int get_uri_param(struct sip_msg* _msg, char* _param, char* _value)
|
|
params = params->next;
|
|
params = params->next;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
free_params(params);
|
|
free_params(params);
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
@@ -726,10 +726,10 @@ found:
|
|
*/
|
|
*/
|
|
int is_tel_number(sip_msg_t *msg, char *_sp, char* _s2)
|
|
int is_tel_number(sip_msg_t *msg, char *_sp, char* _s2)
|
|
{
|
|
{
|
|
- str tval = {0, 0};
|
|
|
|
- int i;
|
|
|
|
|
|
+ str tval = {0, 0};
|
|
|
|
+ int i;
|
|
|
|
|
|
- if(fixup_get_svalue(msg, (gparam_t*)_sp, &tval)!=0)
|
|
|
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t*)_sp, &tval)!=0)
|
|
{
|
|
{
|
|
LM_ERR("cannot get parameter value\n");
|
|
LM_ERR("cannot get parameter value\n");
|
|
return -1;
|
|
return -1;
|
|
@@ -760,10 +760,10 @@ int is_tel_number(sip_msg_t *msg, char *_sp, char* _s2)
|
|
*/
|
|
*/
|
|
int is_numeric(sip_msg_t *msg, char *_sp, char* _s2)
|
|
int is_numeric(sip_msg_t *msg, char *_sp, char* _s2)
|
|
{
|
|
{
|
|
- str tval = {0, 0};
|
|
|
|
- int i;
|
|
|
|
|
|
+ str tval = {0, 0};
|
|
|
|
+ int i;
|
|
|
|
|
|
- if(fixup_get_svalue(msg, (gparam_t*)_sp, &tval)!=0)
|
|
|
|
|
|
+ if(fixup_get_svalue(msg, (gparam_t*)_sp, &tval)!=0)
|
|
{
|
|
{
|
|
LM_ERR("cannot get parameter value\n");
|
|
LM_ERR("cannot get parameter value\n");
|
|
return -1;
|
|
return -1;
|