<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/testsuite/+/15902">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Create auth tests for realm and digest algorithm<br><br>Created 3 new test cases ...<br> * multiple_realm_multiple_digest<br> * single_realm_multiple_digest<br> * single_realm_single_digest<br>Each test case tests 6 different variations of the scenario.<br><br>Also updated the sipp.dtd.<br><br>ASTERISK-29397<br><br>Change-Id: I64d8ca768cf7a2c55ca4a256ec37bf4c712b4004<br>---<br>M contrib/sipp/sipp.dtd<br>M tests/channels/pjsip/auth/tests.yaml<br>A tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/configs/ast1/pjsip.conf<br>A tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/sipp/multiple_realm_multiple_digest_options.xml<br>A tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/test-config.yaml<br>A tests/channels/pjsip/auth/uac/single_realm_multiple_digest/configs/ast1/pjsip.conf<br>A tests/channels/pjsip/auth/uac/single_realm_multiple_digest/sipp/single_realm_multiple_digest_options.xml<br>A tests/channels/pjsip/auth/uac/single_realm_multiple_digest/test-config.yaml<br>A tests/channels/pjsip/auth/uac/single_realm_single_digest/configs/ast1/pjsip.conf<br>A tests/channels/pjsip/auth/uac/single_realm_single_digest/sipp/single_realm_single_digest_options.xml<br>A tests/channels/pjsip/auth/uac/single_realm_single_digest/test-config.yaml<br>A tests/channels/pjsip/auth/uac/tests.yaml<br>12 files changed, 998 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/testsuite refs/changes/02/15902/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/sipp/sipp.dtd b/contrib/sipp/sipp.dtd</span><br><span>index e839071..e2ba1f5 100644</span><br><span>--- a/contrib/sipp/sipp.dtd</span><br><span>+++ b/contrib/sipp/sipp.dtd</span><br><span>@@ -78,6 +78,8 @@</span><br><span> <!ATTLIST ereg regexp CDATA #REQUIRED ></span><br><span> <!ATTLIST ereg search_in (msg|hdr) "msg" ></span><br><span> <!ATTLIST ereg start_line (true|false) #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ATTLIST ereg occurence CDATA #IMPLIED ></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> <!ELEMENT log EMPTY ></span><br><span> <!ATTLIST log message CDATA #REQUIRED ></span><br><span>diff --git a/tests/channels/pjsip/auth/tests.yaml b/tests/channels/pjsip/auth/tests.yaml</span><br><span>index 5ab2b6a..7275618 100644</span><br><span>--- a/tests/channels/pjsip/auth/tests.yaml</span><br><span>+++ b/tests/channels/pjsip/auth/tests.yaml</span><br><span>@@ -1,2 +1,3 @@</span><br><span> tests:</span><br><span style="color: hsl(120, 100%, 40%);">+    - dir: 'uac'</span><br><span>     - dir: 'uas'</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/configs/ast1/pjsip.conf b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/configs/ast1/pjsip.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..091d5e3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/configs/ast1/pjsip.conf</span><br><span>@@ -0,0 +1,154 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[system]</span><br><span style="color: hsl(120, 100%, 40%);">+type = system</span><br><span style="color: hsl(120, 100%, 40%);">+timer_b = 32000</span><br><span style="color: hsl(120, 100%, 40%);">+timer_t1 = 500</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[local]</span><br><span style="color: hsl(120, 100%, 40%);">+type=transport</span><br><span style="color: hsl(120, 100%, 40%);">+protocol=udp</span><br><span style="color: hsl(120, 100%, 40%);">+bind=127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[aor_template](!)</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+qualify_frequency=0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = staruser</span><br><span style="color: hsl(120, 100%, 40%);">+password = starpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = starbad</span><br><span style="color: hsl(120, 100%, 40%);">+password = starpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = astuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = astpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = astbad</span><br><span style="color: hsl(120, 100%, 40%);">+password = astpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good_star]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = staruser</span><br><span style="color: hsl(120, 100%, 40%);">+password = starpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good_ast]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = astuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = astpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+; This will fail because the password is bad</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optbad</span><br><span style="color: hsl(120, 100%, 40%);">+password = optbad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp2@127.0.0.2:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp2</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = star_good,ast_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match.  Same a above but testing that having the</span><br><span style="color: hsl(120, 100%, 40%);">+; wildcard_first doesn't change the behavior.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp3@127.0.0.3:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp3</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_bad,star_good</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Having 2 wildcard entries for an endpoint is a</span><br><span style="color: hsl(120, 100%, 40%);">+; misconfiguration but we should only ever consider</span><br><span style="color: hsl(120, 100%, 40%);">+; the first one we find.  The inverse order is tested</span><br><span style="color: hsl(120, 100%, 40%);">+; in a different test case. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp4@127.0.0.4:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp4</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good_star,wildcard_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_is good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+; ast_bad should be discarded because it's neither</span><br><span style="color: hsl(120, 100%, 40%);">+; a wilcard nor an exact realm match.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp5@127.0.0.5:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp5</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good_star,ast_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure reversing the order doesn't change the behavior. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp6@127.0.0.6:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp6</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = ast_bad,wildcard_good_star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure using a realm of "*" is considered a wildcard.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp7@127.0.0.7:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp7</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = star_bad,wildcard_good_ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/sipp/multiple_realm_multiple_digest_options.xml b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/sipp/multiple_realm_multiple_digest_options.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..59b693e</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/sipp/multiple_realm_multiple_digest_options.xml</span><br><span>@@ -0,0 +1,119 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="ISO-8859-1" ?></span><br><span style="color: hsl(120, 100%, 40%);">+<!-- If you have a smart XML editor, using the sipp dtd can be a big help --></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE scenario SYSTEM "../../../../../../../contrib/sipp/sipp.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<scenario name="single_realm_single_digest_options"></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+      </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!-- </span><br><span style="color: hsl(120, 100%, 40%);">+              The nonce and opaque have no meaning other than they're properly formatted.</span><br><span style="color: hsl(120, 100%, 40%);">+               We're going to send a multiple challenges with the "star" realm and "md5",</span><br><span style="color: hsl(120, 100%, 40%);">+            "sha256" and "sha256-512" digest algorithms.  At the time this test was</span><br><span style="color: hsl(120, 100%, 40%);">+           written, only "md5" responses should be received from asterisk.</span><br><span style="color: hsl(120, 100%, 40%);">+     --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 401 Authorization Required</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="ast",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256-512,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="ast",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=md5,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="ast",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256-512,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=md5,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+      </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               sipp has issues with multiple headers with the same name.  If you don't specify</span><br><span style="color: hsl(120, 100%, 40%);">+           occurrence, it checks the first header it finds so both eregs below would be</span><br><span style="color: hsl(120, 100%, 40%);">+          matched against the first Authorization header.  To get around this, we</span><br><span style="color: hsl(120, 100%, 40%);">+               have to specify which header occurrence we want to test. Since Asterisk will</span><br><span style="color: hsl(120, 100%, 40%);">+          add Authorization headers in the same order as the WWW-Authenticate headers</span><br><span style="color: hsl(120, 100%, 40%);">+           it received, occurrence 1 has to match the first md5 header (ast) and occurrence</span><br><span style="color: hsl(120, 100%, 40%);">+              2 has to match the second (star).  </span><br><span style="color: hsl(120, 100%, 40%);">+   --></span><br><span style="color: hsl(120, 100%, 40%);">+        <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+              <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!-- Look for an "ast" realm --> </span><br><span style="color: hsl(120, 100%, 40%);">+                     <ereg regexp="Digest .*username=.(astuser)..*realm=.(ast)."</span><br><span style="color: hsl(120, 100%, 40%);">+                              search_in="hdr" header="Authorization:" occurence="1"</span><br><span style="color: hsl(120, 100%, 40%);">+                           assign_to="junk,username_ast,realm_ast"/></span><br><span style="color: hsl(120, 100%, 40%);">+                                </span><br><span style="color: hsl(120, 100%, 40%);">+                      <log message="ast: [$username_ast]"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       <!-- Look for a "star" realm --></span><br><span style="color: hsl(120, 100%, 40%);">+                      <ereg regexp="Digest .*username=.(staruser)..*realm=.(star)."</span><br><span style="color: hsl(120, 100%, 40%);">+                            search_in="hdr" header="Authorization:"  occurence="2"</span><br><span style="color: hsl(120, 100%, 40%);">+                          assign_to="junk,username_star,realm_star"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    <log message="star: [$username_star]"/>                         </span><br><span style="color: hsl(120, 100%, 40%);">+                              </span><br><span style="color: hsl(120, 100%, 40%);">+              </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               One of the realms has to pass.</span><br><span style="color: hsl(120, 100%, 40%);">+        --></span><br><span style="color: hsl(120, 100%, 40%);">+        <nop test="username_star" next="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+ <nop test="username_ast" next="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               We're not testing Asterisk's ability to handle repeated auth failures</span><br><span style="color: hsl(120, 100%, 40%);">+         so we just send back a 503 and terminate the test with prejudice</span><br><span style="color: hsl(120, 100%, 40%);">+      --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 503 Service Unavailable</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+  </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <nop></span><br><span style="color: hsl(120, 100%, 40%);">+           <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+                               Terminate the test with prejudice.</span><br><span style="color: hsl(120, 100%, 40%);">+                            sipp will return a non-zero return code which</span><br><span style="color: hsl(120, 100%, 40%);">+                         will cause the test to fail.</span><br><span style="color: hsl(120, 100%, 40%);">+                  --></span><br><span style="color: hsl(120, 100%, 40%);">+                        <exec int_cmd="stop_now"/></span><br><span style="color: hsl(120, 100%, 40%);">+            </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </nop></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        <!-- Auth passed so just send back an OK and we're done --> </span><br><span style="color: hsl(120, 100%, 40%);">+        <label id="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 200 OK</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: [len]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+       </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <Reference variables="junk,username_ast,username_star,realm_ast,realm_star"/></span><br><span style="color: hsl(120, 100%, 40%);">+</scenario></span><br><span>diff --git a/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/test-config.yaml b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..45436ad</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/multiple_realm_multiple_digest/test-config.yaml</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+tinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: 'Test Multiple Realm Multiple Digest authentication using OPTIONS'</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Each sipp scenario does exactly the same thing just listening on</span><br><span style="color: hsl(120, 100%, 40%);">+        different addresses. The endpoint we qualify determines the exact auth</span><br><span style="color: hsl(120, 100%, 40%);">+        scenario we're testing.</span><br><span style="color: hsl(120, 100%, 40%);">+        On fully-booted, we just send 1 Qualify command to each of the endpoints</span><br><span style="color: hsl(120, 100%, 40%);">+        and if any of the sipp instances fails to authenticate, the test fails.</span><br><span style="color: hsl(120, 100%, 40%);">+        See pjsip.conf for the exact auth scenarios. </span><br><span style="color: hsl(120, 100%, 40%);">+        The test is fast since the sipp instances are all run in parallel as are</span><br><span style="color: hsl(120, 100%, 40%);">+        the Qualify commands.  The test should also be immune to timing variances</span><br><span style="color: hsl(120, 100%, 40%);">+        since the test case doesn't issue the AMI commands until the sipp scenarios</span><br><span style="color: hsl(120, 100%, 40%);">+        are started.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: sipp-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: 'sipp.SIPpTestCase'</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            config-section: ami-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: 'pluggable_modules.EventActionModule'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sipp-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    memcheck-delay-stop: 7</span><br><span style="color: hsl(120, 100%, 40%);">+    fail-on-any: True</span><br><span style="color: hsl(120, 100%, 40%);">+    test-iterations:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            scenarios:</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.2', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.3', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.4', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.5', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.6', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'multiple_realm_multiple_digest_options.xml', '-i': '127.0.0.7', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ami-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    -</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-start:</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions:</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12342', Endpoint: 'sipp2' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12343', Endpoint: 'sipp3' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12344', Endpoint: 'sipp4' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12345', Endpoint: 'sipp5' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12346', Endpoint: 'sipp6' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12347', Endpoint: 'sipp7' } }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - sipp :</span><br><span style="color: hsl(120, 100%, 40%);">+            version : 'v3.0'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_registration'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_authenticator_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - pjsip</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span>\ No newline at end of file</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/configs/ast1/pjsip.conf b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/configs/ast1/pjsip.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..4377dd5</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/configs/ast1/pjsip.conf</span><br><span>@@ -0,0 +1,162 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[system]</span><br><span style="color: hsl(120, 100%, 40%);">+type = system</span><br><span style="color: hsl(120, 100%, 40%);">+timer_b = 32000</span><br><span style="color: hsl(120, 100%, 40%);">+timer_t1 = 500</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[local]</span><br><span style="color: hsl(120, 100%, 40%);">+type=transport</span><br><span style="color: hsl(120, 100%, 40%);">+protocol=udp</span><br><span style="color: hsl(120, 100%, 40%);">+bind=127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[aor_template](!)</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+qualify_frequency=0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; The sipp scenario expects a Authorization header with...</span><br><span style="color: hsl(120, 100%, 40%);">+; realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+; username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+; password = optpasswd </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswdbad</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswdbad</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good2]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+; This will fail because the password is bad</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optbad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp2@127.0.0.2:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp2</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = star_good,wildcard_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match.  Same a above but testing that having the</span><br><span style="color: hsl(120, 100%, 40%);">+; wildcard_first doesn't change the behavior.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp3@127.0.0.3:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp3</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_bad,star_good</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Having 2 wildcard entries for an endpoint is a</span><br><span style="color: hsl(120, 100%, 40%);">+; misconfiguration but we should only ever consider</span><br><span style="color: hsl(120, 100%, 40%);">+; the first one we find.  The inverse order is tested</span><br><span style="color: hsl(120, 100%, 40%);">+; in a different test case. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp4@127.0.0.4:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp4</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good,wildcard_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_is good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+; ast_bad should be discarded because it's neither</span><br><span style="color: hsl(120, 100%, 40%);">+; a wilcard nor an exact realm match.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp5@127.0.0.5:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp5</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good,ast_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure reversing the order doesn't change the behavior. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp6@127.0.0.6:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp6</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = ast_bad,wildcard_good</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure using a realm of "*" is considered a wildcard.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp7@127.0.0.7:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp7</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = ast_bad,wildcard_good2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/sipp/single_realm_multiple_digest_options.xml b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/sipp/single_realm_multiple_digest_options.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..e861714</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/sipp/single_realm_multiple_digest_options.xml</span><br><span>@@ -0,0 +1,102 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="ISO-8859-1" ?></span><br><span style="color: hsl(120, 100%, 40%);">+<!-- If you have a smart XML editor, using the sipp dtd can be a big help --></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE scenario SYSTEM "../../../../../../../contrib/sipp/sipp.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<scenario name="single_realm_single_digest_options"></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+      </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!-- </span><br><span style="color: hsl(120, 100%, 40%);">+              The nonce and opaque have no meaning other than they're properly formatted.</span><br><span style="color: hsl(120, 100%, 40%);">+               We're going to send a multiple challenges with the "star" realm and "md5",</span><br><span style="color: hsl(120, 100%, 40%);">+            "sha256" and "sha256-512" digest algorithms.  At the time this test was</span><br><span style="color: hsl(120, 100%, 40%);">+           written, only an "md5" response should be received from asterisk.</span><br><span style="color: hsl(120, 100%, 40%);">+   --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 401 Authorization Required</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=md5,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=sha256-512,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+ </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+              <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <ereg regexp="Digest .*username=.(.+)..*realm=.(star)."</span><br><span style="color: hsl(120, 100%, 40%);">+                          search_in="hdr" header="Authorization:"</span><br><span style="color: hsl(120, 100%, 40%);">+                           assign_to="junk,username,realm"/></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+                               sipp will examine the returned Authentication header and</span><br><span style="color: hsl(120, 100%, 40%);">+                              validate the username and password.</span><br><span style="color: hsl(120, 100%, 40%);">+                   --></span><br><span style="color: hsl(120, 100%, 40%);">+                        <verifyauth assign_to="authvalid" username="optuser"</span><br><span style="color: hsl(120, 100%, 40%);">+                           password="optpasswd"/></span><br><span style="color: hsl(120, 100%, 40%);">+           </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               If authvalid is set, the alidation was successful so skip on</span><br><span style="color: hsl(120, 100%, 40%);">+          down to sending an OK.</span><br><span style="color: hsl(120, 100%, 40%);">+        --></span><br><span style="color: hsl(120, 100%, 40%);">+        <nop test="authvalid" next="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               We're not testing Asterisk's ability to handle repeated auth failures</span><br><span style="color: hsl(120, 100%, 40%);">+         so we just send back a 503 and terminate the test with prejudice</span><br><span style="color: hsl(120, 100%, 40%);">+      --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 503 Service Unavailable</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+  </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <nop></span><br><span style="color: hsl(120, 100%, 40%);">+           <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+                               Terminate the test with prejudice.</span><br><span style="color: hsl(120, 100%, 40%);">+                            sipp will return a non-zero return code which</span><br><span style="color: hsl(120, 100%, 40%);">+                         will cause the test to fail.</span><br><span style="color: hsl(120, 100%, 40%);">+                  --></span><br><span style="color: hsl(120, 100%, 40%);">+                        <exec int_cmd="stop_now"/></span><br><span style="color: hsl(120, 100%, 40%);">+            </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </nop></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        <!-- Auth passed so just send back an OK and we're done --> </span><br><span style="color: hsl(120, 100%, 40%);">+        <label id="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 200 OK</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: [len]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+       </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <Reference variables="junk,username,realm"/></span><br><span style="color: hsl(120, 100%, 40%);">+</scenario></span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/test-config.yaml b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..2593e33</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_multiple_digest/test-config.yaml</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+tinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: 'Test Single Realm Multiple Digest authentication using OPTIONS'</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Each sipp scenario does exactly the same thing just listening on</span><br><span style="color: hsl(120, 100%, 40%);">+        different addresses. The endpoint we qualify determines the exact auth</span><br><span style="color: hsl(120, 100%, 40%);">+        scenario we're testing.</span><br><span style="color: hsl(120, 100%, 40%);">+        On fully-booted, we just send 1 Qualify command to each of the endpoints</span><br><span style="color: hsl(120, 100%, 40%);">+        and if any of the sipp instances fails to authenticate, the test fails.</span><br><span style="color: hsl(120, 100%, 40%);">+        See pjsip.conf for the exact auth scenarios. </span><br><span style="color: hsl(120, 100%, 40%);">+        The test is fast since the sipp instances are all run in parallel as are</span><br><span style="color: hsl(120, 100%, 40%);">+        the Qualify commands.  The test should also be immune to timing variances</span><br><span style="color: hsl(120, 100%, 40%);">+        since the test case doesn't issue the AMI commands until the sipp scenarios</span><br><span style="color: hsl(120, 100%, 40%);">+        are started.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: sipp-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: 'sipp.SIPpTestCase'</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            config-section: ami-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: 'pluggable_modules.EventActionModule'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sipp-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    memcheck-delay-stop: 7</span><br><span style="color: hsl(120, 100%, 40%);">+    fail-on-any: True</span><br><span style="color: hsl(120, 100%, 40%);">+    test-iterations:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            scenarios:</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.2', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.3', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.4', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.5', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.6', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_multiple_digest_options.xml', '-i': '127.0.0.7', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ami-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    -</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-start:</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions:</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12342', Endpoint: 'sipp2' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12343', Endpoint: 'sipp3' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12344', Endpoint: 'sipp4' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12345', Endpoint: 'sipp5' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12346', Endpoint: 'sipp6' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12347', Endpoint: 'sipp7' } }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - sipp :</span><br><span style="color: hsl(120, 100%, 40%);">+            version : 'v3.0'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_registration'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_authenticator_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - pjsip</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span>\ No newline at end of file</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_single_digest/configs/ast1/pjsip.conf b/tests/channels/pjsip/auth/uac/single_realm_single_digest/configs/ast1/pjsip.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..4377dd5</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_single_digest/configs/ast1/pjsip.conf</span><br><span>@@ -0,0 +1,162 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[system]</span><br><span style="color: hsl(120, 100%, 40%);">+type = system</span><br><span style="color: hsl(120, 100%, 40%);">+timer_b = 32000</span><br><span style="color: hsl(120, 100%, 40%);">+timer_t1 = 500</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[local]</span><br><span style="color: hsl(120, 100%, 40%);">+type=transport</span><br><span style="color: hsl(120, 100%, 40%);">+protocol=udp</span><br><span style="color: hsl(120, 100%, 40%);">+bind=127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[aor_template](!)</span><br><span style="color: hsl(120, 100%, 40%);">+type=aor</span><br><span style="color: hsl(120, 100%, 40%);">+qualify_frequency=0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; The sipp scenario expects a Authorization header with...</span><br><span style="color: hsl(120, 100%, 40%);">+; realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+; username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+; password = optpasswd </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[star_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswdbad</span><br><span style="color: hsl(120, 100%, 40%);">+realm = star</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ast_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswdbad</span><br><span style="color: hsl(120, 100%, 40%);">+realm = ast</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_good2]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optpasswd</span><br><span style="color: hsl(120, 100%, 40%);">+realm = *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+; This will fail because the password is bad</span><br><span style="color: hsl(120, 100%, 40%);">+[wildcard_bad]</span><br><span style="color: hsl(120, 100%, 40%);">+type = auth</span><br><span style="color: hsl(120, 100%, 40%);">+auth_type = userpass</span><br><span style="color: hsl(120, 100%, 40%);">+username = optuser</span><br><span style="color: hsl(120, 100%, 40%);">+password = optbad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp2@127.0.0.2:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp2]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp2</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = star_good,wildcard_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass because star_good is used</span><br><span style="color: hsl(120, 100%, 40%);">+; and the wildcard is discarded because we found an exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match.  Same a above but testing that having the</span><br><span style="color: hsl(120, 100%, 40%);">+; wildcard_first doesn't change the behavior.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp3@127.0.0.3:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp3]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp3</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_bad,star_good</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Having 2 wildcard entries for an endpoint is a</span><br><span style="color: hsl(120, 100%, 40%);">+; misconfiguration but we should only ever consider</span><br><span style="color: hsl(120, 100%, 40%);">+; the first one we find.  The inverse order is tested</span><br><span style="color: hsl(120, 100%, 40%);">+; in a different test case. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp4@127.0.0.4:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp4]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp4</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good,wildcard_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_is good configured.</span><br><span style="color: hsl(120, 100%, 40%);">+; ast_bad should be discarded because it's neither</span><br><span style="color: hsl(120, 100%, 40%);">+; a wilcard nor an exact realm match.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp5@127.0.0.5:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp5]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp5</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = wildcard_good,ast_bad</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure reversing the order doesn't change the behavior. </span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp6@127.0.0.6:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp6]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp6</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = ast_bad,wildcard_good</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; This endpoint should pass even though there's no exact</span><br><span style="color: hsl(120, 100%, 40%);">+; realm match because wildcard_good is configured.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+; Same scenario as the previous endpoint but making</span><br><span style="color: hsl(120, 100%, 40%);">+; sure using a realm of "*" is considered a wildcard.</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7](aor_template)</span><br><span style="color: hsl(120, 100%, 40%);">+contact = sip:sipp7@127.0.0.7:5060</span><br><span style="color: hsl(120, 100%, 40%);">+[sipp7]</span><br><span style="color: hsl(120, 100%, 40%);">+type = endpoint</span><br><span style="color: hsl(120, 100%, 40%);">+aors=sipp7</span><br><span style="color: hsl(120, 100%, 40%);">+outbound_auth = ast_bad,wildcard_good2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_single_digest/sipp/single_realm_single_digest_options.xml b/tests/channels/pjsip/auth/uac/single_realm_single_digest/sipp/single_realm_single_digest_options.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..05922cb</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_single_digest/sipp/single_realm_single_digest_options.xml</span><br><span>@@ -0,0 +1,99 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="ISO-8859-1" ?></span><br><span style="color: hsl(120, 100%, 40%);">+<!-- If you have a smart XML editor, using the sipp dtd can be a big help --></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE scenario SYSTEM "../../../../../../../contrib/sipp/sipp.dtd"></span><br><span style="color: hsl(120, 100%, 40%);">+<scenario name="single_realm_single_digest_options"></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+      </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!-- </span><br><span style="color: hsl(120, 100%, 40%);">+              The nonce and opaque have no meaning other than they're properly formatted.</span><br><span style="color: hsl(120, 100%, 40%);">+               We're going to send a single challenge with the "star" realm and "md5"</span><br><span style="color: hsl(120, 100%, 40%);">+                digest algorithm.  99.999% of the cases.</span><br><span style="color: hsl(120, 100%, 40%);">+      --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 401 Authorization Required</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+      WWW-Authenticate: Digest realm="star",nonce="1618496418/76de4d6a2e8750da189999715d6d55b1",opaque="4982d4386a93d85d",algorithm=md5,qop="auth"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+   </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <recv request="OPTIONS"></span><br><span style="color: hsl(120, 100%, 40%);">+              <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <ereg regexp="Digest .*username=.(.+)..*realm=.(star)."</span><br><span style="color: hsl(120, 100%, 40%);">+                          search_in="hdr" header="Authorization:"</span><br><span style="color: hsl(120, 100%, 40%);">+                           assign_to="junk,username,realm"/></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+                               sipp will examine the returned Authentication header and</span><br><span style="color: hsl(120, 100%, 40%);">+                              validate the username and password.</span><br><span style="color: hsl(120, 100%, 40%);">+                   --></span><br><span style="color: hsl(120, 100%, 40%);">+                        <verifyauth assign_to="authvalid" username="optuser"</span><br><span style="color: hsl(120, 100%, 40%);">+                           password="optpasswd"/></span><br><span style="color: hsl(120, 100%, 40%);">+           </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </recv></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               If authvalid is set, the alidation was successful so skip on</span><br><span style="color: hsl(120, 100%, 40%);">+          down to sending an OK.</span><br><span style="color: hsl(120, 100%, 40%);">+        --></span><br><span style="color: hsl(120, 100%, 40%);">+        <nop test="authvalid" next="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   <!--</span><br><span style="color: hsl(120, 100%, 40%);">+               We're not testing Asterisk's ability to handle repeated auth failures</span><br><span style="color: hsl(120, 100%, 40%);">+         so we just send back a 503 and terminate the test with prejudice</span><br><span style="color: hsl(120, 100%, 40%);">+      --></span><br><span style="color: hsl(120, 100%, 40%);">+        <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 503 Service Unavailable</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+  </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <nop></span><br><span style="color: hsl(120, 100%, 40%);">+           <action></span><br><span style="color: hsl(120, 100%, 40%);">+                        <!--</span><br><span style="color: hsl(120, 100%, 40%);">+                               Terminate the test with prejudice.</span><br><span style="color: hsl(120, 100%, 40%);">+                            sipp will return a non-zero return code which</span><br><span style="color: hsl(120, 100%, 40%);">+                         will cause the test to fail.</span><br><span style="color: hsl(120, 100%, 40%);">+                  --></span><br><span style="color: hsl(120, 100%, 40%);">+                        <exec int_cmd="stop_now"/></span><br><span style="color: hsl(120, 100%, 40%);">+            </action></span><br><span style="color: hsl(120, 100%, 40%);">+       </nop></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        <!-- Auth passed so just send back an OK and we're done --> </span><br><span style="color: hsl(120, 100%, 40%);">+        <label id="goodauth"/></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      <send></span><br><span style="color: hsl(120, 100%, 40%);">+    <![CDATA[</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      SIP/2.0 200 OK</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Via:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_From:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_To:];tag=[pid]SIPpTag01[call_number]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_Call-ID:]</span><br><span style="color: hsl(120, 100%, 40%);">+      [last_CSeq:]</span><br><span style="color: hsl(120, 100%, 40%);">+      Contact: <sip:[local_ip]:[local_port];transport=[transport]></span><br><span style="color: hsl(120, 100%, 40%);">+      Content-Length: [len]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ]]></span><br><span style="color: hsl(120, 100%, 40%);">+       </send></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       <Reference variables="junk,username,realm"/></span><br><span style="color: hsl(120, 100%, 40%);">+</scenario></span><br><span>diff --git a/tests/channels/pjsip/auth/uac/single_realm_single_digest/test-config.yaml b/tests/channels/pjsip/auth/uac/single_realm_single_digest/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..9de956c</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/single_realm_single_digest/test-config.yaml</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+tinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: 'Test Single Realm Single Digest authentication using OPTIONS'</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Each sipp scenario does exactly the same thing just listening on</span><br><span style="color: hsl(120, 100%, 40%);">+        different addresses. The endpoint we qualify determines the exact auth</span><br><span style="color: hsl(120, 100%, 40%);">+        scenario we're testing.</span><br><span style="color: hsl(120, 100%, 40%);">+        On fully-booted, we just send 1 Qualify command to each of the endpoints</span><br><span style="color: hsl(120, 100%, 40%);">+        and if any of the sipp instances fails to authenticate, the test fails.</span><br><span style="color: hsl(120, 100%, 40%);">+        See pjsip.conf for the exact auth scenarios. </span><br><span style="color: hsl(120, 100%, 40%);">+        The test is fast since the sipp instances are all run in parallel as are</span><br><span style="color: hsl(120, 100%, 40%);">+        the Qualify commands.  The test should also be immune to timing variances</span><br><span style="color: hsl(120, 100%, 40%);">+        since the test case doesn't issue the AMI commands until the sipp scenarios</span><br><span style="color: hsl(120, 100%, 40%);">+        are started.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: sipp-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: 'sipp.SIPpTestCase'</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            config-section: ami-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: 'pluggable_modules.EventActionModule'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sipp-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    memcheck-delay-stop: 7</span><br><span style="color: hsl(120, 100%, 40%);">+    fail-on-any: True</span><br><span style="color: hsl(120, 100%, 40%);">+    test-iterations:</span><br><span style="color: hsl(120, 100%, 40%);">+        -</span><br><span style="color: hsl(120, 100%, 40%);">+            scenarios:</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.2', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.3', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.4', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.5', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.6', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+                - { 'key-args': {'scenario': 'single_realm_single_digest_options.xml', '-i': '127.0.0.7', '-p': '5060' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    'ordered-args': ['-nd', '-bind_local'] }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ami-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    -</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-start:</span><br><span style="color: hsl(120, 100%, 40%);">+        ami-actions:</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12342', Endpoint: 'sipp2' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12343', Endpoint: 'sipp3' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12344', Endpoint: 'sipp4' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12345', Endpoint: 'sipp5' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12346', Endpoint: 'sipp6' } }</span><br><span style="color: hsl(120, 100%, 40%);">+            - { action: { Action: 'PJSIPQualify', ActionID: '12347', Endpoint: 'sipp7' } }</span><br><span style="color: hsl(120, 100%, 40%);">+    </span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - sipp :</span><br><span style="color: hsl(120, 100%, 40%);">+            version : 'v3.0'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_registration'</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : 'res_pjsip_outbound_authenticator_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - pjsip</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span>\ No newline at end of file</span><br><span>diff --git a/tests/channels/pjsip/auth/uac/tests.yaml b/tests/channels/pjsip/auth/uac/tests.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..3a6b8be</span><br><span>--- /dev/null</span><br><span>+++ b/tests/channels/pjsip/auth/uac/tests.yaml</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+tests:</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'single_realm_single_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'single_realm_multiple_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'multiple_realm_multiple_digest'</span><br><span style="color: hsl(120, 100%, 40%);">+    </span><br><span>\ No newline at end of file</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/testsuite/+/15902">change 15902</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/testsuite/+/15902"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: testsuite </div>
<div style="display:none"> Gerrit-Branch: 18 </div>
<div style="display:none"> Gerrit-Change-Id: I64d8ca768cf7a2c55ca4a256ec37bf4c712b4004 </div>
<div style="display:none"> Gerrit-Change-Number: 15902 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>