pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37309?usp=email )
Change subject: asterisk: IMS: allow re-auth during unregister ......................................................................
asterisk: IMS: allow re-auth during unregister
After a while, Asterisk may ask for re-auth when issuing a REGISTER Expires=0 (unregister), which is totally fine. Handle the 401 Unauthorized and retry again.
Change-Id: I7f2536771e7d47e83bb8fa1442c32fd73a2868b7 --- M asterisk/SIP_ConnectionHandler.ttcn 1 file changed, 70 insertions(+), 10 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/09/37309/1
diff --git a/asterisk/SIP_ConnectionHandler.ttcn b/asterisk/SIP_ConnectionHandler.ttcn index 52290fd..5aa3773 100644 --- a/asterisk/SIP_ConnectionHandler.ttcn +++ b/asterisk/SIP_ConnectionHandler.ttcn @@ -366,17 +366,64 @@ g_pars.local_contact, ts_Expires("0"), authorization := g_pars.authorization)); - + alt { /* Wait for OK answer */ - exp := tr_SIP_Response( - g_pars.registrar_sip_call_id, - from_addr, - to_addr_exp, - f_tr_Via_response(via), - *, - "REGISTER", 200, - g_pars.registrar_sip_seq_nr, "OK"); - as_SIP_expect_resp(exp); + [] SIP.receive(tr_SIP_Response( + g_pars.registrar_sip_call_id, + from_addr, + to_addr_exp, + f_tr_Via_response(via), + *, + "REGISTER", 200, + g_pars.registrar_sip_seq_nr, "OK")) -> value g_rx_sip_resp; + + /* May require re-auth: */ + [] SIP.receive(tr_SIP_Response_Unauthorized( + g_pars.registrar_sip_call_id, + from_addr, + to_addr_exp, + f_tr_Via_response(via), + *, + tr_WwwAuthenticate({tr_Challenge_digestCln(?)}), + g_pars.registrar_sip_seq_nr)) -> value g_rx_sip_resp { + + /* Digest Auth: RFC 2617 */ + g_pars.authorization := + f_sip_digest_gen_Authorization_MD5(g_rx_sip_resp.msgHeader.wwwAuthenticate, + g_pars.user, g_pars.password, + "REGISTER", + f_sip_SipUrl_to_str(g_pars.registrar_sip_req_uri)) + + /* New transaction: */ + g_pars.registrar_sip_seq_nr := g_pars.registrar_sip_seq_nr + 1; + branch_value := f_sip_gen_branch(f_sip_SipAddr_to_str(g_pars.registrar_sip_record), + f_sip_SipAddr_to_str(g_pars.registrar_sip_record), + g_pars.registrar_sip_call_id, + g_pars.registrar_sip_seq_nr); + via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams, "branch", branch_value); + + SIP.send(ts_SIP_REGISTER(g_pars.registrar_sip_req_uri, + g_pars.registrar_sip_call_id, + from_addr, + to_addr, + via, + g_pars.registrar_sip_seq_nr, + g_pars.local_contact, + ts_Expires("0"), + authorization := g_pars.authorization)); + + /* Wait for OK answer */ + exp := tr_SIP_Response( + g_pars.registrar_sip_call_id, + from_addr, + to_addr_exp, + f_tr_Via_response(via), + *, + "REGISTER", 200, + g_pars.registrar_sip_seq_nr, "OK"); + as_SIP_expect_resp(exp); + } + }
/* Prepare for next use: */ g_pars.registrar_sip_seq_nr := g_pars.registrar_sip_seq_nr + 1;