static str *tls_get_connect_server_id(void) { sr_xavp_t *vavp = NULL; str sid = {"server_id", 9}; if(sr_tls_xavp_cfg.s!=NULL) vavp = xavp_get_child_with_sval(&sr_tls_xavp_cfg, &sid); if(vavp==NULL || vavp->val.v.s.len<=0) { LM_DBG("xavp with outbound server id not found\n"); return NULL; } LM_DBG("found xavp with outbound server id: %s\n", vavp->val.v.s.s); return &vavp->val.v.s; }
/** * get the server name (sni) for outbound connections from xavp */ static str *tls_get_connect_server_name(void) { #ifndef OPENSSL_NO_TLSEXT sr_xavp_t *vavp = NULL; str sname = {"server_name", 11}; if(sr_tls_xavp_cfg.s!=NULL) vavp = xavp_get_child_with_sval(&sr_tls_xavp_cfg, &sname); if(vavp==NULL || vavp->val.v.s.len<=0) { LM_DBG("xavp with outbound server name not found\n"); return NULL; } LM_DBG("found xavp with outbound server name: %s\n", vavp->val.v.s.s); return &vavp->val.v.s; #else return NULL; #endif }
/*! \brief */ static struct socket_info *get_sock_val(struct sip_msg *msg) { struct socket_info *sock; struct hdr_field *hf; str xsockname = str_init("socket"); sr_xavp_t *vavp = NULL; str socks; str hosts; int port; int proto; char c = 0; if(sock_hdr_name.len>0) { if (parse_headers( msg, HDR_EOH_F, 0) == -1) { LM_ERR("failed to parse message\n"); return 0; } for (hf=msg->headers; hf; hf=hf->next) { if (cmp_hdrname_str(&hf->name, &sock_hdr_name)==0) break; } /* hdr found? */ if (hf==0) return 0; trim_len( socks.len, socks.s, hf->body ); if (socks.len==0) return 0; /*FIXME: This is a hack */ c = socks.s[socks.len]; socks.s[socks.len] = '\0'; } else { /* xavp */ if(reg_xavp_cfg.s!=NULL) vavp = xavp_get_child_with_sval(®_xavp_cfg, &xsockname); if(vavp==NULL || vavp->val.v.s.len<=0) return 0; socks = vavp->val.v.s; } if (parse_phostport( socks.s, &hosts.s, &hosts.len, &port, &proto)!=0) { socks.s[socks.len] = c; LM_ERR("bad socket <%.*s> in \n", socks.len, socks.s); return 0; } if(sock_hdr_name.len>0 && c!=0) { socks.s[socks.len] = c; } sock = grep_sock_info(&hosts,(unsigned short)port,(unsigned short)proto); if (sock==0) { LM_ERR("non-local socket <%.*s>\n", socks.len, socks.s); return 0; } LM_DBG("%d:<%.*s>:%d -> p=%p\n", proto,socks.len,socks.s,port_no,sock ); return sock; }
int rtjson_update_branch(sip_msg_t *msg) { sr_xavp_t *javp = NULL; sr_xavp_t *iavp = NULL; srjson_doc_t tdoc; srjson_t *tj = NULL; srjson_t *nj = NULL; str val; str xname; int i; xname.s = "json"; xname.len = 4; javp = xavp_get_child_with_sval(&_rtjson_xavp_name, &xname); if(javp==NULL || javp->val.v.s.len<=0) { LM_WARN("no json for routing\n"); return -1; } xname.s = "idx"; xname.len = 3; iavp = xavp_get_child_with_ival(&_rtjson_xavp_name, &xname); if(iavp==NULL) { LM_WARN("no idx for routing\n"); return -1; } if(iavp->val.v.i<=0) { LM_WARN("invalid branch idx for routing\n"); return -1; } srjson_InitDoc(&tdoc, NULL); tdoc.root = srjson_Parse(&tdoc, javp->val.v.s.s); if(tdoc.root == NULL) { LM_ERR("invalid json doc [[%s]]\n", javp->val.v.s.s); srjson_DestroyDoc(&tdoc); return -1; } nj = srjson_GetObjectItem(&tdoc, tdoc.root, "routing"); if(nj==NULL || nj->valuestring==NULL) { LM_ERR("missing or invalid routing field\n"); goto error; } val.s = nj->valuestring; val.len = strlen(val.s); if(val.len!=6 || strncmp(val.s, "serial", 6)!=0) { LM_DBG("not serial routing [%.*s]\n", val.len, val.s); goto error; } tj = srjson_GetObjectItem(&tdoc, tdoc.root, "routes"); if(tj==NULL || tj->type!=srjson_Array || tj->child==NULL) { LM_ERR("missing or invalid routes field\n"); goto error; } nj = tj->child; i = 0; /* stop at number of branches - 1 */ while(nj && i<iavp->val.v.i-1) { nj = nj->next; i++; } if(nj==NULL) goto error; if(rtjson_prepare_branch(msg, &tdoc, nj)<0) goto error; srjson_DestroyDoc(&tdoc); return 0; error: srjson_DestroyDoc(&tdoc); return -1; }
int rtjson_push_routes(sip_msg_t *msg) { sr_xavp_t *javp = NULL; sr_xavp_t *iavp = NULL; srjson_doc_t tdoc; srjson_t *nj = NULL; str val; str xname; int ret; xname.s = "json"; xname.len = 4; javp = xavp_get_child_with_sval(&_rtjson_xavp_name, &xname); if(javp==NULL || javp->val.v.s.len<=0) { LM_WARN("no json for routing\n"); return -1; } xname.s = "idx"; xname.len = 3; iavp = xavp_get_child_with_ival(&_rtjson_xavp_name, &xname); if(iavp==NULL) { LM_WARN("no idx for routing\n"); return -1; } srjson_InitDoc(&tdoc, NULL); tdoc.root = srjson_Parse(&tdoc, javp->val.v.s.s); if(tdoc.root == NULL) { LM_ERR("invalid json doc [[%s]]\n", javp->val.v.s.s); srjson_DestroyDoc(&tdoc); return -1; } nj = srjson_GetObjectItem(&tdoc, tdoc.root, "routing"); if(nj==NULL || nj->valuestring==NULL) { LM_ERR("missing or invalid routing field\n"); goto error; } val.s = nj->valuestring; val.len = strlen(val.s); if(val.len==6 && strncmp(val.s, "serial", 6)==0) { LM_DBG("supported routing [%.*s]\n", val.len, val.s); ret = rtjson_init_serial(msg, &tdoc, iavp); } else if(val.len==8 && strncmp(val.s, "parallel", 8)==0) { LM_DBG("supported routing [%.*s]\n", val.len, val.s); ret = rtjson_init_parallel(msg, &tdoc, iavp); } else { LM_ERR("unsupported routing [%.*s]\n", val.len, val.s); goto error; } srjson_DestroyDoc(&tdoc); return ret; error: srjson_DestroyDoc(&tdoc); return -1; }
int registered4(struct sip_msg* _m, udomain_t* _d, str* _uri, int match_flag, int match_action_flag) { str uri, aor; urecord_t* r; ucontact_t* ptr; int res; str match_callid = {0,0}; str match_received = {0,0}; str match_contact = {0,0}; sr_xavp_t *vavp = NULL; if(_uri!=NULL) { uri = *_uri; } else { if(IS_SIP_REPLY(_m)) { if (parse_to_header(_m) < 0) { LM_ERR("failed to prepare the message\n"); return -1; } uri = get_to(_m)->uri; } else { if (_m->new_uri.s) uri = _m->new_uri; else uri = _m->first_line.u.request.uri; } } if (extract_aor(&uri, &aor, NULL) < 0) { LM_ERR("failed to extract address of record\n"); return -1; } ul.lock_udomain(_d, &aor); res = ul.get_urecord(_d, &aor, &r); if (res < 0) { ul.unlock_udomain(_d, &aor); LM_ERR("failed to query usrloc\n"); return -1; } if (res == 0) { LM_DBG("searching with match flags (%d,%d)\n", match_flag, match_action_flag); if(reg_xavp_cfg.s!=NULL) { if((match_flag & 1) && (vavp = xavp_get_child_with_sval(®_xavp_cfg, &match_callid_name)) != NULL && vavp->val.v.s.len > 0) { match_callid = vavp->val.v.s; LM_DBG("matching with callid %.*s\n", match_callid.len, match_callid.s); } if((match_flag & 2) && (vavp = xavp_get_child_with_sval(®_xavp_cfg, &match_received_name)) != NULL && vavp->val.v.s.len > 0) { match_received = vavp->val.v.s; LM_DBG("matching with received %.*s\n", match_received.len, match_received.s); } if((match_flag & 4) && (vavp = xavp_get_child_with_sval(®_xavp_cfg, &match_contact_name)) != NULL && vavp->val.v.s.len > 0) { match_contact = vavp->val.v.s; LM_DBG("matching with contact %.*s\n", match_contact.len, match_contact.s); } } for (ptr = r->contacts; ptr; ptr = ptr->next) { if(!VALID_CONTACT(ptr, act_time)) continue; if (match_callid.s && /* optionally enforce tighter matching w/ Call-ID */ match_callid.len > 0 && (match_callid.len != ptr->callid.len || memcmp(match_callid.s, ptr->callid.s, match_callid.len))) continue; if (match_received.s && /* optionally enforce tighter matching w/ ip:port */ match_received.len > 0 && (match_received.len != ptr->received.len || memcmp(match_received.s, ptr->received.s, match_received.len))) continue; if (match_contact.s && /* optionally enforce tighter matching w/ Contact */ match_contact.len > 0 && (match_contact.len != ptr->c.len || memcmp(match_contact.s, ptr->c.s, match_contact.len))) continue; if(!(match_action_flag & 2)) { xavp_rcd_helper(ptr); } if((ptr->xavp!=NULL) && (match_action_flag & 1)) { sr_xavp_t *xavp = xavp_clone_level_nodata(ptr->xavp); if(xavp_add(xavp, NULL)<0) { LM_ERR("error adding xavp for %.*s after successful match\n", aor.len, ZSW(aor.s)); xavp_destroy_list(&xavp); } } ul.release_urecord(r); ul.unlock_udomain(_d, &aor); LM_DBG("'%.*s' found in usrloc\n", aor.len, ZSW(aor.s)); return 1; } } ul.unlock_udomain(_d, &aor); LM_DBG("'%.*s' not found in usrloc\n", aor.len, ZSW(aor.s)); return -1; }