diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-08-21 21:02:50 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-08-21 21:02:50 +0000 |
commit | fc3aabd42e3919b2162b95d46fadc095945fee73 (patch) | |
tree | 0153d0b2cd22901ec13e639bac83fcccac1e115e /channels | |
parent | f6d3d21adb81e723a2f39a8d91e995289c2c98b5 (diff) |
fixes sip register parsing when user@domain is used
(issue #15008)
(issue #15672)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@213635 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index bb92dd1bb..8a15339fe 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7343,12 +7343,9 @@ static int sip_register(const char *value, int lineno) char buf[256] = ""; char *username = NULL; char *tmp = NULL, *transport_str = NULL; + char *userpart = NULL, *hostpart = NULL; char *peername = NULL; /* register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry] */ - AST_DECLARE_APP_ARGS(parts, - AST_APP_ARG(userpart); - AST_APP_ARG(hostpart); - ); AST_DECLARE_APP_ARGS(user1, AST_APP_ARG(userpart); AST_APP_ARG(secret); @@ -7377,17 +7374,26 @@ static int sip_register(const char *value, int lineno) /*! register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry] * becomes - * parts.userpart => [peer?][transport://]user[@domain][:secret[:authuser]] - * parts.hostpart => host[:port][/extension][~expiry] + * userpart => [peer?][transport://]user[@domain][:secret[:authuser]] + * hostpart => host[:port][/extension][~expiry] */ - AST_NONSTANDARD_RAW_ARGS(parts, buf, '@'); + if ((hostpart = strrchr(buf, '@'))) { + *hostpart++ = '\0'; + userpart = buf; + } + + if (ast_strlen_zero(userpart) || ast_strlen_zero(hostpart)) { + ast_log(LOG_WARNING, "Format for registration is [transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry] at line %d\n", lineno); + return -1; + } + /*! * user1.userpart => [peer?][transport://]user[@domain] * user1.secret => secret * user1.authuser => authuser - * parts.hostpart => host[:port][/extension][~expiry] + * hostpart => host[:port][/extension][~expiry] */ - AST_NONSTANDARD_RAW_ARGS(user1, parts.userpart, ':'); + AST_NONSTANDARD_RAW_ARGS(user1, userpart, ':'); /*! * user1.userpart => [peer?][transport://]user[@domain] @@ -7396,7 +7402,7 @@ static int sip_register(const char *value, int lineno) * host1.hostpart => host[:port][/extension] * host1.expiry => [expiry] */ - AST_NONSTANDARD_RAW_ARGS(host1, parts.hostpart, '~'); + AST_NONSTANDARD_RAW_ARGS(host1, hostpart, '~'); /*! * user1.userpart => [peer?][transport://]user[@domain] @@ -7406,7 +7412,7 @@ static int sip_register(const char *value, int lineno) * host2.extension => [extension] * host1.expiry => [expiry] */ - AST_NONSTANDARD_RAW_ARGS(host2, parts.hostpart, '/'); + AST_NONSTANDARD_RAW_ARGS(host2, hostpart, '/'); /*! * user1.userpart => [peer?][transport://]user[@domain] @@ -7417,7 +7423,18 @@ static int sip_register(const char *value, int lineno) * host2.extension => extension * host1.expiry => expiry */ - AST_NONSTANDARD_RAW_ARGS(host3, parts.hostpart, ':'); + AST_NONSTANDARD_RAW_ARGS(host3, hostpart, ':'); + + /*! + * user2.userpart => [peer?][transport://]user[@domain] + * user1.secret => secret + * user1.authuser => authuser + * host3.host => host + * host3.port => port + * host2.extension => extension (callback) + * host1.expiry => expiry + */ + AST_NONSTANDARD_RAW_ARGS(user2, user1.userpart, ':'); /*! * user2.userpart => [peer?][transport://]user @@ -7429,7 +7446,7 @@ static int sip_register(const char *value, int lineno) * host2.extension => extension (callback) * host1.expiry => expiry */ - AST_NONSTANDARD_RAW_ARGS(user2, user1.userpart, ':'); + AST_NONSTANDARD_RAW_ARGS(user2, user2.userpart, '@'); if ((tmp = strchr(user2.userpart, '?'))) { *tmp = '\0'; |