/* * verifies the from address agains the access lists * defined in the configuration file. * * returns a bitmask with ACCESSCTL_SIP, ACCESSCTL_REG */ int accesslist_check (struct sockaddr_in from) { int access = 0; DEBUGC(DBCLASS_ACCESS,"deny list (SIP):%s", configuration.hosts_deny_sip? configuration.hosts_deny_sip : "*NULL*"); DEBUGC(DBCLASS_ACCESS,"allow list (SIP):%s", configuration.hosts_allow_sip? configuration.hosts_allow_sip : "*NULL*"); DEBUGC(DBCLASS_ACCESS,"allow list (REG):%s", configuration.hosts_allow_reg? configuration.hosts_allow_reg : "*NULL*"); /* * check DENY list */ if ( (configuration.hosts_deny_sip !=NULL) && (strcmp(configuration.hosts_deny_sip,"")!=0) ) { /* non-empty list -> check agains it */ if (process_aclist(configuration.hosts_deny_sip, from)== STS_SUCCESS) { /* yup - this one is blacklisted */ DEBUGC(DBCLASS_ACCESS,"caught by deny list"); return 0; } } /* * check SIP allow list */ if ( (configuration.hosts_allow_sip !=NULL) && (strcmp(configuration.hosts_allow_sip,"")!=0) ) { /* non-empty list -> check agains it */ if (process_aclist(configuration.hosts_allow_sip, from)==STS_SUCCESS) { /* SIP access granted */ DEBUGC(DBCLASS_ACCESS,"granted SIP access"); access |= ACCESSCTL_SIP; } } else { access |= ACCESSCTL_SIP; } /* * check SIP registration allow list */ if ( (configuration.hosts_allow_reg !=NULL) && (strcmp(configuration.hosts_allow_reg,"")!=0) ) { /* non-empty list -> check agains it */ if (process_aclist(configuration.hosts_allow_reg, from)==STS_SUCCESS) { /* SIP registration access granted */ DEBUGC(DBCLASS_ACCESS,"granted REG/SIP access"); access |= ACCESSCTL_REG | ACCESSCTL_SIP; } } else { access |= ACCESSCTL_REG; } DEBUGC(DBCLASS_ACCESS,"access check =%i", access); return access; }
/* * Processing. * */ int PLUGIN_PROCESS(int stage, sip_ticket_t *ticket){ /* stage contains the PLUGIN_* value - the stage of SIP processing. */ int type; osip_via_t *via; struct sockaddr_in from; type = ticket->direction; /* Incoming SIP message? */ DEBUGC(DBCLASS_PLUGIN, "plugin_fix_bogus_via: type=%i", type); if (type == REQTYP_INCOMING) { if((via = osip_list_get(&(ticket->sipmsg->vias), 0)) == NULL) { WARN("no Via header found in incoming SIP message"); return STS_SUCCESS; } get_ip_by_host(via->host, &(from.sin_addr)); /* check for Via IP in configured range */ if ((plugin_cfg.networks != NULL) && (strcmp(plugin_cfg.networks, "") !=0) && (process_aclist(plugin_cfg.networks, from) == STS_SUCCESS)) { /* is in list, patch Via header with received from IP */ DEBUGC(DBCLASS_PLUGIN, "plugin_fix_bogus_via: replacing a bogus via"); if (sip_patch_topvia(ticket) == STS_FAILURE) { ERROR("patching inbound Via failed!"); } } } return STS_SUCCESS; }