# $Id$ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=tel:+12345 --registrar sip:127.0.0.1:$PORT" req1 = sip.RecvfromTransaction( "", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1234\""], expect="PJSIP_ENOCREDENTIAL") recvfrom_cfg = sip.RecvfromCfg("Failed registration with tel: URI test", pjsua, [req1])
import inc_sip as sip import inc_sdp as sdp # In this test we simulate broken server, where it always sends # stale=true with all 401 responses. We should expect pjsip to # retry the authentication until PJSIP_MAX_STALE_COUNT is # exceeded. When pjsip retries the authentication, it should # use the new nonce from server pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password" req1 = sip.RecvfromTransaction("Initial request", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1\""] ) req2 = sip.RecvfromTransaction("First retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"1\""], exclude=["Authorization:[\\s\\S]+Authorization:"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"2\", stale=true"] ) req3 = sip.RecvfromTransaction("Second retry retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"2\""], exclude=["Authorization:[\\s\\S]+Authorization:"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"3\", stale=true"] )
# $Id: 201_reg_good_ok.py 2110 2008-07-07 20:14:41Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--username user --realm python --password passwd --auto-update-nat=0" req1 = sip.RecvfromTransaction( "Initial registration", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1234\""], expect="SIP/2.0 401") req2 = sip.RecvfromTransaction("Registration retry with auth", 200, include=[ "REGISTER sip", "Authorization:", "realm=\"python\"", "username=\"user\"", "nonce=\"1234\"", "response=" ], expect="registration success") recvfrom_cfg = sip.RecvfromCfg("Successful registration test", pjsua, [req1, req2])
# $Id: 208_reg_good_retry_nonce_ok.py 2392 2008-12-22 18:54:58Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0" req1 = sip.RecvfromTransaction( "Initial request", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1\""]) req2 = sip.RecvfromTransaction( "REGISTER first retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"1\""], exclude=["Authorization:[\\s\\S]+Authorization:"], resp_hdr=[ "WWW-Authenticate: Digest realm=\"python\", nonce=\"2\", stale=true" ]) req3 = sip.RecvfromTransaction( "REGISTER retry with new nonce", 200, include=["REGISTER sip", "Authorization", "nonce=\"2\""], exclude=["Authorization:[\\s\\S]+Authorization:"], expect="registration success")
# $Id$ import inc_sip as sip import inc_sdp as sdp # INVITE session using session timer pjsua = "--null-audio sip:127.0.0.1:$PORT --use-timer --timer-min-se 100 --timer-se 2000" req = sip.RecvfromTransaction("INVITE with session timer", 200, include=["Session-Expires:\s*2000", "Min-SE:\s*100"], exclude=[], resp_hdr=["Session-Expires: 1000;refresher=uac"] ) recvfrom_cfg = sip.RecvfromCfg("INVITE session using session timer", pjsua, [req])
# $Id: 206_reg_good_efailedcredential.py 2392 2008-12-22 18:54:58Z bennylp $ import inc_sip as sip import inc_sdp as sdp # Authentication failure test with same nonce pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password" req1 = sip.RecvfromTransaction( "Initial request", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1\""]) req2 = sip.RecvfromTransaction( "REGISTER retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"1\""], exclude=["Authorization:[\\s\\S]+Authorization:"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1\""], expect="PJSIP_EFAILEDCREDENTIAL") recvfrom_cfg = sip.RecvfromCfg("Authentication failure with same nonce", pjsua, [req1, req2])
# $Id: 100_simple.py 3284 2010-08-18 07:38:48Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--auto-update-nat=0" req1 = sip.RecvfromTransaction("Registration", 200, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=[ "Server: Snake Registrar", "Expires: 221", "Contact: sip:localhost" ], expect="registration success") recvfrom_cfg = sip.RecvfromCfg("Simple registration test", pjsua, [req1])
# $Id: 203_reg_good_empty_realm.py 3150 2010-04-29 00:23:43Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=* --user=username --password=password " + \ "--auto-update-nat=0" # 401 Response, missing realm value req1 = sip.RecvfromTransaction("Initial request", 401, include=["REGISTER sip"], exclude=[], resp_hdr=['WWW-Authenticate: Digest']) # Client should retry, we giving it another 401 with empty realm req2 = sip.RecvfromTransaction( "REGISTER retry #1 of 2", 407, include=["REGISTER sip"], exclude=[], resp_hdr=['Proxy-Authenticate: Digest realm=""']) # Client should retry req3 = sip.RecvfromTransaction("REGISTER retry #2 of 2", 200, include=[], exclude=[], expect="registration success") recvfrom_cfg = sip.RecvfromCfg("Registration with empty realm", pjsua,
# Offer with 2 media lines answered with only 1 media line pjsua = "--null-audio sip:127.0.0.1:$PORT --id=sip:1000@localhost --extra-audio --use-srtp=0" sdp = \ """ v=0 o=- 0 0 IN IP4 127.0.0.1 s=pjmedia c=IN IP4 127.0.0.1 t=0 0 m=audio 4000 RTP/AVP 0 101 a=rtpmap:0 PCMU/8000 a=sendrecv a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 """ req = sip.RecvfromTransaction( "Receiving 2 media lines, answer with 1 media line", 200, include=["m=audio \d+ RTP/AVP", "m=audio \d+ RTP/AVP"], exclude=[], resp_hdr=["Content-type: application/sdp"], resp_body=sdp, ) recvfrom_cfg = sip.RecvfromCfg("Receiving answer with less media lines", pjsua, [req])
# $Id: 209c_reg_handle_423_bad_min_expires2.py 3105 2010-02-23 11:03:07Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0 --reg-timeout 300" # 423 without Min-Expires. PJSIP would retry with Expires: 3601 req1 = sip.RecvfromTransaction("Initial request", 423, include=["REGISTER sip"], exclude=[], resp_hdr=[]) # Another 423, still without Min-Expires req2 = sip.RecvfromTransaction("Retry with guessed Expires header", 423, include=["REGISTER sip", "Expires: 3601"], exclude=[], resp_hdr=[], expect="without Min-Expires header is invalid") recvfrom_cfg = sip.RecvfromCfg("Invalid 423 response to REGISTER", pjsua, [req1, req2])
import inc_sdp as sdp # In this test we simulate broken server, where it wants to # change the nonce, but it fails to set stale to true. In this # case, we should expect pjsip to retry the authentication until # PJSIP_MAX_STALE_COUNT is exceeded as it should have detected # that that nonce has changed pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0" req1 = sip.RecvfromTransaction( "Initial request", 401, include=["REGISTER sip"], exclude=["Authorization"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"1\""]) req2 = sip.RecvfromTransaction( "First retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"1\""], exclude=["Authorization:[\\s\\S]+Authorization:"], resp_hdr=["WWW-Authenticate: Digest realm=\"python\", nonce=\"2\""]) req3 = sip.RecvfromTransaction( "Second retry retry", 401, include=["REGISTER sip", "Authorization", "nonce=\"2\""], exclude=["Authorization:[\\s\\S]+Authorization:"],
# $Id: 209b_reg_handle_423_bad_min_expires1.py 3105 2010-02-23 11:03:07Z bennylp $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0 --reg-timeout 300" # 423 Response with Min-Expires header that is lower than what the client # had requested req1 = sip.RecvfromTransaction("Initial request", 423, include=["REGISTER sip"], exclude=[], resp_hdr=["Min-Expires: 250"], expect="invalid Min-Expires") recvfrom_cfg = sip.RecvfromCfg("Invalid 423 response to REGISTER", pjsua, [req1])
# $Id$ import inc_sip as sip import inc_sdp as sdp # Several PUBLISH failure scenarios that should be handled automatically pjsua = "--null-audio --id=sip:127.0.0.1:$PORT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0 --publish" #pjsua = "--null-audio --local-port 0 --rtp-port 0" # Handle REGISTER first req1 = sip.RecvfromTransaction("Initial REGISTER", 200, include=["REGISTER sip"], exclude=[], resp_hdr=["Expires: 1800"]) # First PUBLISH, reply with 412 req2 = sip.RecvfromTransaction("Initial PUBLISH, will be replied with 412", 412, include=["PUBLISH sip"], exclude=["Expires:"]) # Second PUBLISH req3 = sip.RecvfromTransaction("Second PUBLISH, will be replied with 200", 200, include=["PUBLISH sip"], exclude=["Expires:"], resp_hdr=["Expires: 60", "SIP-ETag: dx200xyz"])
# $Id$ import inc_sip as sip import inc_sdp as sdp # Session timers retry after 422 pjsua = "--null-audio sip:127.0.0.1:$PORT --timer-min-se 100 --timer-se 1000" # First INVITE with timer rejected with 422 req1 = sip.RecvfromTransaction("INVITE with SE too small", 422, include=["Session-Expires:\s*1000"], exclude=[], resp_hdr=["Min-SE: 2000"]) # Wait for ACK req2 = sip.RecvfromTransaction("Wait ACK", 0, include=["ACK sip"]) # New INVITE with SE >= Min-SE req3 = sip.RecvfromTransaction( "Retrying with acceptable SE", 200, include=["Session-Expires:\s*2000", "Min-SE:\s*2000"], exclude=[], resp_hdr=["Session-Expires: 2000;refresher=uac"]) recvfrom_cfg = sip.RecvfromCfg("Session timers retry after 422", pjsua, [req1, req2, req3])
# $Id: 209a_reg_handle_423_ok.py 369517 2012-07-01 17:28:57Z file $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--realm=python --user=username --password=password " + \ "--auto-update-nat=0" # 423 Response without Min-Expires header req1 = sip.RecvfromTransaction("Initial request", 423, include=["REGISTER sip"], exclude=[], resp_hdr=[] ) # Client should retry with Expires header containing special value (pjsip specific) req2 = sip.RecvfromTransaction("REGISTER retry after 423 response without Min-Expires header", 423, include=["REGISTER sip", "Expires: 3601"], exclude=[], resp_hdr=["Min-Expires: 3612"] ) # Client should retry with proper Expires header now req3 = sip.RecvfromTransaction("REGISTER retry after proper 423", 200, include=["Expires: 3612"], exclude=[], expect="registration success" ) recvfrom_cfg = sip.RecvfromCfg("Reregistration after 423 response", pjsua, [req1, req2, req3])
# $Id: 215_reg_good_multi_ok.py 369517 2012-07-01 17:28:57Z file $ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--username theuser1 --realm python1 --password passwd --next-cred " + \ "--username theuser2 --realm python2 --password passwd " + \ "--auto-update-nat=0" req1 = sip.RecvfromTransaction( "Initial registration", 401, include=["REGISTER sip"], resp_hdr=[ "WWW-Authenticate: Digest realm=\"python1\", nonce=\"1234\"", "WWW-Authenticate: Digest realm=\"python2\", nonce=\"6789\"" ], expect="SIP/2.0 401") req2 = sip.RecvfromTransaction( "Registration retry with auth", 200, include=[ "REGISTER sip", "Authorization:[\\s\\S]+Authorization:", # Must have 2 Auth hdrs "realm=\"python1\"", "realm=\"python2\"", "username=\"theuser1\"", "username=\"theuser2\"", "nonce=\"1234\"", "nonce=\"6789\"",
# $Id$ import inc_sip as sip import inc_sdp as sdp pjsua = "--null-audio --id=sip:CLIENT --registrar sip:127.0.0.1:$PORT " + \ "--username theuser1 --realm python1 --password passwd --next-cred " + \ "--username theuser2 --realm python2 --password passwd " + \ "--auto-update-nat=0" req1 = sip.RecvfromTransaction("Initial registration", 401, include=["REGISTER sip"], resp_hdr=["WWW-Authenticate: Digest realm=\"python1\", nonce=\"1234\"", "WWW-Authenticate: Digest realm=\"python2\", nonce=\"6789\""], expect="SIP/2.0 401" ) req2 = sip.RecvfromTransaction("Registration retry with auth (not allowed multiple auth)", 200, include=["REGISTER sip", "Authorization:", # [\\s\\S]+Authorization:" "realm=\"python1\"", # "realm=\"python2\"", "username=\"theuser1\"", # "username=\"theuser2\"", "nonce=\"1234\"", # "nonce=\"6789\"", "response="], expect="registration success", pj_config="PJSIP_AUTH_ALLOW_MULTIPLE_AUTH_HEADER.*: 0" ) req3 = sip.RecvfromTransaction("Registration retry with auth (allowed multiple auth)", 200, include=["REGISTER sip", "Authorization:[\\s\\S]+Authorization:", # Must have 2 Auth hdrs "realm=\"python1\"", "realm=\"python2\"",