[commit] r8020 - in freeswitch/trunk/src: . include mod/applications/mod_fifo mod/endpoints/mod_dingaling
Author: anthm Date: Fri Apr 4 11:17:17 2008 New Revision: 8020 Modified: freeswitch/trunk/src/include/switch_utils.h freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/trunk/src/switch_utils.c Log: add acl to mod_dingaling Modified: freeswitch/trunk/src/include/switch_utils.h ============================================================================== --- freeswitch/trunk/src/include/switch_utils.h (original) +++ freeswitch/trunk/src/include/switch_utils.h Fri Apr 4 11:17:17 2008 @@ -353,7 +353,7 @@ SWITCH_DECLARE(switch_status_t) switch_network_list_add_cidr(switch_network_list_t *list, const char *cidr_str, switch_bool_t ok); SWITCH_DECLARE(switch_status_t) switch_network_list_add_host_mask(switch_network_list_t *list, const char *host, const char *mask_str, switch_bool_t ok); SWITCH_DECLARE(switch_bool_t) switch_network_list_validate_ip(switch_network_list_t *list, uint32_t ip); -#define switch_test_subnet(_ip, _net, _mask) (_mask ? ((_net & _mask) == (_ip & _mask)) : _net == _ip) +#define switch_test_subnet(_ip, _net, _mask) (_mask ? ((_net & _mask) == (_ip & _mask)) : _net ? _net == _ip : 1) /* malloc or DIE macros */ Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c (original) +++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c Fri Apr 4 11:17:17 2008 @@ -467,7 +467,7 @@ while(switch_channel_ready(channel)) { int x = 0 ; pop = NULL; - + if (moh) { memset(&args, 0, sizeof(args)); args.read_frame_callback = read_frame_callback; Modified: freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c Fri Apr 4 11:17:17 2008 @@ -90,6 +90,8 @@ GFLAG_MY_CODEC_PREFS = (1 << 0) } GFLAGS; +#define MAX_ACL 100 + static struct { int debug; char *dialplan; @@ -140,6 +142,8 @@ ldl_handle_t *handle; uint32_t flags; uint32_t user_flags; + char *acl[MAX_ACL]; + uint32_t acl_count; }; typedef struct mdl_profile mdl_profile_t; @@ -1948,6 +1952,12 @@ profile->timer_name = switch_core_strdup(module_pool, val); } else if (!strcasecmp(var, "lanaddr") && !switch_strlen_zero(val)) { profile->lanaddr = switch_core_strdup(module_pool, val); + } else if (!strcasecmp(var, "candidate-acl")) { + if (profile->acl_count < MAX_ACL) { + profile->acl[profile->acl_count++] = strdup(val); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Max acl records of %d reached\n", MAX_ACL); + } } else if (!strcasecmp(var, "tls")) { if (switch_true(val)) { profile->user_flags |= LDL_FLAG_TLS; @@ -2826,7 +2836,8 @@ if (dl_signal) { ldl_candidate_t *candidates; unsigned int len = 0; - unsigned int x; + unsigned int x, choice = 0, ok = 0; + uint8_t lanaddr = 0; if (ldl_session_get_candidates(dlsession, &candidates, &len) != LDL_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Candidate Error!\n"); @@ -2843,81 +2854,110 @@ } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%u candidates\n", len); - for (x = 0; x < len; x++) { - uint8_t lanaddr = 0; + + if (profile->acl_count) { + for (x = 0; x < len; x++) { + int y = 0; + for (y = 0; y < profile->acl_count; y++) { + if (switch_check_network_list_ip(candidates[x].address, profile->acl[y])) { + choice = x; + ok = 1; + } - if (profile->lanaddr) { - lanaddr = strncasecmp(candidates[x].address, profile->lanaddr, strlen(profile->lanaddr)) ? 0 : 1; + if (ok) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "candidate %s:%d PASS ACL %s\n", + candidates[x].address, candidates[x].port, profile->acl[y]); + break; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "candidate %s:%d FAIL ACL %s\n", + candidates[x].address, candidates[x].port, profile->acl[y]); + } + } } + } else { + for (x = 0; x < len; x++) { + + if (profile->lanaddr) { + lanaddr = strncasecmp(candidates[x].address, profile->lanaddr, strlen(profile->lanaddr)) ? 0 : 1; + } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "candidates %s:%d\n", candidates[x].address, candidates[x].port); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "candidates %s:%d\n", candidates[x].address, candidates[x].port); - // 192.0.0.0 - 192.0.127.255 is marked as reserved, should we filter all of them? - if (!strcasecmp(candidates[x].protocol, "udp") && - (!strcasecmp(candidates[x].type, "local") || !strcasecmp(candidates[x].type, "stun")) && - ((profile->lanaddr && - lanaddr) || (strncasecmp(candidates[x].address, "10.", 3) && - strncasecmp(candidates[x].address, "192.168.", 8) && - strncasecmp(candidates[x].address, "127.", 4) && - strncasecmp(candidates[x].address, "255.", 4) && - strncasecmp(candidates[x].address, "0.", 2) && - strncasecmp(candidates[x].address, "1.", 2) && - strncasecmp(candidates[x].address, "2.", 2) && - strncasecmp(candidates[x].address, "172.16.", 7) && - strncasecmp(candidates[x].address, "172.17.", 7) && - strncasecmp(candidates[x].address, "172.18.", 7) && - strncasecmp(candidates[x].address, "172.19.", 7) && - strncasecmp(candidates[x].address, "172.2", 5) && - strncasecmp(candidates[x].address, "172.30.", 7) && - strncasecmp(candidates[x].address, "172.31.", 7) && - strncasecmp(candidates[x].address, "192.0.2.", 8) && - strncasecmp(candidates[x].address, "169.254.", 8) - ))) { - ldl_payload_t payloads[5]; - - memset(payloads, 0, sizeof(payloads)); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Acceptable Candidate %s:%d\n", candidates[x].address, candidates[x].port); - - if (!switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { - switch_set_flag_locked(tech_pvt, TFLAG_TRANSPORT_ACCEPT); - ldl_session_accept_candidate(dlsession, &candidates[x]); + // 192.0.0.0 - 192.0.127.255 is marked as reserved, should we filter all of them? + if (!strcasecmp(candidates[x].protocol, "udp") && + (!strcasecmp(candidates[x].type, "local") || !strcasecmp(candidates[x].type, "stun")) && + ((profile->lanaddr && + lanaddr) || (strncasecmp(candidates[x].address, "10.", 3) && + strncasecmp(candidates[x].address, "192.168.", 8) && + strncasecmp(candidates[x].address, "127.", 4) && + strncasecmp(candidates[x].address, "255.", 4) && + strncasecmp(candidates[x].address, "0.", 2) && + strncasecmp(candidates[x].address, "1.", 2) && + strncasecmp(candidates[x].address, "2.", 2) && + strncasecmp(candidates[x].address, "172.16.", 7) && + strncasecmp(candidates[x].address, "172.17.", 7) && + strncasecmp(candidates[x].address, "172.18.", 7) && + strncasecmp(candidates[x].address, "172.19.", 7) && + strncasecmp(candidates[x].address, "172.2", 5) && + strncasecmp(candidates[x].address, "172.30.", 7) && + strncasecmp(candidates[x].address, "172.31.", 7) && + strncasecmp(candidates[x].address, "192.0.2.", 8) && + strncasecmp(candidates[x].address, "169.254.", 8) + ))) { + choice = x; + ok = 1; } + } + } - if (!strcasecmp(subject, "candidates")) { - switch_set_flag_locked(tech_pvt, TFLAG_TRANSPORT_ACCEPT); - switch_set_flag_locked(tech_pvt, TFLAG_ANSWER); - } + if (ok) { + ldl_payload_t payloads[5]; + + memset(payloads, 0, sizeof(payloads)); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "Acceptable Candidate %s:%d\n", candidates[choice].address, candidates[choice].port); + + if (!switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { + switch_set_flag_locked(tech_pvt, TFLAG_TRANSPORT_ACCEPT); + ldl_session_accept_candidate(dlsession, &candidates[choice]); + } - if (lanaddr) { - switch_set_flag_locked(tech_pvt, TFLAG_LANADDR); - } + if (!strcasecmp(subject, "candidates")) { + switch_set_flag_locked(tech_pvt, TFLAG_TRANSPORT_ACCEPT); + switch_set_flag_locked(tech_pvt, TFLAG_ANSWER); + } - if (!get_codecs(tech_pvt)) { - terminate_session(&session, __LINE__, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - status = LDL_STATUS_FALSE; - goto done; - } + if (lanaddr) { + switch_set_flag_locked(tech_pvt, TFLAG_LANADDR); + } + if (!get_codecs(tech_pvt)) { + terminate_session(&session, __LINE__, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + status = LDL_STATUS_FALSE; + goto done; + } - tech_pvt->remote_ip = switch_core_session_strdup(session, candidates[x].address); - ldl_session_set_ip(dlsession, tech_pvt->remote_ip); - tech_pvt->remote_port = candidates[x].port; - tech_pvt->remote_user = switch_core_session_strdup(session, candidates[x].username); + tech_pvt->remote_ip = switch_core_session_strdup(session, candidates[choice].address); + ldl_session_set_ip(dlsession, tech_pvt->remote_ip); + tech_pvt->remote_port = candidates[choice].port; + tech_pvt->remote_user = switch_core_session_strdup(session, candidates[choice].username); - if (!switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { - if (!do_candidates(tech_pvt, 0)) { - terminate_session(&session, __LINE__, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); - status = LDL_STATUS_FALSE; - goto done; - } - } - status = LDL_STATUS_SUCCESS; - goto done; + if (!switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { + if (!do_candidates(tech_pvt, 0)) { + terminate_session(&session, __LINE__, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + status = LDL_STATUS_FALSE; + goto done; + } } + + status = LDL_STATUS_SUCCESS; } + + goto done; + } break; case LDL_SIGNAL_REJECT: Modified: freeswitch/trunk/src/switch_utils.c ============================================================================== --- freeswitch/trunk/src/switch_utils.c (original) +++ freeswitch/trunk/src/switch_utils.c Fri Apr 4 11:17:17 2008 @@ -76,7 +76,7 @@ switch_network_node_t *node; switch_bool_t ok = list->default_type; uint32_t bits = 0; - + for (node = list->node_head; node; node = node->next) { if (node->bits > bits && switch_test_subnet(ip, node->ip, node->mask)) { if (node->ok) {
participants (1)
-
Freeswitch SVN