00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "asterisk.h"
00027
00028 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 369001 $")
00029
00030 #include "include/sip.h"
00031 #include "include/config_parser.h"
00032 #include "include/sip_utils.h"
00033
00034
00035
00036
00037
00038
00039 int sip_parse_register_line(struct sip_registry *reg, int default_expiry, const char *value, int lineno)
00040 {
00041 int portnum = 0;
00042 int domainport = 0;
00043 enum sip_transport transport = SIP_TRANSPORT_UDP;
00044 char buf[256] = "";
00045 char *userpart = NULL, *hostpart = NULL;
00046
00047 AST_DECLARE_APP_ARGS(pre1,
00048 AST_APP_ARG(peer);
00049 AST_APP_ARG(userpart);
00050 );
00051 AST_DECLARE_APP_ARGS(pre2,
00052 AST_APP_ARG(transport);
00053 AST_APP_ARG(blank);
00054 AST_APP_ARG(userpart);
00055 );
00056 AST_DECLARE_APP_ARGS(user1,
00057 AST_APP_ARG(userpart);
00058 AST_APP_ARG(secret);
00059 AST_APP_ARG(authuser);
00060 );
00061 AST_DECLARE_APP_ARGS(user2,
00062 AST_APP_ARG(user);
00063 AST_APP_ARG(domain);
00064 );
00065 AST_DECLARE_APP_ARGS(user3,
00066 AST_APP_ARG(authuser);
00067 AST_APP_ARG(domainport);
00068 );
00069 AST_DECLARE_APP_ARGS(host1,
00070 AST_APP_ARG(hostpart);
00071 AST_APP_ARG(expiry);
00072 );
00073 AST_DECLARE_APP_ARGS(host2,
00074 AST_APP_ARG(hostpart);
00075 AST_APP_ARG(extension);
00076 );
00077 AST_DECLARE_APP_ARGS(host3,
00078 AST_APP_ARG(host);
00079 AST_APP_ARG(port);
00080 );
00081
00082 if (!value) {
00083 return -1;
00084 }
00085
00086 if (!reg) {
00087 return -1;
00088 }
00089 ast_copy_string(buf, value, sizeof(buf));
00090
00091
00092
00093
00094
00095
00096 if ((hostpart = strrchr(buf, '@'))) {
00097 *hostpart++ = '\0';
00098 userpart = buf;
00099 }
00100
00101 if (ast_strlen_zero(userpart) || ast_strlen_zero(hostpart)) {
00102 ast_log(LOG_WARNING, "Format for registration is [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry] at line %d\n", lineno);
00103 return -1;
00104 }
00105
00106
00107
00108
00109
00110
00111 AST_NONSTANDARD_RAW_ARGS(pre1, userpart, '?');
00112 if (ast_strlen_zero(pre1.userpart)) {
00113 pre1.userpart = pre1.peer;
00114 pre1.peer = NULL;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123 AST_NONSTANDARD_RAW_ARGS(pre2, pre1.userpart, '/');
00124 if (ast_strlen_zero(pre2.userpart)) {
00125 pre2.userpart = pre2.transport;
00126 pre2.transport = NULL;
00127 } else {
00128 pre2.transport[strlen(pre2.transport) - 1] = '\0';
00129 }
00130
00131 if (!ast_strlen_zero(pre2.blank)) {
00132 ast_log(LOG_WARNING, "Format for registration is [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry] at line %d\n", lineno);
00133 return -1;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 AST_NONSTANDARD_RAW_ARGS(user1, pre2.userpart, ':');
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 AST_NONSTANDARD_RAW_ARGS(host1, hostpart, '~');
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 AST_NONSTANDARD_RAW_ARGS(host2, host1.hostpart, '/');
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 AST_NONSTANDARD_RAW_ARGS(host3, host2.hostpart, ':');
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 AST_NONSTANDARD_RAW_ARGS(user2, user1.userpart, '@');
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 AST_NONSTANDARD_RAW_ARGS(user3, user1.authuser, ':');
00210
00211
00212
00213 if (user3.argc == 2) {
00214 char *reorder = user3.domainport;
00215 user3.domainport = user1.secret;
00216 user1.secret = user3.authuser;
00217 user3.authuser = reorder;
00218 }
00219
00220 if (host3.port) {
00221 if (!(portnum = port_str2int(host3.port, 0))) {
00222 ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", host3.port, lineno);
00223 }
00224 }
00225 if (user3.domainport) {
00226 if (!(domainport = port_str2int(user3.domainport, 0))) {
00227 ast_log(LOG_NOTICE, "'%s' is not a valid domain port number on line %d of sip.conf. using default.\n", user3.domainport, lineno);
00228 }
00229 }
00230
00231
00232 if (!pre2.transport) {
00233 transport = SIP_TRANSPORT_UDP;
00234 } else if (!strncasecmp(pre2.transport, "tcp", 3)) {
00235 transport = SIP_TRANSPORT_TCP;
00236 } else if (!strncasecmp(pre2.transport, "tls", 3)) {
00237 transport = SIP_TRANSPORT_TLS;
00238 } else if (!strncasecmp(pre2.transport, "udp", 3)) {
00239 transport = SIP_TRANSPORT_UDP;
00240 } else {
00241 transport = SIP_TRANSPORT_UDP;
00242 ast_log(LOG_NOTICE, "'%.3s' is not a valid transport type on line %d of sip.conf. defaulting to udp.\n", pre2.transport, lineno);
00243 }
00244
00245
00246 if (!portnum) {
00247 if (transport == SIP_TRANSPORT_TLS) {
00248 portnum = STANDARD_TLS_PORT;
00249 } else {
00250 portnum = STANDARD_SIP_PORT;
00251 }
00252 }
00253
00254
00255 ast_string_field_set(reg, callback, ast_strip_quoted(S_OR(host2.extension, "s"), "\"", "\""));
00256 ast_string_field_set(reg, username, ast_strip_quoted(S_OR(user2.user, ""), "\"", "\""));
00257 ast_string_field_set(reg, hostname, ast_strip_quoted(S_OR(host3.host, ""), "\"", "\""));
00258 ast_string_field_set(reg, authuser, ast_strip_quoted(S_OR(user3.authuser, ""), "\"", "\""));
00259 ast_string_field_set(reg, secret, ast_strip_quoted(S_OR(user1.secret, ""), "\"", "\""));
00260 ast_string_field_set(reg, peername, ast_strip_quoted(S_OR(pre1.peer, ""), "\"", "\""));
00261 ast_string_field_set(reg, regdomain, ast_strip_quoted(S_OR(user2.domain, ""), "\"", "\""));
00262
00263 reg->transport = transport;
00264 reg->timeout = reg->expire = -1;
00265 reg->portno = portnum;
00266 reg->regdomainport = domainport;
00267 reg->callid_valid = FALSE;
00268 reg->ocseq = INITIAL_CSEQ;
00269 reg->refresh = reg->expiry = reg->configured_expiry = (host1.expiry ? atoi(ast_strip_quoted(host1.expiry, "\"", "\"")) : default_expiry);
00270
00271 return 0;
00272 }
00273
00274 AST_TEST_DEFINE(sip_parse_register_line_test)
00275 {
00276 int res = AST_TEST_PASS;
00277 struct sip_registry *reg;
00278 int default_expiry = 120;
00279 const char *reg1 = "name@domain";
00280 const char *reg2 = "name:pass@domain";
00281 const char *reg3 = "name@namedomain:pass:authuser@domain";
00282 const char *reg4 = "name@namedomain:pass:authuser@domain/extension";
00283 const char *reg5 = "tcp://name@namedomain:pass:authuser@domain/extension";
00284 const char *reg6 = "tls://name@namedomain:pass:authuser@domain/extension~111";
00285 const char *reg7 = "peer?tcp://name@namedomain:pass:authuser@domain:1234/extension~111";
00286 const char *reg8 = "peer?name@namedomain:pass:authuser@domain:1234/extension~111";
00287 const char *reg9 = "peer?name:pass:authuser:1234/extension~111";
00288 const char *reg10 = "@domin:1234";
00289 const char *reg12 = "name@namedomain:4321:pass:authuser@domain";
00290 const char *reg13 = "name@namedomain:4321::@domain";
00291
00292 switch (cmd) {
00293 case TEST_INIT:
00294 info->name = "sip_parse_register_line_test";
00295 info->category = "/channels/chan_sip/";
00296 info->summary = "tests sip register line parsing";
00297 info->description =
00298 "Tests parsing of various register line configurations. "
00299 "Verifies output matches expected behavior.";
00300 return AST_TEST_NOT_RUN;
00301 case TEST_EXECUTE:
00302 break;
00303 }
00304
00305
00306 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00307 goto alloc_fail;
00308 } else if (
00309 sip_parse_register_line(reg, default_expiry, reg1, 1) ||
00310 strcmp(reg->callback, "s") ||
00311 strcmp(reg->username, "name") ||
00312 strcmp(reg->regdomain, "") ||
00313 strcmp(reg->hostname, "domain") ||
00314 strcmp(reg->authuser, "") ||
00315 strcmp(reg->secret, "") ||
00316 strcmp(reg->peername, "") ||
00317 reg->transport != SIP_TRANSPORT_UDP ||
00318 reg->timeout != -1 ||
00319 reg->expire != -1 ||
00320 reg->refresh != default_expiry ||
00321 reg->expiry != default_expiry ||
00322 reg->configured_expiry != default_expiry ||
00323 reg->portno != STANDARD_SIP_PORT ||
00324 (reg->regdomainport) ||
00325 reg->callid_valid != FALSE ||
00326 reg->ocseq != INITIAL_CSEQ) {
00327
00328 ast_test_status_update(test, "Test 1: simple config failed\n");
00329 res = AST_TEST_FAIL;
00330 }
00331 ast_string_field_free_memory(reg);
00332 ast_free(reg);
00333
00334
00335 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00336 goto alloc_fail;
00337 } else if (
00338 sip_parse_register_line(reg, default_expiry, reg2, 1) ||
00339 strcmp(reg->callback, "s") ||
00340 strcmp(reg->username, "name") ||
00341 strcmp(reg->regdomain, "") ||
00342 strcmp(reg->hostname, "domain") ||
00343 strcmp(reg->authuser, "") ||
00344 strcmp(reg->secret, "pass") ||
00345 strcmp(reg->peername, "") ||
00346 reg->transport != SIP_TRANSPORT_UDP ||
00347 reg->timeout != -1 ||
00348 reg->expire != -1 ||
00349 reg->refresh != default_expiry ||
00350 reg->expiry != default_expiry ||
00351 reg->configured_expiry != default_expiry ||
00352 reg->portno != STANDARD_SIP_PORT ||
00353 (reg->regdomainport) ||
00354 reg->callid_valid != FALSE ||
00355 reg->ocseq != INITIAL_CSEQ) {
00356
00357 ast_test_status_update(test, "Test 2: add secret failed\n");
00358 res = AST_TEST_FAIL;
00359 }
00360 ast_string_field_free_memory(reg);
00361 ast_free(reg);
00362
00363
00364 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00365 goto alloc_fail;
00366 } else if (
00367 sip_parse_register_line(reg, default_expiry, reg3, 1) ||
00368 strcmp(reg->callback, "s") ||
00369 strcmp(reg->username, "name") ||
00370 strcmp(reg->regdomain, "namedomain") ||
00371 strcmp(reg->hostname, "domain") ||
00372 strcmp(reg->authuser, "authuser") ||
00373 strcmp(reg->secret, "pass") ||
00374 strcmp(reg->peername, "") ||
00375 reg->transport != SIP_TRANSPORT_UDP ||
00376 reg->timeout != -1 ||
00377 reg->expire != -1 ||
00378 reg->refresh != default_expiry ||
00379 reg->expiry != default_expiry ||
00380 reg->configured_expiry != default_expiry ||
00381 reg->portno != STANDARD_SIP_PORT ||
00382 (reg->regdomainport) ||
00383 reg->callid_valid != FALSE ||
00384 reg->ocseq != INITIAL_CSEQ) {
00385
00386 ast_test_status_update(test, "Test 3: add userdomain and authuser failed\n");
00387 res = AST_TEST_FAIL;
00388 }
00389 ast_string_field_free_memory(reg);
00390 ast_free(reg);
00391
00392
00393 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00394 goto alloc_fail;
00395 } else if (
00396 sip_parse_register_line(reg, default_expiry, reg4, 1) ||
00397 strcmp(reg->callback, "extension") ||
00398 strcmp(reg->username, "name") ||
00399 strcmp(reg->regdomain, "namedomain") ||
00400 strcmp(reg->hostname, "domain") ||
00401 strcmp(reg->authuser, "authuser") ||
00402 strcmp(reg->secret, "pass") ||
00403 strcmp(reg->peername, "") ||
00404 reg->transport != SIP_TRANSPORT_UDP ||
00405 reg->timeout != -1 ||
00406 reg->expire != -1 ||
00407 reg->refresh != default_expiry ||
00408 reg->expiry != default_expiry ||
00409 reg->configured_expiry != default_expiry ||
00410 reg->portno != STANDARD_SIP_PORT ||
00411 (reg->regdomainport) ||
00412 reg->callid_valid != FALSE ||
00413 reg->ocseq != INITIAL_CSEQ) {
00414
00415 ast_test_status_update(test, "Test 4: add callback extension failed\n");
00416 res = AST_TEST_FAIL;
00417 }
00418 ast_string_field_free_memory(reg);
00419 ast_free(reg);
00420
00421
00422 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00423 goto alloc_fail;
00424 } else if (
00425 sip_parse_register_line(reg, default_expiry, reg5, 1) ||
00426 strcmp(reg->callback, "extension") ||
00427 strcmp(reg->username, "name") ||
00428 strcmp(reg->regdomain, "namedomain") ||
00429 strcmp(reg->hostname, "domain") ||
00430 strcmp(reg->authuser, "authuser") ||
00431 strcmp(reg->secret, "pass") ||
00432 strcmp(reg->peername, "") ||
00433 reg->transport != SIP_TRANSPORT_TCP ||
00434 reg->timeout != -1 ||
00435 reg->expire != -1 ||
00436 reg->refresh != default_expiry ||
00437 reg->expiry != default_expiry ||
00438 reg->configured_expiry != default_expiry ||
00439 reg->portno != STANDARD_SIP_PORT ||
00440 (reg->regdomainport) ||
00441 reg->callid_valid != FALSE ||
00442 reg->ocseq != INITIAL_CSEQ) {
00443
00444 ast_test_status_update(test, "Test 5: add transport failed\n");
00445 res = AST_TEST_FAIL;
00446 }
00447 ast_string_field_free_memory(reg);
00448 ast_free(reg);
00449
00450
00451 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00452 goto alloc_fail;
00453 } else if (
00454 sip_parse_register_line(reg, default_expiry, reg6, 1) ||
00455 strcmp(reg->callback, "extension") ||
00456 strcmp(reg->username, "name") ||
00457 strcmp(reg->regdomain, "namedomain") ||
00458 strcmp(reg->hostname, "domain") ||
00459 strcmp(reg->authuser, "authuser") ||
00460 strcmp(reg->secret, "pass") ||
00461 strcmp(reg->peername, "") ||
00462 reg->transport != SIP_TRANSPORT_TLS ||
00463 reg->timeout != -1 ||
00464 reg->expire != -1 ||
00465 reg->refresh != 111 ||
00466 reg->expiry != 111 ||
00467 reg->configured_expiry != 111 ||
00468 reg->portno != STANDARD_TLS_PORT ||
00469 (reg->regdomainport) ||
00470 reg->callid_valid != FALSE ||
00471 reg->ocseq != INITIAL_CSEQ) {
00472
00473 ast_test_status_update(test, "Test 6: change to tls transport and add expiry failed\n");
00474 res = AST_TEST_FAIL;
00475 }
00476 ast_string_field_free_memory(reg);
00477 ast_free(reg);
00478
00479
00480 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00481 goto alloc_fail;
00482 } else if (
00483 sip_parse_register_line(reg, default_expiry, reg7, 1) ||
00484 strcmp(reg->callback, "extension") ||
00485 strcmp(reg->username, "name") ||
00486 strcmp(reg->regdomain, "namedomain") ||
00487 strcmp(reg->hostname, "domain") ||
00488 strcmp(reg->authuser, "authuser") ||
00489 strcmp(reg->secret, "pass") ||
00490 strcmp(reg->peername, "peer") ||
00491 reg->transport != SIP_TRANSPORT_TCP ||
00492 reg->timeout != -1 ||
00493 reg->expire != -1 ||
00494 reg->refresh != 111 ||
00495 reg->expiry != 111 ||
00496 reg->configured_expiry != 111 ||
00497 reg->portno != 1234 ||
00498 (reg->regdomainport) ||
00499 reg->callid_valid != FALSE ||
00500 reg->ocseq != INITIAL_CSEQ) {
00501
00502 ast_test_status_update(test, "Test 7, change transport to tcp, add custom port, and add peer failed.\n");
00503 res = AST_TEST_FAIL;
00504 }
00505 ast_string_field_free_memory(reg);
00506 ast_free(reg);
00507
00508
00509 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00510 goto alloc_fail;
00511 } else if (
00512 sip_parse_register_line(reg, default_expiry, reg8, 1) ||
00513 strcmp(reg->callback, "extension") ||
00514 strcmp(reg->username, "name") ||
00515 strcmp(reg->regdomain, "namedomain") ||
00516 strcmp(reg->hostname, "domain") ||
00517 strcmp(reg->authuser, "authuser") ||
00518 strcmp(reg->secret, "pass") ||
00519 strcmp(reg->peername, "peer") ||
00520 reg->transport != SIP_TRANSPORT_UDP ||
00521 reg->timeout != -1 ||
00522 reg->expire != -1 ||
00523 reg->refresh != 111 ||
00524 reg->expiry != 111 ||
00525 reg->configured_expiry != 111 ||
00526 reg->portno != 1234 ||
00527 (reg->regdomainport) ||
00528 reg->callid_valid != FALSE ||
00529 reg->ocseq != INITIAL_CSEQ) {
00530
00531 ast_test_status_update(test, "Test 8, remove transport failed.\n");
00532 res = AST_TEST_FAIL;
00533 }
00534 ast_string_field_free_memory(reg);
00535 ast_free(reg);
00536
00537
00538 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00539 goto alloc_fail;
00540 } else if (!sip_parse_register_line(reg, default_expiry, reg9, 1)) {
00541 ast_test_status_update(test,
00542 "Test 9, missing domain, expected to fail but did not.\n");
00543 res = AST_TEST_FAIL;
00544 }
00545 ast_string_field_free_memory(reg);
00546 ast_free(reg);
00547
00548
00549 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00550 goto alloc_fail;
00551 } else if (!sip_parse_register_line(reg, default_expiry, reg10, 1)) {
00552 ast_test_status_update(test,
00553 "Test 10, missing user expected to fail but did not\n");
00554 res = AST_TEST_FAIL;
00555 }
00556 ast_string_field_free_memory(reg);
00557 ast_free(reg);
00558
00559
00560 if (!sip_parse_register_line(NULL, default_expiry, reg1, 1)) {
00561 ast_test_status_update(test,
00562 "Test 11, no registry object, expected to fail but did not.\n");
00563 res = AST_TEST_FAIL;
00564 }
00565
00566
00567 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00568 goto alloc_fail;
00569 } else if (!sip_parse_register_line(reg, default_expiry, NULL, 1)) {
00570
00571 ast_test_status_update(test,
00572 "Test 12, NULL register line expected to fail but did not.\n");
00573 res = AST_TEST_FAIL;
00574 }
00575 ast_string_field_free_memory(reg);
00576 ast_free(reg);
00577
00578
00579 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00580 goto alloc_fail;
00581 } else if (
00582 sip_parse_register_line(reg, default_expiry, reg12, 1) ||
00583 strcmp(reg->callback, "s") ||
00584 strcmp(reg->username, "name") ||
00585 strcmp(reg->regdomain, "namedomain") ||
00586 strcmp(reg->hostname, "domain") ||
00587 strcmp(reg->authuser, "authuser") ||
00588 strcmp(reg->secret, "pass") ||
00589 strcmp(reg->peername, "") ||
00590 reg->transport != SIP_TRANSPORT_UDP ||
00591 reg->timeout != -1 ||
00592 reg->expire != -1 ||
00593 reg->refresh != default_expiry ||
00594 reg->expiry != default_expiry ||
00595 reg->configured_expiry != default_expiry ||
00596 reg->portno != STANDARD_SIP_PORT ||
00597 reg->regdomainport != 4321 ||
00598 reg->callid_valid != FALSE ||
00599 reg->ocseq != INITIAL_CSEQ) {
00600
00601 ast_test_status_update(test, "Test 13, add domain port failed.\n");
00602 res = AST_TEST_FAIL;
00603 }
00604 ast_string_field_free_memory(reg);
00605 ast_free(reg);
00606
00607
00608 if (!(reg = ast_calloc_with_stringfields(1, struct sip_registry, 256))) {
00609 goto alloc_fail;
00610 } else if (
00611 sip_parse_register_line(reg, default_expiry, reg13, 1) ||
00612 strcmp(reg->callback, "s") ||
00613 strcmp(reg->username, "name") ||
00614 strcmp(reg->regdomain, "namedomain") ||
00615 strcmp(reg->hostname, "domain") ||
00616 strcmp(reg->authuser, "") ||
00617 strcmp(reg->secret, "") ||
00618 strcmp(reg->peername, "") ||
00619 reg->transport != SIP_TRANSPORT_UDP ||
00620 reg->timeout != -1 ||
00621 reg->expire != -1 ||
00622 reg->refresh != default_expiry ||
00623 reg->expiry != default_expiry ||
00624 reg->configured_expiry != default_expiry ||
00625 reg->portno != STANDARD_SIP_PORT ||
00626 reg->regdomainport != 4321 ||
00627 reg->callid_valid != FALSE ||
00628 reg->ocseq != INITIAL_CSEQ) {
00629
00630 ast_test_status_update(test, "Test 14, domain port without secret failed.\n");
00631 res = AST_TEST_FAIL;
00632 }
00633 ast_string_field_free_memory(reg);
00634 ast_free(reg);
00635
00636
00637 return res;
00638
00639 alloc_fail:
00640 ast_test_status_update(test, "Out of memory. \n");
00641 return res;
00642 }
00643
00644 int sip_parse_host(char *line, int lineno, char **hostname, int *portnum, enum sip_transport *transport)
00645 {
00646 char *port;
00647
00648 if (ast_strlen_zero(line)) {
00649 *hostname = NULL;
00650 return -1;
00651 }
00652 if ((*hostname = strstr(line, "://"))) {
00653 *hostname += 3;
00654
00655 if (!strncasecmp(line, "tcp", 3))
00656 *transport = SIP_TRANSPORT_TCP;
00657 else if (!strncasecmp(line, "tls", 3))
00658 *transport = SIP_TRANSPORT_TLS;
00659 else if (!strncasecmp(line, "udp", 3))
00660 *transport = SIP_TRANSPORT_UDP;
00661 else
00662 ast_log(LOG_NOTICE, "'%.3s' is not a valid transport type on line %d of sip.conf. defaulting to udp.\n", line, lineno);
00663 } else {
00664 *hostname = line;
00665 *transport = SIP_TRANSPORT_UDP;
00666 }
00667
00668 if ((line = strrchr(*hostname, '@')))
00669 line++;
00670 else
00671 line = *hostname;
00672
00673 if (ast_sockaddr_split_hostport(line, hostname, &port, 0) == 0) {
00674 ast_log(LOG_WARNING, "Cannot parse host '%s' on line %d of sip.conf.\n",
00675 line, lineno);
00676 return -1;
00677 }
00678
00679 if (port) {
00680 if (!sscanf(port, "%5u", portnum)) {
00681 ast_log(LOG_NOTICE, "'%s' is not a valid port number on line %d of sip.conf. using default.\n", port, lineno);
00682 port = NULL;
00683 }
00684 }
00685
00686 if (!port) {
00687 if (*transport & SIP_TRANSPORT_TLS) {
00688 *portnum = STANDARD_TLS_PORT;
00689 } else {
00690 *portnum = STANDARD_SIP_PORT;
00691 }
00692 }
00693
00694 return 0;
00695 }
00696
00697 AST_TEST_DEFINE(sip_parse_host_line_test)
00698 {
00699 int res = AST_TEST_PASS;
00700 char *host;
00701 int port;
00702 enum sip_transport transport;
00703 char host1[] = "www.blah.com";
00704 char host2[] = "tcp://www.blah.com";
00705 char host3[] = "tls://10.10.10.10";
00706 char host4[] = "tls://10.10.10.10:1234";
00707 char host5[] = "10.10.10.10:1234";
00708
00709 switch (cmd) {
00710 case TEST_INIT:
00711 info->name = "sip_parse_host_line_test";
00712 info->category = "/channels/chan_sip/";
00713 info->summary = "tests sip.conf host line parsing";
00714 info->description =
00715 "Tests parsing of various host line configurations. "
00716 "Verifies output matches expected behavior.";
00717 return AST_TEST_NOT_RUN;
00718 case TEST_EXECUTE:
00719 break;
00720 }
00721
00722
00723 sip_parse_host(host1, 1, &host, &port, &transport);
00724 if (port != STANDARD_SIP_PORT ||
00725 ast_strlen_zero(host) || strcmp(host, "www.blah.com") ||
00726 transport != SIP_TRANSPORT_UDP) {
00727 ast_test_status_update(test, "Test 1: simple host failed.\n");
00728 res = AST_TEST_FAIL;
00729 }
00730
00731
00732 sip_parse_host(host2, 1, &host, &port, &transport);
00733 if (port != STANDARD_SIP_PORT ||
00734 ast_strlen_zero(host) || strcmp(host, "www.blah.com") ||
00735 transport != SIP_TRANSPORT_TCP) {
00736 ast_test_status_update(test, "Test 2: tcp host failed.\n");
00737 res = AST_TEST_FAIL;
00738 }
00739
00740
00741 sip_parse_host(host3, 1, &host, &port, &transport);
00742 if (port != STANDARD_TLS_PORT ||
00743 ast_strlen_zero(host) || strcmp(host, "10.10.10.10") ||
00744 transport != SIP_TRANSPORT_TLS) {
00745 ast_test_status_update(test, "Test 3: tls host failed. \n");
00746 res = AST_TEST_FAIL;
00747 }
00748
00749
00750 sip_parse_host(host4, 1, &host, &port, &transport);
00751 if (port != 1234 || ast_strlen_zero(host) ||
00752 strcmp(host, "10.10.10.10") ||
00753 transport != SIP_TRANSPORT_TLS) {
00754 ast_test_status_update(test, "Test 4: tls host with custom port failed.\n");
00755 res = AST_TEST_FAIL;
00756 }
00757
00758
00759 sip_parse_host(host5, 1, &host, &port, &transport);
00760 if (port != 1234 || ast_strlen_zero(host) ||
00761 strcmp(host, "10.10.10.10") ||
00762 transport != SIP_TRANSPORT_UDP) {
00763 ast_test_status_update(test, "Test 5: simple host with custom port failed.\n");
00764 res = AST_TEST_FAIL;
00765 }
00766
00767
00768 if (!sip_parse_host(NULL, 1, &host, &port, &transport)) {
00769 ast_test_status_update(test, "Test 6: expected error on NULL input did not occur.\n");
00770 res = AST_TEST_FAIL;
00771 }
00772
00773 return res;
00774
00775 }
00776
00777
00778 void sip_config_parser_register_tests(void)
00779 {
00780 AST_TEST_REGISTER(sip_parse_register_line_test);
00781 AST_TEST_REGISTER(sip_parse_host_line_test);
00782 }
00783
00784
00785 void sip_config_parser_unregister_tests(void)
00786 {
00787 AST_TEST_UNREGISTER(sip_parse_register_line_test);
00788 AST_TEST_UNREGISTER(sip_parse_host_line_test);
00789 }
00790