<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1251"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>If someone interesting this is set of routes to make Digest authorization manually(with no uac_auth)</div><div>I would be grateful if somebody optimizes this workaround or find security troubles.<br></div><div><br></div><div>route[dispatch_out] {</div><div>&nbsp; &nbsp; &nbsp;#For testing, I used the dispatcher module</div><div>&nbsp; &nbsp; &nbsp;#You can create your own search method register data for proxy in&nbsp;this cfg is «hardcoded» val&nbsp;$avp(registrant)=6</div><div>&nbsp; &nbsp; &nbsp;#Now I use&nbsp;gateway&nbsp;attributes in&nbsp;dr_gateways table</div><div>&nbsp; &nbsp; &nbsp;#Username and password and aor I get from registrant table</div><div>&nbsp;&nbsp;&nbsp; $avp(registrant)=6;</div><div>&nbsp; &nbsp; &nbsp;#dispatcher set 1001 is set contain&nbsp;proxy which need to auth</div><div>&nbsp; &nbsp; &nbsp;#lets go!</div><div><br></div><div><div>&nbsp;&nbsp;&nbsp; if(!ds_select_domain("1001","8")){</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_reply("404", "No destination");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</div></div><div>&nbsp;&nbsp;&nbsp; }</div><div>&nbsp; &nbsp; &nbsp;#clearing auth flag</div><div>&nbsp;&nbsp;&nbsp; resetflag(7);</div><div>&nbsp; &nbsp; &nbsp;#get auth data from registrant table</div><div>&nbsp;&nbsp;&nbsp; avp_db_query("select username, password, aor from registrant where id=$avp(registrant)","$avp(stored_username);$avp(stored_password);$avp(stored_aor)");</div><div>&nbsp; &nbsp; &nbsp;#build new From-hdr with registrant data</div><div>&nbsp; &nbsp; uac_replace_from("$avp(stored_username)", "$avp(stored_aor)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#build new To-hdr with registrant data</div><div>&nbsp; &nbsp; $avp(stored_to)="sip:" + $(ru{uri.user}) + "@" + $(avp(stored_to){uri.host}) + ":" + $(ru{uri.port});</div><div>&nbsp; &nbsp; uac_replace_to("$avp(stored_to)");</div><div><br></div><div>&nbsp; &nbsp; t_on_failure("rtf_dispatch_out");</div><div><div>&nbsp;&nbsp;&nbsp; t_on_reply("auth_reply");</div><div>&nbsp;&nbsp;&nbsp; t_relay();</div><div>&nbsp;&nbsp;&nbsp; exit;</div><div>}</div></div><div><br></div><div>onreply_route[auth_reply] {</div><div>&nbsp;&nbsp;&nbsp; if ( t_check_status("401|407") ) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if is not first "unauthorized"&nbsp; - do nothing&nbsp;(see below)</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isflagset(7)) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #special route to parce WWW-Atuh hdr</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route(parse_digest);</div><div>&nbsp;&nbsp;&nbsp;&nbsp; } else if ( t_check_status("200") ) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #special route to decrease cseq(see below)</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route(dec_cseq);</div><div>&nbsp;&nbsp;&nbsp;&nbsp; }</div></div><div>}</div><div><br></div><div>route[parse_digest]{<div>&nbsp;&nbsp;&nbsp; #saving Auth HDR of 401/407 reply</div><div>&nbsp;&nbsp;&nbsp; $avp(stored_digest)=$hdr(WWW-Authenticate);</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST orig WWW-Authenticate header is $hdr(WWW-Authenticate);");</div></div><div><br></div><div>&nbsp;&nbsp;&nbsp; #some transformations for parse</div><div><div>&nbsp;&nbsp;&nbsp; avp_subst("$avp(stored_digest)", "/, /;/g");</div><div>&nbsp;&nbsp;&nbsp; avp_subst("$avp(stored_digest)", "/Digest //g");</div><div>&nbsp;&nbsp;&nbsp; avp_subst("$avp(stored_digest)", "/\"//g");</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST digest params is $avp(stored_digest)");</div></div><div><br></div><div>&nbsp;&nbsp;&nbsp; #use script transformations to get values of HDR and save it in&nbsp;AVPs</div><div><div>&nbsp;&nbsp;&nbsp; $avp(stored_realm)=$(avp(stored_digest){param.value,realm});</div><div>&nbsp;&nbsp;&nbsp; $avp(stored_nonce)=$(avp(stored_digest){param.value,nonce});</div><div>&nbsp;&nbsp;&nbsp; if $(avp(stored_digest){param.exist,algorithm}) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_algorithm)=$(avp(stored_digest){param.value,algorithm});</div><div>&nbsp;&nbsp;&nbsp; } else {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_algorithm)="MD5";</div><div>&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp; if $(avp(stored_digest){param.exist,qop}) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_qop)=$(avp(stored_digest){param.value,qop});</div><div>&nbsp;&nbsp;&nbsp; } else {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_qop)="none";</div><div>&nbsp;&nbsp;&nbsp; }</div><div><br></div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST digest algorithm is $avp(stored_algorithm)");</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST digest realm is $avp(stored_realm)");</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST digest nonce is $avp(stored_nonce)");</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route PARSE_DIGEST digest qop is $avp(stored_qop)");</div><div><br></div><div>&nbsp;&nbsp;&nbsp; return;</div></div><div>}</div><div><br></div><div>#failure route - processing 401/407 error and send new invite with Authorization HDR</div><div><div>failure_route[rtf_dispatch_out]{</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "DISPATCHER OUTBOUND FILED");</div></div><div>&nbsp; &nbsp;&nbsp; if ( t_check_status("401|407") ) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isflagset(7)) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #If its not first&nbsp;«unauthorized» - registration&nbsp;data is&nbsp;wrong</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_reply("503","Authentication failed");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div></div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #go to route wich append auth HDR</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route(append_authorize);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #route which increase cseq&nbsp;</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route(inc_cseq);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_on_failure("rtf_dispatch_out");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_relay();</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</div><div>&nbsp;&nbsp;&nbsp;&nbsp; }</div><div><br></div><div>&nbsp;&nbsp;&nbsp; if (t_was_cancelled()) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</div><div>&nbsp;&nbsp;&nbsp; }</div></div><div><br></div><div>&nbsp;&nbsp;&nbsp; #this is&nbsp;standard&nbsp;part of dispatcher failure&nbsp;route</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "IAM IN FAILURE ROUTE DISPATCH\n");</div><div>&nbsp; &nbsp; ds_mark_dst("p");</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "IAM SELECT NEW DESTINATION\n");</div><div>&nbsp; &nbsp; if (ds_next_domain()) {</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(final_reply_timeout) = 2;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_on_failure("rtf_dispatch_out");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t_relay();</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</div><div>&nbsp;&nbsp;&nbsp; }</div><div>}</div></div><div><br></div><div><br></div><div>#this route to append&nbsp;Authorization HDR to second invite</div><div>route[append_authorize] {</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE orig ruri is $ru");</div><div>&nbsp;&nbsp;&nbsp; #saving ruri for use it for build response</div><div><div>&nbsp;&nbsp;&nbsp; $avp(stored_ruri)="sip:" + $(ru{uri.user}) + "@" + $(ru{uri.host});</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE parsed ruri is $avp(stored_ruri)");</div><div><br></div><div>&nbsp;&nbsp;&nbsp; #calculate ha1</div><div>&nbsp;&nbsp;&nbsp; $avp(ha1)=$avp(stored_username) + ":" + $avp(stored_realm) + ":" + $avp(stored_password);</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE ha1 is $avp(ha1)");</div><div>&nbsp;&nbsp;&nbsp; $avp(ha1)=$(avp(ha1){s.md5});</div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE ha1 is $avp(ha1)");</div></div><div><br></div><div>&nbsp;&nbsp;&nbsp; #switch for different types of qop</div><div><div>&nbsp;&nbsp;&nbsp; switch($avp(stored_qop))</div><div>&nbsp;&nbsp;&nbsp; {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "none":</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(ha2)=$rm + ":" + $avp(stored_ruri);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE $rm ha2 is $avp(ha2)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(ha2)=$(avp(ha2){s.md5});</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE $rm ha2 is $avp(ha2)");</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response)=$avp(ha1) + ":" + $avp(stored_nonce) + ":" + $avp(ha2);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE auth_response is $avp(auth_response)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response)=$(avp(auth_response){s.md5});</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE auth_response is $avp(auth_response)");</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_hdr)="Authorization: Digest username=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_username) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", realm=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_realm) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", nonce=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_nonce) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", uri=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_ruri) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", response=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", algorithm=" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_algorithm) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\r\n";</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div><div><br></div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "auth":</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(ha2)=$rm + ":" + $avp(stored_ruri);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE $rm ha2 is $avp(ha2)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(ha2)=$(avp(ha2){s.md5});</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE $rm ha2 is $avp(ha2)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_cnonce)=$(RANDOM{s.dec2hex});</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #xlog("random testing $(RANDOM{s.dec2hex})\n");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(nc)="00000001";</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response)=$avp(ha1) + ":" + $avp(stored_nonce) + ":00000001:" + $avp(stored_cnonce) + ":auth:" + $avp(ha2);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE auth_response is $avp(auth_response)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response)=$(avp(auth_response){s.md5});</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE auth_response is $avp(auth_response)");</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_hdr)="Authorization: Digest username=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_username) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", realm=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_realm) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", nonce=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_nonce) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", uri=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_ruri) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", response=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(auth_response) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", algorithm=" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_algorithm) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", qop=auth" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", cnonce=\"" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $avp(stored_cnonce) +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\", nc=00000001" +</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\r\n";</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div><div><br></div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "auth-int":</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;#TODO</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE not supported qop auth-int");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div><div><br></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE unexpected qop is $avp(stored_qop)");</div><div>&nbsp;&nbsp;&nbsp; }</div><div><br></div></div><div>&nbsp;&nbsp;&nbsp; xlog("L_INFO", "Route APPEND_AUTHORIZE auth_hdr is &lt;$avp(auth_hdr)&gt;");</div><div>&nbsp;&nbsp;&nbsp; #Append HDR to Invite</div><div><div>&nbsp;&nbsp;&nbsp; if (append_hf("$avp(auth_hdr)")) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setflag(7);</div><div>&nbsp;&nbsp;&nbsp; }</div><div><br></div><div>&nbsp;&nbsp;&nbsp; return;</div><div>}</div></div><div><br></div><div>#two short routes to inc or dec cseq value</div><div>#it use dialog module!!!!!!</div><div>#I need dlg_flag for check manual cseq updating</div><div>---------------------------------------------------------</div><div>…...</div><div><div>route[inc_cseq]{</div><div>&nbsp;&nbsp;&nbsp; if(remove_hf("CSeq")){</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $var(cseq) = $(cs{s.int}) + 1;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $var(cseq) = "CSeq: " + $var(cseq) + " " + $rm + "\r\n";</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; append_hf("$var(cseq)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!is_dlg_flag_set("7")) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_dlg_flag("7");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "INCREASE CSEQ NEW IS &lt;$var(cseq)&gt;");</div><div>&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp; return;</div></div><div>}</div><div><br></div><div><div>route[dec_cseq]{</div><div>&nbsp;&nbsp;&nbsp; if(remove_hf("CSeq")){</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $var(cseq) = $(cs{s.int}) - 1;</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $var(cseq) = "CSeq: " + $var(cseq) + " " + $rm + "\r\n";</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; append_hf("$var(cseq)");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!is_dlg_flag_set("7")) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_dlg_flag("7");</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xlog("L_INFO", "DECREASE CSEQ NEW IS&lt;$var(cseq)&gt;");</div><div>&nbsp;&nbsp;&nbsp; }</div><div>&nbsp;&nbsp;&nbsp; return;</div><div>}</div></div><div><br></div><div>#and in&nbsp;standard&nbsp;part of route logic</div><div>#that looks like this:</div><div>&nbsp;&nbsp;&nbsp;&nbsp; if (has_totag()) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (loose_route() || match_dialog() ) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; if (is_method("BYE")) {</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setflag(ACC_DO); # do accounting ...</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setflag(ACC_FAILED); # ... even if the transaction fails</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (is_method("INVITE")) {</div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; record_route();</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (is_method("ACK")) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #Decreasing cseq back</div><div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is_dlg_flag_set("7")) {</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; route(inc_cseq);</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div></div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………..</div><div>&nbsp;&nbsp;&nbsp;&nbsp; }</div><div>…...</div><div>---------------------------------------------------------</div><div><br></div><div><br></div><div><br></div><div>Thanks!</div><div><br></div><div><br></div><div></div><div>
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">————————————<br><br>Timofeev Dmitry<br>VoIP Engineer<br>Linux, Asterisk, Freeswitch, Cisco solutions<br>Skype: itsroot<br>icq: 227227933<br><br><br></div>
</div>
<br></body></html>