diff options
author | David Vossel <dvossel@digium.com> | 2010-05-26 19:46:49 +0000 |
---|---|---|
committer | David Vossel <dvossel@digium.com> | 2010-05-26 19:46:49 +0000 |
commit | 77a96c5a93076926468680267a53140c2f4b842b (patch) | |
tree | a2e2c262b493d64222ad1ee9ae67cb477048123d /channels/sip/config_parser.c | |
parent | 07500098c1eafdad2dd6cab5f4e343465c8916d0 (diff) |
do all sip registry parsing before transmit_register
This patch breaks up every part of the sip registry string during
config parsing and removes all parsing from transmit_register().
Thanks to Nick_Lewis for contributing this patch!
(closes issue #14331)
Reported by: Nick_Lewis
Patches:
chan_sip.c-domparse.patch uploaded by Nick Lewis (license 657)
chan_sip.c.patch uploaded by Nick Lewis (license 657)
chan_sip.c.domainparse3.patch uploaded by Nick Lewis (license 657)
chan_sip.c-domparse4.patch uploaded by Nick Lewis (license 657)
chan_sip.c-domparse5.patch uploaded by Nick Lewis (license 657)
nicklewispatch.diff uploaded by dvossel (license 671)
Tested by: Nick_Lewis, dvossel
Review: https://reviewboard.asterisk.org/r/628/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@266090 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/sip/config_parser.c')
-rw-r--r-- | channels/sip/config_parser.c | 144 |
1 files changed, 135 insertions, 9 deletions
diff --git a/channels/sip/config_parser.c b/channels/sip/config_parser.c index d800c5582..988231f12 100644 --- a/channels/sip/config_parser.c +++ b/channels/sip/config_parser.c @@ -35,6 +35,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") int sip_parse_register_line(struct sip_registry *reg, int default_expiry, const char *value, int lineno) { int portnum = 0; + int domainport = 0; enum sip_transport transport = SIP_TRANSPORT_UDP; char buf[256] = ""; char *userpart = NULL, *hostpart = NULL; @@ -53,6 +54,14 @@ int sip_parse_register_line(struct sip_registry *reg, int default_expiry, const AST_APP_ARG(secret); AST_APP_ARG(authuser); ); + AST_DECLARE_APP_ARGS(user2, + AST_APP_ARG(user); + AST_APP_ARG(domain); + ); + AST_DECLARE_APP_ARGS(user3, + AST_APP_ARG(authuser); + AST_APP_ARG(domainport); + ); AST_DECLARE_APP_ARGS(host1, AST_APP_ARG(hostpart); AST_APP_ARG(expiry); @@ -166,11 +175,54 @@ int sip_parse_register_line(struct sip_registry *reg, int default_expiry, const */ AST_NONSTANDARD_RAW_ARGS(host3, host2.hostpart, ':'); + /*! + * pre1.peer => peer + * pre2.transport = transport + * user2.user => user + * user2.domain => domain + * user1.secret => secret + * user1.authuser => authuser + * host3.host => host + * host3.port => port + * host2.extension => extension + * host1.expiry => expiry + */ + AST_NONSTANDARD_RAW_ARGS(user2, user1.userpart, '@'); + + /*! + * pre1.peer => peer + * pre2.transport = transport + * user2.user => user + * user2.domain => domain + * user1.secret => secret + * user3.authuser => authuser + * user3.domainport => domainport + * host3.host => host + * host3.port => port + * host2.extension => extension + * host1.expiry => expiry + */ + AST_NONSTANDARD_RAW_ARGS(user3, user1.authuser, ':'); + + /* Reordering needed due to fields being [(:secret[:username])|(:regdomainport:secret:username)] + but parsing being [secret[:username[:regdomainport]]] */ + if (user3.argc == 2) { + char *reorder = user3.domainport; + user3.domainport = user1.secret; + user1.secret = user3.authuser; + user3.authuser = reorder; + } + if (host3.port) { if (!(portnum = port_str2int(host3.port, 0))) { ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", host3.port, lineno); } } + if (user3.domainport) { + if (!(domainport = port_str2int(user3.domainport, 0))) { + ast_log(LOG_NOTICE, "'%s' is not a valid domain port number on line %d of sip.conf. using default.\n", user3.domainport, lineno); + } + } /* set transport type */ if (!pre2.transport) { @@ -197,15 +249,17 @@ int sip_parse_register_line(struct sip_registry *reg, int default_expiry, const /* copy into sip_registry object */ ast_string_field_set(reg, callback, ast_strip_quoted(S_OR(host2.extension, "s"), "\"", "\"")); - ast_string_field_set(reg, username, ast_strip_quoted(S_OR(user1.userpart, ""), "\"", "\"")); + ast_string_field_set(reg, username, ast_strip_quoted(S_OR(user2.user, ""), "\"", "\"")); ast_string_field_set(reg, hostname, ast_strip_quoted(S_OR(host3.host, ""), "\"", "\"")); - ast_string_field_set(reg, authuser, ast_strip_quoted(S_OR(user1.authuser, ""), "\"", "\"")); + ast_string_field_set(reg, authuser, ast_strip_quoted(S_OR(user3.authuser, ""), "\"", "\"")); ast_string_field_set(reg, secret, ast_strip_quoted(S_OR(user1.secret, ""), "\"", "\"")); ast_string_field_set(reg, peername, ast_strip_quoted(S_OR(pre1.peer, ""), "\"", "\"")); + ast_string_field_set(reg, regdomain, ast_strip_quoted(S_OR(user2.domain, ""), "\"", "\"")); reg->transport = transport; reg->timeout = reg->expire = -1; reg->portno = portnum; + reg->regdomainport = domainport; reg->callid_valid = FALSE; reg->ocseq = INITIAL_CSEQ; reg->refresh = reg->expiry = reg->configured_expiry = (host1.expiry ? atoi(ast_strip_quoted(host1.expiry, "\"", "\"")) : default_expiry); @@ -228,6 +282,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) const char *reg8 = "peer?name@namedomain:pass:authuser@domain:1234/extension~111"; const char *reg9 = "peer?name:pass:authuser:1234/extension~111"; const char *reg10 = "@domin:1234"; + const char *reg12 = "name@namedomain:4321:pass:authuser@domain"; + const char *reg13 = "name@namedomain:4321::@domain"; switch (cmd) { case TEST_INIT: @@ -249,6 +305,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) sip_parse_register_line(reg, default_expiry, reg1, 1) || strcmp(reg->callback, "s") || strcmp(reg->username, "name") || + strcmp(reg->regdomain, "") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "") || strcmp(reg->secret, "") || @@ -260,6 +317,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != default_expiry || reg->configured_expiry != default_expiry || reg->portno != STANDARD_SIP_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -276,6 +334,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) sip_parse_register_line(reg, default_expiry, reg2, 1) || strcmp(reg->callback, "s") || strcmp(reg->username, "name") || + strcmp(reg->regdomain, "") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "") || strcmp(reg->secret, "pass") || @@ -287,6 +346,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != default_expiry || reg->configured_expiry != default_expiry || reg->portno != STANDARD_SIP_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -302,7 +362,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg3, 1) || strcmp(reg->callback, "s") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -314,6 +375,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != default_expiry || reg->configured_expiry != default_expiry || reg->portno != STANDARD_SIP_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -329,7 +391,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg4, 1) || strcmp(reg->callback, "extension") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -341,6 +404,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != default_expiry || reg->configured_expiry != default_expiry || reg->portno != STANDARD_SIP_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -356,7 +420,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg5, 1) || strcmp(reg->callback, "extension") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -368,6 +433,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != default_expiry || reg->configured_expiry != default_expiry || reg->portno != STANDARD_SIP_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -383,7 +449,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg6, 1) || strcmp(reg->callback, "extension") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -395,6 +462,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != 111 || reg->configured_expiry != 111 || reg->portno != STANDARD_TLS_PORT || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -410,7 +478,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg7, 1) || strcmp(reg->callback, "extension") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -422,6 +491,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != 111 || reg->configured_expiry != 111 || reg->portno != 1234 || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -437,7 +507,8 @@ AST_TEST_DEFINE(sip_parse_register_line_test) } else if ( sip_parse_register_line(reg, default_expiry, reg8, 1) || strcmp(reg->callback, "extension") || - strcmp(reg->username, "name@namedomain") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || strcmp(reg->hostname, "domain") || strcmp(reg->authuser, "authuser") || strcmp(reg->secret, "pass") || @@ -449,6 +520,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) reg->expiry != 111 || reg->configured_expiry != 111 || reg->portno != 1234 || + (reg->regdomainport) || reg->callid_valid != FALSE || reg->ocseq != INITIAL_CSEQ) { @@ -458,6 +530,60 @@ AST_TEST_DEFINE(sip_parse_register_line_test) ast_string_field_free_memory(reg); ast_free(reg); + /* ---Test reg12, add domain port --- */ + if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) { + goto alloc_fail; + } else if ( + sip_parse_register_line(reg, default_expiry, reg12, 1) || + strcmp(reg->callback, "s") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || + strcmp(reg->hostname, "domain") || + strcmp(reg->authuser, "authuser") || + strcmp(reg->secret, "pass") || + strcmp(reg->peername, "") || + reg->transport != SIP_TRANSPORT_UDP || + reg->timeout != -1 || + reg->expire != -1 || + reg->refresh != default_expiry || + reg->expiry != default_expiry || + reg->configured_expiry != default_expiry || + reg->portno != STANDARD_SIP_PORT || + reg->regdomainport != 4321 || + reg->callid_valid != FALSE || + reg->ocseq != INITIAL_CSEQ) { + + ast_test_status_update(test, "Test 12, add domain port failed.\n"); + res = AST_TEST_FAIL; + } + + /* ---Test reg13, domain port without secret --- */ + if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) { + goto alloc_fail; + } else if ( + sip_parse_register_line(reg, default_expiry, reg13, 1) || + strcmp(reg->callback, "s") || + strcmp(reg->username, "name") || + strcmp(reg->regdomain, "namedomain") || + strcmp(reg->hostname, "domain") || + strcmp(reg->authuser, "") || + strcmp(reg->secret, "") || + strcmp(reg->peername, "") || + reg->transport != SIP_TRANSPORT_UDP || + reg->timeout != -1 || + reg->expire != -1 || + reg->refresh != default_expiry || + reg->expiry != default_expiry || + reg->configured_expiry != default_expiry || + reg->portno != STANDARD_SIP_PORT || + reg->regdomainport != 4321 || + reg->callid_valid != FALSE || + reg->ocseq != INITIAL_CSEQ) { + + ast_test_status_update(test, "Test 13, domain port without secret failed.\n"); + res = AST_TEST_FAIL; +} + /* ---Test reg 9, missing domain, expected to fail --- */ if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) { goto alloc_fail; @@ -483,7 +609,7 @@ AST_TEST_DEFINE(sip_parse_register_line_test) /* ---Test reg 11, no registry object, expected to fail--- */ if (!sip_parse_register_line(NULL, default_expiry, reg1, 1)) { ast_test_status_update(test, - "Test 11, no registery object, expected to fail but did not.\n"); + "Test 11, no registry object, expected to fail but did not.\n"); res = AST_TEST_FAIL; } |