Fixed issue preventing auth form scopes from being stored
I forgot that PHP’s POST body parsing strips the required trailing [] from names.
This commit is contained in:
@@ -61,13 +61,13 @@
|
||||
<td class="warning small"><div align="right">4 / 5</div></td>
|
||||
<td class="warning small"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></td>
|
||||
<td class="success big"> <div class="progress">
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="96.69" aria-valuemin="0" aria-valuemax="100" style="width: 96.69%">
|
||||
<span class="sr-only">96.69% covered (success)</span>
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="96.70" aria-valuemin="0" aria-valuemax="100" style="width: 96.70%">
|
||||
<span class="sr-only">96.70% covered (success)</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="success small"><div align="right">96.69%</div></td>
|
||||
<td class="success small"><div align="right">263 / 272</div></td>
|
||||
<td class="success small"><div align="right">96.70%</div></td>
|
||||
<td class="success small"><div align="right">264 / 273</div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
@@ -90,13 +90,13 @@
|
||||
<td class="warning small"><div align="right">4 / 5</div></td>
|
||||
<td class="warning small">105</td>
|
||||
<td class="success big"> <div class="progress">
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="96.69" aria-valuemin="0" aria-valuemax="100" style="width: 96.69%">
|
||||
<span class="sr-only">96.69% covered (success)</span>
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="96.70" aria-valuemin="0" aria-valuemax="100" style="width: 96.70%">
|
||||
<span class="sr-only">96.70% covered (success)</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="success small"><div align="right">96.69%</div></td>
|
||||
<td class="success small"><div align="right">263 / 272</div></td>
|
||||
<td class="success small"><div align="right">96.70%</div></td>
|
||||
<td class="success small"><div align="right">264 / 273</div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
@@ -151,19 +151,19 @@
|
||||
</td>
|
||||
<td class="danger small"><div align="right">0.00%</div></td>
|
||||
<td class="danger small"><div align="right">0 / 1</div></td>
|
||||
<td class="danger small">67.70</td>
|
||||
<td class="danger small">67.69</td>
|
||||
<td class="success big"> <div class="progress">
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="94.61" aria-valuemin="0" aria-valuemax="100" style="width: 94.61%">
|
||||
<span class="sr-only">94.61% covered (success)</span>
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="94.64" aria-valuemin="0" aria-valuemax="100" style="width: 94.64%">
|
||||
<span class="sr-only">94.64% covered (success)</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="success small"><div align="right">94.61%</div></td>
|
||||
<td class="success small"><div align="right">158 / 167</div></td>
|
||||
<td class="success small"><div align="right">94.64%</div></td>
|
||||
<td class="success small"><div align="right">159 / 168</div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="success" colspan="4"> <a href="#720"><abbr title="handleTokenEndpointRequest(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface">handleTokenEndpointRequest</abbr></a></td>
|
||||
<td class="success" colspan="4"> <a href="#721"><abbr title="handleTokenEndpointRequest(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface">handleTokenEndpointRequest</abbr></a></td>
|
||||
<td class="success big"> <div class="progress">
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
|
||||
<span class="sr-only">100.00% covered (success)</span>
|
||||
@@ -184,7 +184,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="success" colspan="4"> <a href="#824"><abbr title="handleException(Taproot\IndieAuth\IndieAuthException $exception): Psr\Http\Message\ResponseInterface">handleException</abbr></a></td>
|
||||
<td class="success" colspan="4"> <a href="#825"><abbr title="handleException(Taproot\IndieAuth\IndieAuthException $exception): Psr\Http\Message\ResponseInterface">handleException</abbr></a></td>
|
||||
<td class="success big"> <div class="progress">
|
||||
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100.00" aria-valuemin="0" aria-valuemax="100" style="width: 100.00%">
|
||||
<span class="sr-only">100.00% covered (success)</span>
|
||||
@@ -829,237 +829,238 @@
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="617" href="#617">617</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="618" href="#618">618</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Pass it to the auth code customisation callback.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 619" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="619" href="#619">619</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$code</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">authorizationForm</span><span class="default">-></span><span class="default">transformAuthorizationCode</span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$code</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="620" href="#620">620</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="621" href="#621">621</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Store the authorization code.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 622" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="622" href="#622">622</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$authCode</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">tokenStorage</span><span class="default">-></span><span class="default">createAuthCode</span><span class="keyword">(</span><span class="default">$code</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 623" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="623" href="#623">623</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="624" href="#624">624</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If saving the authorization code failed silently, there isn’t much we can do about it,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="625" href="#625">625</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// but should at least log and return an error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 626" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="626" href="#626">626</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Saving the authorization code failed and returned false without raising an exception."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 627" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="627" href="#627">627</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="628" href="#628">628</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="629" href="#629">629</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="630" href="#630">630</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Return a redirect to the client app.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 631" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="631" href="#631">631</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">302</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 632" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="632" href="#632">632</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Location'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">appendQueryParams</span><span class="keyword">(</span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 633" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="633" href="#633">633</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'code'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 634" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="634" href="#634">634</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'state'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$code</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="635" href="#635">635</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 636" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="636" href="#636">636</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Cache-control'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'no-cache'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="637" href="#637">637</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="638" href="#638">638</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="639" href="#639">639</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="640" href="#640">640</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Otherwise, the user is authenticated and needs to authorize the client app + choose scopes.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="641" href="#641">641</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="642" href="#642">642</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Fetch the client_id URL to find information about the client to present to the user.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="643" href="#643">643</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: in order to comply with https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="644" href="#644">644</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// it may be necessary to do this before returning any other kind of error response, as, per</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="645" href="#645">645</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// the spec, errors should only be shown to the user if the client_id and redirect_uri parameters</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="646" href="#646">646</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// are missing or invalid. Otherwise, they should be sent back to the client with an error</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="647" href="#647">647</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// redirect response.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 648" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="648" href="#648">648</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdResponse</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdMf2</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="649" href="#649">649</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="650" href="#650">650</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/** @var ResponseInterface $clientIdResponse */</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 651" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="651" href="#651">651</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">list</span><span class="keyword">(</span><span class="default">$clientIdResponse</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">call_user_func</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">httpGetWithEffectiveUrl</span><span class="keyword">,</span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 652" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="652" href="#652">652</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientIdMf2</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">Mf2</span><span class="default">\</span><span class="default">parse</span><span class="keyword">(</span><span class="default">(string)</span><span class="default"> </span><span class="default">$clientIdResponse</span><span class="default">-></span><span class="default">getBody</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 653" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="653" href="#653">653</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">ClientExceptionInterface</span><span class="default"> </span><span class="keyword">|</span><span class="default"> </span><span class="default">RequestExceptionInterface</span><span class="default"> </span><span class="keyword">|</span><span class="default"> </span><span class="default">NetworkExceptionInterface</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 654" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="654" href="#654">654</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Caught an HTTP exception while trying to fetch the client_id. Returning an error response."</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 655" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="655" href="#655">655</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'client_id'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 656" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="656" href="#656">656</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">__toString</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="657" href="#657">657</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="658" href="#658">658</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="659" href="#659">659</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// At this point in the flow, we’ve already guaranteed that the redirect_uri is valid,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="660" href="#660">660</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// so in theory we should report these errors by redirecting there.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 661" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="661" href="#661">661</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 662" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="662" href="#662">662</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">Exception</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 663" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="663" href="#663">663</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Caught an unknown exception while trying to fetch the client_id. Returning an error response."</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 664" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="664" href="#664">664</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">__toString</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="665" href="#665">665</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="666" href="#666">666</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 667" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="667" href="#667">667</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="668" href="#668">668</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="669" href="#669">669</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="670" href="#670">670</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="671" href="#671">671</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Search for an h-app with u-url matching the client_id.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 672" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="672" href="#672">672</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientHApps</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">M</span><span class="default">\</span><span class="default">findMicroformatsByProperty</span><span class="keyword">(</span><span class="default">M</span><span class="default">\</span><span class="default">findMicroformatsByType</span><span class="keyword">(</span><span class="default">$clientIdMf2</span><span class="keyword">,</span><span class="default"> </span><span class="default">'h-app'</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="default">'url'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 673" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="673" href="#673">673</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientHApp</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$clientHApps</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">?</span><span class="default"> </span><span class="default">null</span><span class="default"> </span><span class="keyword">:</span><span class="default"> </span><span class="default">$clientHApps</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="674" href="#674">674</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="675" href="#675">675</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Present the authorization UI.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 676" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="676" href="#676">676</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">authorizationForm</span><span class="default">-></span><span class="default">showForm</span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$authenticationResult</span><span class="keyword">,</span><span class="default"> </span><span class="default">$authenticationRedirect</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientHApp</span><span class="keyword">)</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 677" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="677" href="#677">677</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">-></span><span class="default">withAddedHeader</span><span class="keyword">(</span><span class="default">'Cache-control'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'no-cache'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="678" href="#678">678</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="679" href="#679">679</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="680" href="#680">680</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="681" href="#681">681</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the request isn’t an IndieAuth Authorization or Code-redeeming request, it’s either an invalid</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="682" href="#682">682</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// request or something to do with a custom auth handler (e.g. sending a one-time code in an email.)</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 683" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="683" href="#683">683</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$nonIndieAuthRequestResult</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">call_user_func</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">handleNonIndieAuthRequest</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 684" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="684" href="#684">684</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$nonIndieAuthRequestResult</span><span class="default"> </span><span class="keyword">instanceof</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 685" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="685" href="#685">685</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$nonIndieAuthRequestResult</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="686" href="#686">686</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">else</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="687" href="#687">687</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// In this code path we have not validated the redirect_uri, so show a regular error page</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="688" href="#688">688</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// rather than returning a redirect error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 689" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="689" href="#689">689</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="690" href="#690">690</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 691" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="691" href="#691">691</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="692" href="#692">692</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// All IndieAuthExceptions will already have been logged.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 693" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="693" href="#693">693</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">handleException</span><span class="keyword">(</span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 694" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="694" href="#694">694</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">Exception</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="695" href="#695">695</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Unknown exceptions will not have been logged; do so now.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 696" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="696" href="#696">696</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="string">"</span><span class="string">Caught unknown exception: </span><span class="string">{</span><span class="string">$e</span><span class="keyword">}</span><span class="string">"</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 697" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="697" href="#697">697</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">handleException</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="698" href="#698">698</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="22 tests cover line 699" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="699" href="#699">699</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><span class="default"> </span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="700" href="#700">700</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="701" href="#701">701</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="702" href="#702">702</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/**</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="703" href="#703">703</a></td><td class="col-11 codeLine"><span class="comment"> * Handle Token Endpoint Request</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="704" href="#704">704</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="705" href="#705">705</a></td><td class="col-11 codeLine"><span class="comment"> * Handles requests to the IndieAuth token endpoint. The logical flow can be summarised as follows:</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="706" href="#706">706</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="707" href="#707">707</a></td><td class="col-11 codeLine"><span class="comment"> * * Check that the request is a code redeeming request. Return an error if not.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="708" href="#708">708</a></td><td class="col-11 codeLine"><span class="comment"> * * Ensure that all required parameters are present. Return an error if not.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="709" href="#709">709</a></td><td class="col-11 codeLine"><span class="comment"> * * Attempt to exchange the `code` parameter for an access token. Return an error if it fails.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="710" href="#710">710</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the client_id and redirect_uri request parameters match those stored in the auth code. If not, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="711" href="#711">711</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the provided code_verifier hashes to the code_challenge stored in the auth code. If not, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="712" href="#712">712</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the granted scope stored in the auth code is not empty. If it is, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="713" href="#713">713</a></td><td class="col-11 codeLine"><span class="comment"> * * Otherwise, return a success response containing information about the issued access token.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="714" href="#714">714</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="715" href="#715">715</a></td><td class="col-11 codeLine"><span class="comment"> * This method must NOT be CSRF-protected as it accepts external requests from client apps.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="716" href="#716">716</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="717" href="#717">717</a></td><td class="col-11 codeLine"><span class="comment"> * @param ServerRequestInterface $request</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="718" href="#718">718</a></td><td class="col-11 codeLine"><span class="comment"> * @return ResponseInterface</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="719" href="#719">719</a></td><td class="col-11 codeLine"><span class="comment"> */</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="720" href="#720">720</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">handleTokenEndpointRequest</span><span class="keyword">(</span><span class="default">ServerRequestInterface</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">:</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="8 tests cover line 721" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="721" href="#721">721</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">isIndieAuthAuthorizationCodeRedeemingRequest</span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 722" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="722" href="#722">722</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">info</span><span class="keyword">(</span><span class="default">'Handling a request to redeem an authorization code for profile information.'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="723" href="#723">723</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 724" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="724" href="#724">724</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$bodyParams</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$request</span><span class="default">-></span><span class="default">getParsedBody</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="725" href="#725">725</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 726" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="726" href="#726">726</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">isset</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 727" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="727" href="#727">727</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">warning</span><span class="keyword">(</span><span class="default">'The exchange request was missing the code parameter. Returning an error response.'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 728" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="728" href="#728">728</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 729" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="729" href="#729">729</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="730" href="#730">730</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'The code parameter was missing.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="731" href="#731">731</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="732" href="#732">732</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="733" href="#733">733</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="734" href="#734">734</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Attempt to internally exchange the provided auth code for an access token.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="735" href="#735">735</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// We do this before anything else so that the auth code is invalidated as soon as the request starts,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="736" href="#736">736</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// and the resulting access token is revoked if we encounter an error. This ends up providing a simpler</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="737" href="#737">737</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// and more flexible interface for TokenStorage implementors.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="738" href="#738">738</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="739" href="#739">739</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Call the token exchange method, passing in a callback which performs additional validation</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="740" href="#740">740</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// on the auth code before it gets exchanged.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 741" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="741" href="#741">741</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$tokenData</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">tokenStorage</span><span class="default">-></span><span class="default">exchangeAuthCodeForAccessToken</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">use</span><span class="default"> </span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="742" href="#742">742</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Verify that all required parameters are included.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 743" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="743" href="#743">743</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$requiredParameters</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">requirePkce</span><span class="default"> </span><span class="default">or</span><span class="default"> </span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">?</span><span class="default"> </span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'redirect_uri'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="default"> </span><span class="keyword">:</span><span class="default"> </span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 744" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="744" href="#744">744</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$missingRequiredParameters</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">array_filter</span><span class="keyword">(</span><span class="default">$requiredParameters</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="default">$p</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">use</span><span class="default"> </span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 745" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="745" href="#745">745</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">!</span><span class="default">array_key_exists</span><span class="keyword">(</span><span class="default">$p</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">$p</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 746" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="746" href="#746">746</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 747" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="747" href="#747">747</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$missingRequiredParameters</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 748" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="748" href="#748">748</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">warning</span><span class="keyword">(</span><span class="default">'The exchange request was missing required parameters. Returning an error response.'</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'missing'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$missingRequiredParameters</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 749" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="749" href="#749">749</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_REQUEST</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="750" href="#750">750</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="751" href="#751">751</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="752" href="#752">752</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Verify that it was issued for the same client_id and redirect_uri</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 753" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="753" href="#753">753</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 754" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="754" href="#754">754</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 755" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="755" href="#755">755</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"The provided client_id and/or redirect_uri did not match those stored in the token."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 756" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="756" href="#756">756</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="757" href="#757">757</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="758" href="#758">758</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="759" href="#759">759</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the auth code was requested with no code_challenge, but the exchange request provides a </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="760" href="#760">760</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// code_verifier, return an error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 761" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="761" href="#761">761</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="keyword">)</span><span class="default"> </span><span class="default">&&</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 762" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="762" href="#762">762</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"A code_verifier was provided when trying to exchange an auth code requested without a code_challenge."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 763" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="763" href="#763">763</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="764" href="#764">764</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="765" href="#765">765</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 766" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="766" href="#766">766</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">requirePkce</span><span class="default"> </span><span class="default">or</span><span class="default"> </span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="767" href="#767">767</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Check that the supplied code_verifier hashes to the stored code_challenge</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="768" href="#768">768</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: support method = plain as well as S256.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 769" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="769" href="#769">769</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="default">hash_equals</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">generatePKCECodeChallenge</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 770" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="770" href="#770">770</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"The provided code_verifier did not hash to the stored code_challenge"</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 771" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="771" href="#771">771</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="772" href="#772">772</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="773" href="#773">773</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="774" href="#774">774</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="775" href="#775">775</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Check that scope is not empty.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 776" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="776" href="#776">776</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'scope'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 777" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="777" href="#777">777</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"An exchange request for a token with an empty scope was sent to the token endpoint."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 778" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="778" href="#778">778</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="779" href="#779">779</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 780" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="780" href="#780">780</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 781" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="781" href="#781">781</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="782" href="#782">782</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If an exception was thrown, return a corresponding error response.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 783" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="783" href="#783">783</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 784" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="784" href="#784">784</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">getInfo</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'error'</span><span class="keyword">]</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 785" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="785" href="#785">785</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">getMessage</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="786" href="#786">786</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="787" href="#787">787</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="788" href="#788">788</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 789" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="789" href="#789">789</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$tokenData</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 790" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="790" href="#790">790</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">'Attempting to exchange an auth code for a token resulted in null.'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 791" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="791" href="#791">791</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 792" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="792" href="#792">792</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_grant'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="793" href="#793">793</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'The provided credentials were not valid.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="794" href="#794">794</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="795" href="#795">795</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="796" href="#796">796</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="797" href="#797">797</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: return an error if the token doesn’t contain a me key.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="798" href="#798">798</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="799" href="#799">799</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If everything checked out, return {"me": "https://example.com"} response</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 800" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="800" href="#800">800</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">200</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 801" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="801" href="#801">801</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="802" href="#802">802</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'cache-control'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'no-store'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 803" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="803" href="#803">803</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="default">array_merge</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="804" href="#804">804</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Ensure that the token_type key is present, if tokenStorage doesn’t include it.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 805" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="805" href="#805">805</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'token_type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'Bearer'</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 806" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="806" href="#806">806</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_filter</span><span class="keyword">(</span><span class="default">$tokenData</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="default">string</span><span class="default"> </span><span class="default">$k</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="807" href="#807">807</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// We should be able to trust the return data from tokenStorage, but there’s no harm in</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="808" href="#808">808</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// preventing code_challenges from leaking, per OAuth2.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 809" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="809" href="#809">809</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">!</span><span class="default">in_array</span><span class="keyword">(</span><span class="default">$k</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'code_challenge_method'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 810" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="810" href="#810">810</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">,</span><span class="default"> </span><span class="default">ARRAY_FILTER_USE_KEY</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="811" href="#811">811</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="812" href="#812">812</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 813" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="813" href="#813">813</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 814" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="814" href="#814">814</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="815" href="#815">815</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'Request to token endpoint was not a valid code exchange request.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="816" href="#816">816</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="817" href="#817">817</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="818" href="#818">818</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="819" href="#819">819</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/**</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="820" href="#820">820</a></td><td class="col-11 codeLine"><span class="comment"> * Handle Exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="821" href="#821">821</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="822" href="#822">822</a></td><td class="col-11 codeLine"><span class="comment"> * Turns an instance of `IndieAuthException` into an appropriate instance of `ResponseInterface`.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="823" href="#823">823</a></td><td class="col-11 codeLine"><span class="comment"> */</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="824" href="#824">824</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">protected</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">handleException</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$exception</span><span class="keyword">)</span><span class="keyword">:</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 825" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="825" href="#825">825</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$exceptionData</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getInfo</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="826" href="#826">826</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 827" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="827" href="#827">827</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'statusCode'</span><span class="keyword">]</span><span class="default"> </span><span class="default">==</span><span class="default"> </span><span class="default">302</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="828" href="#828">828</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// This exception is handled by redirecting to the redirect_uri with error parameters.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="829" href="#829">829</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 830" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="830" href="#830">830</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'error'</span><span class="keyword">]</span><span class="default"> </span><span class="default">??</span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 831" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="831" href="#831">831</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">(string)</span><span class="default"> </span><span class="default">$exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="832" href="#832">832</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="833" href="#833">833</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="834" href="#834">834</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the state parameter was valid, include it in the error redirect.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 835" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="835" href="#835">835</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$exception</span><span class="default">-></span><span class="default">getCode</span><span class="keyword">(</span><span class="keyword">)</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_STATE</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 836" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="836" href="#836">836</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="default">-></span><span class="default">getQueryParams</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="837" href="#837">837</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="838" href="#838">838</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 839" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="839" href="#839">839</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'statusCode'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 840" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="840" href="#840">840</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Location'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">appendQueryParams</span><span class="keyword">(</span><span class="default">(string)</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="default">-></span><span class="default">getQueryParams</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="841" href="#841">841</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="842" href="#842">842</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">else</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="843" href="#843">843</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// This exception should be shown to the user.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 844" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="844" href="#844">844</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">$exception</span><span class="default">-></span><span class="default">getStatusCode</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'text/html'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">renderTemplate</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">exceptionTemplatePath</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 845" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="845" href="#845">845</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'request'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 846" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="846" href="#846">846</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="847" href="#847">847</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="848" href="#848">848</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="849" href="#849">849</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="850" href="#850">850</a></td><td class="col-11 codeLine"><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 620" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="620" href="#620">620</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">info</span><span class="keyword">(</span><span class="default">"Creating an authorization code:"</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'data'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$code</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="621" href="#621">621</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="622" href="#622">622</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Store the authorization code.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 623" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="623" href="#623">623</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$authCode</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">tokenStorage</span><span class="default">-></span><span class="default">createAuthCode</span><span class="keyword">(</span><span class="default">$code</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 624" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="624" href="#624">624</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="625" href="#625">625</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If saving the authorization code failed silently, there isn’t much we can do about it,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="626" href="#626">626</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// but should at least log and return an error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 627" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="627" href="#627">627</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Saving the authorization code failed and returned false without raising an exception."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 628" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="628" href="#628">628</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="629" href="#629">629</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="630" href="#630">630</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="631" href="#631">631</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Return a redirect to the client app.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 632" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="632" href="#632">632</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">302</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 633" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="633" href="#633">633</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Location'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">appendQueryParams</span><span class="keyword">(</span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 634" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="634" href="#634">634</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'code'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 635" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="635" href="#635">635</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'state'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$code</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="636" href="#636">636</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 637" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="637" href="#637">637</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Cache-control'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'no-cache'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="638" href="#638">638</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="639" href="#639">639</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="640" href="#640">640</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="641" href="#641">641</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Otherwise, the user is authenticated and needs to authorize the client app + choose scopes.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="642" href="#642">642</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="643" href="#643">643</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Fetch the client_id URL to find information about the client to present to the user.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="644" href="#644">644</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: in order to comply with https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="645" href="#645">645</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// it may be necessary to do this before returning any other kind of error response, as, per</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="646" href="#646">646</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// the spec, errors should only be shown to the user if the client_id and redirect_uri parameters</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="647" href="#647">647</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// are missing or invalid. Otherwise, they should be sent back to the client with an error</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="648" href="#648">648</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// redirect response.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 649" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="649" href="#649">649</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdResponse</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$clientIdMf2</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="650" href="#650">650</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="651" href="#651">651</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/** @var ResponseInterface $clientIdResponse */</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 652" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="652" href="#652">652</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">list</span><span class="keyword">(</span><span class="default">$clientIdResponse</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">call_user_func</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">httpGetWithEffectiveUrl</span><span class="keyword">,</span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 653" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="653" href="#653">653</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientIdMf2</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">Mf2</span><span class="default">\</span><span class="default">parse</span><span class="keyword">(</span><span class="default">(string)</span><span class="default"> </span><span class="default">$clientIdResponse</span><span class="default">-></span><span class="default">getBody</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientIdEffectiveUrl</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 654" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="654" href="#654">654</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">ClientExceptionInterface</span><span class="default"> </span><span class="keyword">|</span><span class="default"> </span><span class="default">RequestExceptionInterface</span><span class="default"> </span><span class="keyword">|</span><span class="default"> </span><span class="default">NetworkExceptionInterface</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 655" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="655" href="#655">655</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Caught an HTTP exception while trying to fetch the client_id. Returning an error response."</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 656" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="656" href="#656">656</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'client_id'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 657" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="657" href="#657">657</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">__toString</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="658" href="#658">658</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="659" href="#659">659</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="660" href="#660">660</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// At this point in the flow, we’ve already guaranteed that the redirect_uri is valid,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="661" href="#661">661</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// so in theory we should report these errors by redirecting there.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 662" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="662" href="#662">662</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 663" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="663" href="#663">663</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">Exception</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 664" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="664" href="#664">664</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"Caught an unknown exception while trying to fetch the client_id. Returning an error response."</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 665" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="665" href="#665">665</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">__toString</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="666" href="#666">666</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="667" href="#667">667</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 668" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="668" href="#668">668</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR_REDIRECT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="669" href="#669">669</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="670" href="#670">670</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="671" href="#671">671</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="672" href="#672">672</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Search for an h-app with u-url matching the client_id.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 673" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="673" href="#673">673</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientHApps</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">M</span><span class="default">\</span><span class="default">findMicroformatsByProperty</span><span class="keyword">(</span><span class="default">M</span><span class="default">\</span><span class="default">findMicroformatsByType</span><span class="keyword">(</span><span class="default">$clientIdMf2</span><span class="keyword">,</span><span class="default"> </span><span class="default">'h-app'</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="default">'url'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$queryParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 674" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="674" href="#674">674</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$clientHApp</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$clientHApps</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">?</span><span class="default"> </span><span class="default">null</span><span class="default"> </span><span class="keyword">:</span><span class="default"> </span><span class="default">$clientHApps</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="675" href="#675">675</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="676" href="#676">676</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Present the authorization UI.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 677" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="677" href="#677">677</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">authorizationForm</span><span class="default">-></span><span class="default">showForm</span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$authenticationResult</span><span class="keyword">,</span><span class="default"> </span><span class="default">$authenticationRedirect</span><span class="keyword">,</span><span class="default"> </span><span class="default">$clientHApp</span><span class="keyword">)</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 678" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="678" href="#678">678</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">-></span><span class="default">withAddedHeader</span><span class="keyword">(</span><span class="default">'Cache-control'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'no-cache'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="679" href="#679">679</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="680" href="#680">680</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="681" href="#681">681</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="682" href="#682">682</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the request isn’t an IndieAuth Authorization or Code-redeeming request, it’s either an invalid</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="683" href="#683">683</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// request or something to do with a custom auth handler (e.g. sending a one-time code in an email.)</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 684" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="684" href="#684">684</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$nonIndieAuthRequestResult</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">call_user_func</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">handleNonIndieAuthRequest</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 685" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="685" href="#685">685</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$nonIndieAuthRequestResult</span><span class="default"> </span><span class="keyword">instanceof</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 686" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="686" href="#686">686</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$nonIndieAuthRequestResult</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="687" href="#687">687</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">else</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="688" href="#688">688</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// In this code path we have not validated the redirect_uri, so show a regular error page</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="689" href="#689">689</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// rather than returning a redirect error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 690" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="690" href="#690">690</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INTERNAL_ERROR</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="691" href="#691">691</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 692" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="692" href="#692">692</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="693" href="#693">693</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// All IndieAuthExceptions will already have been logged.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 694" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="694" href="#694">694</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">handleException</span><span class="keyword">(</span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 695" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="695" href="#695">695</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">Exception</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="696" href="#696">696</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Unknown exceptions will not have been logged; do so now.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 697" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="697" href="#697">697</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="string">"</span><span class="string">Caught unknown exception: </span><span class="string">{</span><span class="string">$e</span><span class="keyword">}</span><span class="string">"</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 698" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="698" href="#698">698</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">handleException</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">0</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="699" href="#699">699</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="22 tests cover line 700" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="700" href="#700">700</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span><span class="default"> </span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="701" href="#701">701</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="702" href="#702">702</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="703" href="#703">703</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/**</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="704" href="#704">704</a></td><td class="col-11 codeLine"><span class="comment"> * Handle Token Endpoint Request</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="705" href="#705">705</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="706" href="#706">706</a></td><td class="col-11 codeLine"><span class="comment"> * Handles requests to the IndieAuth token endpoint. The logical flow can be summarised as follows:</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="707" href="#707">707</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="708" href="#708">708</a></td><td class="col-11 codeLine"><span class="comment"> * * Check that the request is a code redeeming request. Return an error if not.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="709" href="#709">709</a></td><td class="col-11 codeLine"><span class="comment"> * * Ensure that all required parameters are present. Return an error if not.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="710" href="#710">710</a></td><td class="col-11 codeLine"><span class="comment"> * * Attempt to exchange the `code` parameter for an access token. Return an error if it fails.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="711" href="#711">711</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the client_id and redirect_uri request parameters match those stored in the auth code. If not, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="712" href="#712">712</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the provided code_verifier hashes to the code_challenge stored in the auth code. If not, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="713" href="#713">713</a></td><td class="col-11 codeLine"><span class="comment"> * * Make sure the granted scope stored in the auth code is not empty. If it is, revoke the access token and return an error.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="714" href="#714">714</a></td><td class="col-11 codeLine"><span class="comment"> * * Otherwise, return a success response containing information about the issued access token.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="715" href="#715">715</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="716" href="#716">716</a></td><td class="col-11 codeLine"><span class="comment"> * This method must NOT be CSRF-protected as it accepts external requests from client apps.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="717" href="#717">717</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="718" href="#718">718</a></td><td class="col-11 codeLine"><span class="comment"> * @param ServerRequestInterface $request</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="719" href="#719">719</a></td><td class="col-11 codeLine"><span class="comment"> * @return ResponseInterface</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="720" href="#720">720</a></td><td class="col-11 codeLine"><span class="comment"> */</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="721" href="#721">721</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">public</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">handleTokenEndpointRequest</span><span class="keyword">(</span><span class="default">ServerRequestInterface</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">:</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="8 tests cover line 722" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="722" href="#722">722</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">isIndieAuthAuthorizationCodeRedeemingRequest</span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 723" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="723" href="#723">723</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">info</span><span class="keyword">(</span><span class="default">'Handling a request to redeem an authorization code for an access token.'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="724" href="#724">724</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 725" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="725" href="#725">725</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$bodyParams</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$request</span><span class="default">-></span><span class="default">getParsedBody</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="726" href="#726">726</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="7 tests cover line 727" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="727" href="#727">727</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">isset</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 728" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="728" href="#728">728</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">warning</span><span class="keyword">(</span><span class="default">'The exchange request was missing the code parameter. Returning an error response.'</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 729" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="729" href="#729">729</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 730" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfCodeParameterIsMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="730" href="#730">730</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="731" href="#731">731</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'The code parameter was missing.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="732" href="#732">732</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="733" href="#733">733</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="734" href="#734">734</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="735" href="#735">735</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Attempt to internally exchange the provided auth code for an access token.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="736" href="#736">736</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// We do this before anything else so that the auth code is invalidated as soon as the request starts,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="737" href="#737">737</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// and the resulting access token is revoked if we encounter an error. This ends up providing a simpler</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="738" href="#738">738</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// and more flexible interface for TokenStorage implementors.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="739" href="#739">739</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">try</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="740" href="#740">740</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Call the token exchange method, passing in a callback which performs additional validation</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="741" href="#741">741</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// on the auth code before it gets exchanged.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 742" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="742" href="#742">742</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$tokenData</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">tokenStorage</span><span class="default">-></span><span class="default">exchangeAuthCodeForAccessToken</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">array</span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">use</span><span class="default"> </span><span class="keyword">(</span><span class="default">$request</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="743" href="#743">743</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Verify that all required parameters are included.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 744" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="744" href="#744">744</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$requiredParameters</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">requirePkce</span><span class="default"> </span><span class="default">or</span><span class="default"> </span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">?</span><span class="default"> </span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'redirect_uri'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="default"> </span><span class="keyword">:</span><span class="default"> </span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 745" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="745" href="#745">745</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$missingRequiredParameters</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">array_filter</span><span class="keyword">(</span><span class="default">$requiredParameters</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="default">$p</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">use</span><span class="default"> </span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 746" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="746" href="#746">746</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">!</span><span class="default">array_key_exists</span><span class="keyword">(</span><span class="default">$p</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">$p</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 747" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="747" href="#747">747</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 748" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="748" href="#748">748</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$missingRequiredParameters</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 749" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="749" href="#749">749</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">warning</span><span class="keyword">(</span><span class="default">'The exchange request was missing required parameters. Returning an error response.'</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'missing'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$missingRequiredParameters</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 750" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="750" href="#750">750</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_REQUEST</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="751" href="#751">751</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="752" href="#752">752</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="753" href="#753">753</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Verify that it was issued for the same client_id and redirect_uri</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 754" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="754" href="#754">754</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'client_id'</span><span class="keyword">]</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 755" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="755" href="#755">755</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">||</span><span class="default"> </span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 756" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="756" href="#756">756</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"The provided client_id and/or redirect_uri did not match those stored in the token."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 757" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="757" href="#757">757</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="758" href="#758">758</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="759" href="#759">759</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="760" href="#760">760</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the auth code was requested with no code_challenge, but the exchange request provides a </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="761" href="#761">761</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// code_verifier, return an error.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="5 tests cover line 762" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="762" href="#762">762</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="keyword">)</span><span class="default"> </span><span class="default">&&</span><span class="default"> </span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 763" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="763" href="#763">763</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"A code_verifier was provided when trying to exchange an auth code requested without a code_challenge."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 764" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="764" href="#764">764</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="765" href="#765">765</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="766" href="#766">766</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 767" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="767" href="#767">767</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">requirePkce</span><span class="default"> </span><span class="default">or</span><span class="default"> </span><span class="keyword">!</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="768" href="#768">768</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Check that the supplied code_verifier hashes to the stored code_challenge</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="769" href="#769">769</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: support method = plain as well as S256.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 770" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="770" href="#770">770</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">!</span><span class="default">hash_equals</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">generatePKCECodeChallenge</span><span class="keyword">(</span><span class="default">$bodyParams</span><span class="keyword">[</span><span class="default">'code_verifier'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 771" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="771" href="#771">771</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"The provided code_verifier did not hash to the stored code_challenge"</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 772" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="772" href="#772">772</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="773" href="#773">773</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="774" href="#774">774</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="775" href="#775">775</a></td><td class="col-11 codeLine"><span class="default"> </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="776" href="#776">776</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Check that scope is not empty.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 777" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="777" href="#777">777</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="keyword">empty</span><span class="keyword">(</span><span class="default">$authCode</span><span class="keyword">[</span><span class="default">'scope'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 778" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="778" href="#778">778</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">"An exchange request for a token with an empty scope was sent to the token endpoint."</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 779" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="779" href="#779">779</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">throw</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">create</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_GRANT</span><span class="keyword">,</span><span class="default"> </span><span class="default">$request</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="780" href="#780">780</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 781" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="781" href="#781">781</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 782" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="782" href="#782">782</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">catch</span><span class="default"> </span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$e</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="783" href="#783">783</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If an exception was thrown, return a corresponding error response.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 784" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="784" href="#784">784</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 785" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="785" href="#785">785</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">getInfo</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'error'</span><span class="keyword">]</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="4 tests cover line 786" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="786" href="#786">786</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$e</span><span class="default">-></span><span class="default">getMessage</span><span class="keyword">(</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="787" href="#787">787</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="788" href="#788">788</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="789" href="#789">789</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="3 tests cover line 790" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="790" href="#790">790</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$tokenData</span><span class="keyword">)</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 791" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="791" href="#791">791</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$this</span><span class="default">-></span><span class="default">logger</span><span class="default">-></span><span class="default">error</span><span class="keyword">(</span><span class="default">'Attempting to exchange an auth code for a token resulted in null.'</span><span class="keyword">,</span><span class="default"> </span><span class="default">$bodyParams</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 792" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="792" href="#792">792</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 793" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="793" href="#793">793</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_grant'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="794" href="#794">794</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'The provided credentials were not valid.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="795" href="#795">795</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="796" href="#796">796</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="797" href="#797">797</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="798" href="#798">798</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// TODO: return an error if the token doesn’t contain a me key.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="799" href="#799">799</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="800" href="#800">800</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If everything checked out, return {"me": "https://example.com"} response</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 801" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="801" href="#801">801</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">200</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 802" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="802" href="#802">802</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="803" href="#803">803</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'cache-control'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'no-store'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 804" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="804" href="#804">804</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="default">array_merge</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="805" href="#805">805</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// Ensure that the token_type key is present, if tokenStorage doesn’t include it.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 806" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="806" href="#806">806</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'token_type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'Bearer'</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 807" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="807" href="#807">807</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">array_filter</span><span class="keyword">(</span><span class="default">$tokenData</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="keyword">(</span><span class="default">string</span><span class="default"> </span><span class="default">$k</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="808" href="#808">808</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// We should be able to trust the return data from tokenStorage, but there’s no harm in</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="809" href="#809">809</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// preventing code_challenges from leaking, per OAuth2.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 810" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="810" href="#810">810</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">!</span><span class="default">in_array</span><span class="keyword">(</span><span class="default">$k</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'code_challenge'</span><span class="keyword">,</span><span class="default"> </span><span class="default">'code_challenge_method'</span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="2 tests cover line 811" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlows</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="811" href="#811">811</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="keyword">,</span><span class="default"> </span><span class="default">ARRAY_FILTER_USE_KEY</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="812" href="#812">812</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="813" href="#813">813</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 814" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="814" href="#814">814</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">400</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'application/json'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">json_encode</span><span class="keyword">(</span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="1 test covers line 815" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="815" href="#815">815</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="816" href="#816">816</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'Request to token endpoint was not a valid code exchange request.'</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="817" href="#817">817</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="818" href="#818">818</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="819" href="#819">819</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="820" href="#820">820</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">/**</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="821" href="#821">821</a></td><td class="col-11 codeLine"><span class="comment"> * Handle Exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="822" href="#822">822</a></td><td class="col-11 codeLine"><span class="comment"> * </span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="823" href="#823">823</a></td><td class="col-11 codeLine"><span class="comment"> * Turns an instance of `IndieAuthException` into an appropriate instance of `ResponseInterface`.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="824" href="#824">824</a></td><td class="col-11 codeLine"><span class="comment"> */</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="825" href="#825">825</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">protected</span><span class="default"> </span><span class="keyword">function</span><span class="default"> </span><span class="default">handleException</span><span class="keyword">(</span><span class="default">IndieAuthException</span><span class="default"> </span><span class="default">$exception</span><span class="keyword">)</span><span class="keyword">:</span><span class="default"> </span><span class="default">ResponseInterface</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 826" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="826" href="#826">826</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$exceptionData</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getInfo</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="827" href="#827">827</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="14 tests cover line 828" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="828" href="#828">828</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'statusCode'</span><span class="keyword">]</span><span class="default"> </span><span class="default">==</span><span class="default"> </span><span class="default">302</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="829" href="#829">829</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// This exception is handled by redirecting to the redirect_uri with error parameters.</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="830" href="#830">830</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 831" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="831" href="#831">831</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'error'</span><span class="keyword">]</span><span class="default"> </span><span class="default">??</span><span class="default"> </span><span class="default">'invalid_request'</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 832" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="832" href="#832">832</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'error_description'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">(string)</span><span class="default"> </span><span class="default">$exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="833" href="#833">833</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="834" href="#834">834</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="835" href="#835">835</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// If the state parameter was valid, include it in the error redirect.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 836" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="836" href="#836">836</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">if</span><span class="default"> </span><span class="keyword">(</span><span class="default">$exception</span><span class="default">-></span><span class="default">getCode</span><span class="keyword">(</span><span class="keyword">)</span><span class="default"> </span><span class="default">!==</span><span class="default"> </span><span class="default">IndieAuthException</span><span class="default">::</span><span class="default">INVALID_STATE</span><span class="keyword">)</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 837" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="837" href="#837">837</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span><span class="default"> </span><span class="keyword">=</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="default">-></span><span class="default">getQueryParams</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'state'</span><span class="keyword">]</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="838" href="#838">838</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="839" href="#839">839</a></td><td class="col-11 codeLine"></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 840" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="840" href="#840">840</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">$exceptionData</span><span class="keyword">[</span><span class="default">'statusCode'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="9 tests cover line 841" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testRequestsMissingBothPkceParametersReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatNonPkceRequestMustLackBothPkceParameters</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="841" href="#841">841</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'Location'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">appendQueryParams</span><span class="keyword">(</span><span class="default">(string)</span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="default">-></span><span class="default">getQueryParams</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">[</span><span class="default">'redirect_uri'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">$redirectQueryParams</span><span class="keyword">)</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="842" href="#842">842</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="843" href="#843">843</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span><span class="default"> </span><span class="keyword">else</span><span class="default"> </span><span class="keyword">{</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="844" href="#844">844</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="comment">// This exception should be shown to the user.</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 845" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="845" href="#845">845</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">return</span><span class="default"> </span><span class="keyword">new</span><span class="default"> </span><span class="default">Response</span><span class="keyword">(</span><span class="default">$exception</span><span class="default">-></span><span class="default">getStatusCode</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span><span class="default">'content-type'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">'text/html'</span><span class="keyword">]</span><span class="keyword">,</span><span class="default"> </span><span class="default">renderTemplate</span><span class="keyword">(</span><span class="default">$this</span><span class="default">-></span><span class="default">exceptionTemplatePath</span><span class="keyword">,</span><span class="default"> </span><span class="keyword">[</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 846" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="846" href="#846">846</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'request'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exception</span><span class="default">-></span><span class="default">getRequest</span><span class="keyword">(</span><span class="keyword">)</span><span class="keyword">,</span></td></tr>
|
||||
<tr class="covered-by-large-tests popin d-flex"><td data-title="6 tests cover line 847" data-content="<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationEndpointReturnsErrorOnMissingParameter</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement="top" data-html="true" class="col-1 text-right"><a id="847" href="#847">847</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="default">'exception'</span><span class="default"> </span><span class="default">=></span><span class="default"> </span><span class="default">$exception</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="848" href="#848">848</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">]</span><span class="keyword">)</span><span class="keyword">)</span><span class="keyword">;</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="849" href="#849">849</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class="warning d-flex"><td class="col-1 text-right"><a id="850" href="#850">850</a></td><td class="col-11 codeLine"><span class="default"> </span><span class="keyword">}</span></td></tr>
|
||||
<tr class=" d-flex"><td class="col-1 text-right"><a id="851" href="#851">851</a></td><td class="col-11 codeLine"><span class="keyword">}</span></td></tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -1070,7 +1071,7 @@
|
||||
<h4>Legend</h4>
|
||||
<p><span class="success"><strong>Executed</strong></span><span class="danger"><strong>Not Executed</strong></span><span class="warning"><strong>Dead Code</strong></span></p>
|
||||
<p>
|
||||
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 9.2.6</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.19</a> with <a href="https://xdebug.org/">Xdebug 3.0.4</a> and <a href="https://phpunit.de/">PHPUnit 9.5.5</a> at Fri Jun 18 14:09:49 UTC 2021.</small>
|
||||
<small>Generated by <a href="https://github.com/sebastianbergmann/php-code-coverage" target="_top">php-code-coverage 9.2.6</a> using <a href="https://secure.php.net/" target="_top">PHP 7.4.19</a> with <a href="https://xdebug.org/">Xdebug 3.0.4</a> and <a href="https://phpunit.de/">PHPUnit 9.5.5</a> at Fri Jun 18 14:43:22 UTC 2021.</small>
|
||||
</p>
|
||||
<a title="Back to the top" id="toplink" href="#">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M12 11L6 5l-6 6h12z"/></svg>
|
||||
|
Reference in New Issue
Block a user