From 1060a188cef89b3458850522394033ac3cde07e9 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Sun, 2 Mar 2014 09:13:05 +0000 Subject: [PATCH] Refactor and fix edge cases in switch_split_user_domain We were incorrectly parsing usernames and domains starting with "sip" if there was no sip: or sips: scheme in the string. We were also incorrectly parsing usernames containing a colon even if a scheme was given. This also refactors the function for hopefully greater clarity. --- src/switch_utils.c | 55 ++++++++++------------------------------------ 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/src/switch_utils.c b/src/switch_utils.c index 602cbc7d0d..77c7bd2c1f 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -3104,55 +3104,24 @@ SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val) SWITCH_DECLARE(int) switch_split_user_domain(char *in, char **user, char **domain) { - char *p = NULL, *h = NULL, *u; + char *p = NULL, *h = NULL, *u = NULL; - if (!in) { - return 0; - } + if (!in) return 0; - if (!strncasecmp(in, "sip", 3)) { - in += 3; - if (*in == 's') in++; - if (*in == ':') in++; - } + /* Remove URL scheme */ + if (!strncasecmp(in, "sip:", 4)) in += 4; + if (!strncasecmp(in, "sips:", 5)) in += 5; - u = in; - - /* First isolate the host part from the user part */ - if ((h = strchr(u, '@'))) { - *h++ = '\0'; - } else { - u = NULL; - h = in; - } - - /* Clean out the user part of its protocol prefix (if any) */ - if (u && (p = strchr(u, ':'))) { - *p++ = '\0'; - u = p; - } + /* Isolate the host part from the user part */ + if ((h = in, p = strchr(h, '@'))) *p = '\0', u = in, h = p+1; /* Clean out the host part of any suffix */ - if (h) { - if ((p = strchr(h, ':'))) { - *p = '\0'; - } - - if ((p = strchr(h, ';'))) { - *p = '\0'; - } - - if ((p = strchr(h, ' '))) { - *p = '\0'; - } - } - if (user) { - *user = u; - } - if (domain) { - *domain = h; - } + if ((p = strchr(h, ':'))) *p = '\0'; + if ((p = strchr(h, ';'))) *p = '\0'; + if ((p = strchr(h, ' '))) *p = '\0'; + if (user) *user = u; + if (domain) *domain = h; return 1; }