📄 sipb_bnftools.cpp
字号:
int to_port){ //create new rules p.add_rule("display-name-To"," 1*(token LWS) / quoted-string "); set_sip_pr(p, "To", host, username, to_port); p.add_rule("addr-spec-To","SIP-URI-To"); p.add_rule("name-addr-To","[ display-name-To ] LAQUOT addr-spec-To RAQUOT"); //create general rule p.reset_rule("To", "( \"To\" / \"t\" ) HCOLON " "( name-addr-To/ addr-spec-To ) SEMI \"tag\" EQUAL token");}// void sipb_bnftools::set_from(bnf_parser&p, string host,string username, int to_port){ //create new rules p.add_rule("display-name-From","1*(token LWS)/ quoted-string"); set_sip_pr(p,"From",host,username,to_port); p.add_rule("addr-spec-From","SIP-URI-From"); p.add_rule("name-addr-From",string("[ display-name-From ]")+ " LAQUOT addr-spec-From RAQUOT "); p.add_rule("from-param-tag"," \"tag\" EQUAL token "); p.reset_rule("From","( \"From\" / \"f\" ) HCOLON from-spec"); p.reset_rule("from-spec", "( name-addr-From / addr-spec-From ) [ SEMI from-param-tag ]");}// void sipb_bnftools::set_contact(bnf_parser& p,string host,string username, int cont_port,bool rand_setport, string rule_name,int expir, bool rand_setexpir){ string display_name="display-name-"+rule_name; string addr_spec="addr-spec-"+rule_name; string name_addr="name-addr-"+rule_name; string param_q="param-q-"+rule_name; string param_exp="param-expires-"+rule_name; string sip_uri="SIP-URI-"+rule_name; // created by set_sip_pr p.add_rule(display_name,"1*(token LWS)/ quoted-string"); set_sip_pr(p,rule_name,host,username,cont_port,rand_setport); p.add_rule(addr_spec,sip_uri); p.add_rule(name_addr,"[ "+display_name+" ]"+ " LAQUOT "+addr_spec+" RAQUOT "); p.add_rule(param_q,"\"q\" EQUAL qvalue"); p.add_rule(param_exp,"\"expires\" EQUAL "+str(expir)); if (expir<0) //not send expires { p.add_rule(rule_name,string("(\"Contact\" / \"m\" ) HCOLON ")+ "( " + name_addr + " / " + addr_spec + " ) "+ "[SEMI "+ param_q + " ] "); return; } if (rand_setexpir) p.add_rule(rule_name,string("(\"Contact\" / \"m\" ) HCOLON ")+ "( " + name_addr + " / " + addr_spec + " ) "+ "[SEMI "+ param_q + " ] [SEMI "+param_exp +" ]"); else p.add_rule(rule_name,string("(\"Contact\" / \"m\" ) HCOLON ")+ "( " + name_addr + " / " + addr_spec + " ) "+ "[SEMI "+ param_q + " ] SEMI "+param_exp);}// void sipb_bnftools::set_maxfor(bnf_parser&p,int mf){ p.reset_rule("Max-Forwards",str("Max-Forwards") + "HCOLON" + str(mf));}// void sipb_bnftools::set_cseq(bnf_parser&p,string name,int val){ p.add_rule("Method-CSeq",hstr(name)); if (val<0) p.reset_rule("CSeq","\"CSeq\" HCOLON 1*9DIGIT LWS Method-CSeq"); else p.reset_rule("CSeq","\"CSeq\" HCOLON "+str(val)+" LWS Method-CSeq");}// void sipb_bnftools::set_require(bnf_parser&p,string req){ p.reset_rule("Require","\"Require\" HCOLON " + hstr(req));}// void sipb_bnftools::set_accept(bnf_parser&p,string req){ p.reset_rule("Accept","\"Accept\" HCOLON " + hstr(req));}// void sipb_bnftools::set_subject(bnf_parser&p,string s){ p.reset_rule("Subject","(\"Subject\" / \"s\" ) HCOLON " + hstr(s));}// void sipb_bnftools::set_conttype(bnf_parser& p, string s){ p.reset_rule("Content-Type","( \"Content-Type\" / \"c\" ) HCOLON "+hstr(s));}// void sipb_bnftools::set_callid(bnf_parser&p,string val){ if (val.size()>0) p.reset_rule("Call-ID","( \"Call-ID\" / \"i\" ) HCOLON "+hstr(val)); else //reset by default p.reset_rule("Call-ID","( \"Call-ID\" / \"i\" ) HCOLON callid");}// void sipb_bnftools::set_expires(bnf_parser&p,int expir){ p.reset_rule("Expires","\"Expires\" HCOLON " + str(expir));}// void sipb_bnftools::set_contact_star(bnf_parser& p,string rule_name){ p.add_rule(rule_name,"(\"Contact\" / \"m\" ) HCOLON STAR");}// void sipb_bnftools::set_sip_pr(bnf_parser&p,string prefix, string host, string user_name,int port,bool rand_setport){ //create rulle hostport-prefix if (port>0) { if (rand_setport) p.add_rule("hostport-"+prefix , hstr(host)+" [ \":\" " + str(port) + " ] "); else p.add_rule("hostport-"+prefix , hstr(host)+" \":\" " + str(port) + " "); } else p.add_rule("hostport-"+prefix, hstr(host)); //create rule SIP-UTI-prefix if (user_name!="") p.add_rule("SIP-URI-"+prefix, str("sip:") +" " + hstr(user_name) + " "+ hstr("@")+" hostport-"+prefix); else p.add_rule("SIP-URI-"+prefix,str("sip:") + " hostport-"+prefix);}// bool sipb_bnftools::set_auth(bnf_parser&pcr,bnf_parsval* challenge, string uri,string username,string password, string method,sipb_errwarn& ew){ bnf_parsval* w,*ch; if (!challenge->get_one("WWW-Authenticate",w)) { ew.add_error("Cant find WWW-Authenticate in 401-responce"); return false; } if (!w->get_one("challenge",ch)) { ew.add_error("Cant find challenge in WWW-Authenticate, or multi challenge"); return false; } string realm,nonce; bnf_parsval* tmp; if (!ch->get_one("realm",tmp)) { ew.add_error("Cant find real in WWW-Authenticate"); return false; } realm=read_qstr(tmp); if (!ch->get_one("nonce",tmp)) { ew.add_error("Cant find nonce in WWW-Authenticate"); return false; } nonce=read_qstr(tmp); if (!ch->is_present("md5-str")) { ew.add_warning("Cant find MD5 - string in WWW-Authenticate, we work only with MD5"); return false; } //TODO: change from hstr pcr.reset_rule("credentials",str("Digest")+" LWS digest-response "); pcr.add_rule("username-dr",str("username")+" EQUAL LDQUOT "+ hstr(username)+" RDQUOT"); pcr.add_rule("realm-dr",str("realm")+" EQUAL LDQUOT "+hstr(realm)+ " RDQUOT"); pcr.add_rule("nonce-dr",str("nonce")+" EQUAL LDQUOT "+hstr(nonce)+ " RDQUOT"); pcr.add_rule("digest-uri-dr",str("uri")+" EQUAL LDQUOT "+hstr(uri)+ " RDQUOT"); string resp; resp=sipb_md5::create_dresp(username,realm,password,method,uri,nonce); pcr.add_rule("dresponce-dr",str("response")+" EQUAL LDQUOT "+ hstr(resp)+ " RDQUOT"); pcr.reset_rule("digest-response",string("username-dr COMMA realm-dr ")+ "COMMA nonce-dr COMMA digest-uri-dr COMMA dresponce-dr"); return true;}// bool sipb_bnftools::set_resp_fromreq(bnf_parser&p,bnf_parsval* request, int status_code,string status_str, int c_len,bool rand_cont, sipb_errwarn&ew){ //set from bnf_parsval* pv; if (!request->get_one("From",pv)) { ew.add_error("Can't find From field (or multi From)"); return false; } p.add_rule("From",hstr(pv->get_data())); //set To (and add to-tag) if (!request->get_one("To",pv)) { ew.add_error("Can't find To field (or multi To)"); return false; } if (!pv->is_present("tag-param")) //we MUST add to-tag p.add_rule("To",hstr(pv->get_data())+" SEMI \"tag\" EQUAL token"); else p.add_rule("To",hstr(pv->get_data())); //set Call-ID if (!request->get_one("Call-ID",pv)) { ew.add_error("Can't find Call-ID (or multi Call-ID)"); return false; } p.add_rule("Call-ID",hstr(pv->get_data())); //set CSeq if (!request->get_one("CSeq",pv)) { ew.add_error("Can't find CSeq (or multi CSeq)"); return false; } p.add_rule("CSeq",hstr(pv->get_data())); //set Via (may be multi) vector<bnf_parsval*> pvs; request->get("Via",pvs); string string_via; for (unsigned int i=0;i<pvs.size();i++) { string_via+=hstr(pvs[i]->get_data())+" "; if (i != pvs.size() - 1) string_via+="CRLF "; } p.add_rule("Via",string_via); p.add_rule("Status-Line","\"SIP/2.0\" SP "+ hstr(int_to_str(status_code))+" SP "+ hstr(status_str)+" CRLF"); //now we set Response rule set_message(p,"Response","Status-Line",c_len,"","",rand_cont); return true;}// //---------CHECK PART------------// bool sipb_bnftools::cmp_uri(bnf_parsval* v1,bnf_parsval * v2){ //TODO: make remove escaped! //TODO: SIPS-URI //TODO: header can swap if ( ( v1->name() != "SIP-URI" ) || ( v2->name() != "SIP-URI" )) throw logic_error("Error in sipb_bnftools::cmp_uri unsupported uri sheme"); //1. compare userinfo (case sensetivity) string s1,s2; if (v1->get_one("userinfo",s1)) //if userinfo is present { if (!v2->get_one("userinfo",s2) || (s1 != s2) ) return false; } else if (v2->get_one("userinfo",s2)) return false; //2. compare hostport (case-insensitivity) if (!v1->get_one("hostport",s1) || !v2->get_one("hostport",s2)) throw logic_error("in sipb_bnftools::cmp_uri not found hostport"); if (! casecmp( s1, s2 )) return false; //3. compare uri parameters bnf_parsval* p1,*p2; if (!v1->get_one("uri-parameters",p1) || !v2->get_one("uri-parameters",p2)) throw logic_error("in sipb_bnftools::cmp_uri not found uri-parameters"); if (!casecmp_values(p1,p2,"transport-param-trans")|| !casecmp_values(p1,p2,"user-param-param") || !cmp_values(p1,p2,"Method") || !casecmp_values(p1,p2,"lr-param") || !casecmp_values(p1,p2,"maddr-param-host")|| !casecmp_values(p1,p2,"ttl")) return false; //4. compare headers if (!casecmp_values(v1,v2,"headers")) return false; return true;}// bool sipb_bnftools::cmp_viaparm_notrecived(bnf_parsval *v1,bnf_parsval*v2){ if (v1->name()!="via-parm" || v2->name()!="via-parm") throw logic_error("Error in sipb_bnftools::cmp_via_notrecived not via-parm"); //1. cmp sent-protocol bnf_parsval*p1,*p2; if (!v1->get_one("sent-protocol",p1) || !v2->get_one("sent-protocol",p2)) throw logic_error("Error in cmp_viaparm_notrecived not found sent-protocol value"); if (!casecmp_values(p1,p2,"protocol-name") || !casecmp_values(p1,p2,"protocol-version") || !casecmp_values(p1,p2,"transport")) return false; //2. cmp sent_by string s1,s2; if (!v1->get_one("sent-by",p1) || !v2->get_one("sent-by",p2)) throw logic_error("Error in cmp_via_notrecived not find sent-by in via-parm"); //2.1 cmp host in sent-by if (!p1->get_one("host",s1) || !p2->get_one("host",s2)) throw logic_error("Error in cmp_via_notrecived not find host in sent-by"); if ( !casecmp( s1 , s2 ) ) return false; //2.2 cmp port in sent-by if (p1->get_one("port",s1)) { if ( !p2->get_one("port",s2) || s1 != s2) return false; } else if (p2->get_one("port",s2)) return false; //3. via-params (without recived) if (!cmp_values(v1,v2,"ttl") || !casecmp_values(v1,v2,"via-maddr-param") || !cmp_values(v1,v2,"via-branch-param") || !casecmp_values(v1,v2,"via-extension")) return false; return true;}// bool sipb_bnftools::cmp_from(bnf_parsval*v1,bnf_parsval*v2){ if (v1->name()!="From" || v2->name()!="From") throw logic_error("Error in sipb_bnftools::cmp_from not From values"); if ( !cmp_addrspec(v1,v2) || !cmp_values(v1,v2,"tag-param-param") || !cmp_values(v1,v2,"generic-param")) return false; return true;}// bool sipb_bnftools::cmp_to_nottag(bnf_parsval*v1,bnf_parsval*v2){ if (v1->name()!="To" || v2->name()!="To") throw logic_error("Error in sipb_bnftools::cmp_to_notag not To values"); if (!cmp_addrspec(v1,v2) || !cmp_values(v1,v2,"generic-param")) return false; return true;}// bool sipb_bnftools::cmp_cseq(bnf_parsval* v1,bnf_parsval*v2){ if (v1->name()!="CSeq" || v2->name()!="CSeq") throw logic_error("Error in sipb_bnftools::cmp_cseq no CSeq values"); string s1,s2; if (!v1->get_one("CSeq-value",s1) || !v2->get_one("CSeq-value",s2)) throw logic_error("Error in sipb_bnftools::cmp_cseq no CSeq-value values"); if (atoi(s1.c_str()) != atoi(s2.c_str())) return false; if (!cmp_values(v1,v2,"CSeq-Method")) return false; return true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -