@@ -52,23 +52,23 @@
< / 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 big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "46.15" aria-valuemin = "0" aria-valuemax = "100" style = "width: 46.15%" >
< span class = "sr-only" > 46.15% covered (danger)< / span >
< / div >
< / div >
< / td >
< td class = "danger small" > < div align = "right" > 46.15%< / div > < / td >
< td class = "danger small" > < div align = "right" > 6 / 13< / div > < / td >
< td class = "danger small" > < abbr title = "Change Risk Anti-Patterns (CRAP) Index" > CRAP< / abbr > < / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "53 .85 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 53 .85 %" >
< span class = "sr-only" > 53 .85 % covered (warning)< / span >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "84 .87 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 84 .87 %" >
< span class = "sr-only" > 84 .87 % covered (warning)< / span >
< / div >
< / div >
< / td >
< td class = "warning small" > < div align = "right" > 53 .85 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 7 / 13 < / 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 = "92.31" aria-valuemin = "0" aria-valuemax = "100" style = "width: 92.31%" >
< span class = "sr-only" > 92.31% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 92.31%< / div > < / td >
< td class = "success small" > < div align = "right" > 96 / 104< / div > < / td >
< td class = "warning small" > < div align = "right" > 84 .87 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 101 / 119 < / div > < / td >
< / tr >
< tr >
@@ -81,23 +81,23 @@
< / 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 big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "46.15" aria-valuemin = "0" aria-valuemax = "100" style = "width: 46.15%" >
< span class = "sr-only" > 46.15% covered (danger)< / span >
< / div >
< / div >
< / td >
< td class = "danger small" > < div align = "right" > 46.15%< / div > < / td >
< td class = "danger small" > < div align = "right" > 6 / 13< / div > < / td >
< td class = "danger small" > 53.32< / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "53 .85 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 53 .85 %" >
< span class = "sr-only" > 53 .85 % covered (warning)< / span >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "84 .87 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 84 .87 %" >
< span class = "sr-only" > 84 .87 % covered (warning)< / span >
< / div >
< / div >
< / td >
< td class = "warning small" > < div align = "right" > 53 .85 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 7 / 13 < / div > < / td >
< td class = "warning small" > 46.96< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "92.31" aria-valuemin = "0" aria-valuemax = "100" style = "width: 92.31%" >
< span class = "sr-only" > 92.31% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 92.31%< / div > < / td >
< td class = "success small" > < div align = "right" > 96 / 104< / div > < / td >
< td class = "warning small" > < div align = "right" > 84 .87 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 101 / 119 < / div > < / td >
< / tr >
< tr >
@@ -152,19 +152,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" > 3.03 < / td >
< td class = "danger small" > 3.02 < / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "85.71 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 85.71 %" >
< span class = "sr-only" > 85.71 % covered (warning)< / span >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "87.50 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 87.50 %" >
< span class = "sr-only" > 87.50 % covered (warning)< / span >
< / div >
< / div >
< / td >
< td class = "warning small" > < div align = "right" > 85.71 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 6 / 7 < / div > < / td >
< td class = "warning small" > < div align = "right" > 87.50 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 7 / 8 < / div > < / td >
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#82 " > < abbr title = "exchangeAuthCodeForAccessToken(string $code, callable $validateAuthCode): ?array" > exchangeAuthCodeForAccessToken< / abbr > < / a > < / td >
< td class = "danger" colspan = "4" > < a href = "#86 " > < abbr title = "exchangeAuthCodeForAccessToken(string $code, callable $validateAuthCode): ?array" > exchangeAuthCodeForAccessToken< / abbr > < / a > < / td >
< td class = "danger big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 0.00%" >
< span class = "sr-only" > 0.00% covered (danger)< / span >
@@ -173,40 +173,40 @@
< / 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" > 11.0 4< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success " role = "progressbar" aria-valuenow = "92.86 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 92.86 %" >
< span class = "sr-only" > 92.86 % covered (success )< / span >
< td class = "danger small" > 12.4 4< / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning " role = "progressbar" aria-valuenow = "77.14 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 77.14 %" >
< span class = "sr-only" > 77.14 % covered (warning )< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 92.86 %< / div > < / td >
< td class = "success small" > < div align = "right" > 26 / 28 < / div > < / td >
< td class = "warning small" > < div align = "right" > 77.14 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 27 / 35 < / div > < / td >
< / tr >
< tr >
< td class = "success " colspan = "4" > < a href = "#147 " > < abbr title = "getAccessToken(string $token): ?array" > getAccessToken< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success " role = "progressbar" aria-valuenow = "10 0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 10 0.00%" >
< span class = "sr-only" > 10 0.00% covered (success )< / span >
< td class = "danger " colspan = "4" > < a href = "#161 " > < abbr title = "getAccessToken(string $token): ?array" > getAccessToken< / abbr > < / a > < / td >
< td class = "danger big" > < div class = "progress" >
< div class = "progress-bar bg-danger " role = "progressbar" aria-valuenow = "0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 0.00%" >
< span class = "sr-only" > 0.00% covered (danger )< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 10 0.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 5 < / 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 >
< 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" > 6.20 < / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning " role = "progressbar" aria-valuenow = "63.64 " aria-valuemin = "0" aria-valuemax = "100" style = "width: 63.64 %" >
< span class = "sr-only" > 63.64 % covered (warning )< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00 %< / div > < / td >
< td class = "success small" > < div align = "right" > 5 / 5 < / div > < / td >
< td class = "warning small" > < div align = "right" > 63.64 %< / div > < / td >
< td class = "warning small" > < div align = "right" > 7 / 11 < / div > < / td >
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#163 " > < abbr title = "revokeAccessToken(string $token): bool" > revokeAccessToken< / abbr > < / a > < / td >
< td class = "success" colspan = "4" > < a href = "#18 6" > < abbr title = "revokeAccessToken(string $token): bool" > revokeAccessToken< / 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 >
@@ -223,11 +223,11 @@
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1 < / div > < / td >
< td class = "success small" > < div align = "right" > 2 / 2 < / div > < / td >
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#16 9" > < abbr title = "deleteExpiredTokens(): int" > deleteExpiredTokens< / abbr > < / a > < / td >
< td class = "success" colspan = "4" > < a href = "#193 " > < abbr title = "deleteExpiredTokens(): int" > deleteExpiredTokens< / 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 >
@@ -248,7 +248,7 @@
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#197 " > < abbr title = "get(string $key): ?array" > get< / abbr > < / a > < / td >
< td class = "danger" colspan = "4" > < a href = "#221 " > < abbr title = "get(string $key): ?array" > get< / abbr > < / a > < / td >
< td class = "danger big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 0.00%" >
< span class = "sr-only" > 0.00% covered (danger)< / span >
@@ -269,7 +269,7 @@
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#219 " > < abbr title = "put(string $key, array $data): bool" > put< / abbr > < / a > < / td >
< td class = "success" colspan = "4" > < a href = "#243 " > < abbr title = "put(string $key, array $data): bool" > put< / 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 >
@@ -290,7 +290,7 @@
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#228 " > < abbr title = "delete(string $key, $observeLock): bool" > delete< / abbr > < / a > < / td >
< td class = "danger" colspan = "4" > < a href = "#25 2" > < abbr title = "delete(string $key, $observeLock): bool" > delete< / abbr > < / a > < / td >
< td class = "danger big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 0.00%" >
< span class = "sr-only" > 0.00% covered (danger)< / span >
@@ -311,7 +311,7 @@
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#242 " > < abbr title = "getPath(string $key): string" > getPath< / abbr > < / a > < / td >
< td class = "success" colspan = "4" > < a href = "#266 " > < abbr title = "getPath(string $key): string" > getPath< / 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 >
@@ -332,7 +332,7 @@
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#24 7" > < abbr title = "withLock(string $path, string $mode, callable $callback)" > withLock< / abbr > < / a > < / td >
< td class = "danger" colspan = "4" > < a href = "#271 " > < abbr title = "withLock(string $path, string $mode, callable $callback)" > withLock< / abbr > < / a > < / td >
< td class = "danger big" > < div class = "progress" >
< div class = "progress-bar bg-danger" role = "progressbar" aria-valuenow = "0.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 0.00%" >
< span class = "sr-only" > 0.00% covered (danger)< / span >
@@ -353,7 +353,7 @@
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#271 " > < abbr title = "hash(string $token): string" > hash< / abbr > < / a > < / td >
< td class = "success" colspan = "4" > < a href = "#295 " > < abbr title = "hash(string $token): string" > hash< / 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 >
@@ -447,212 +447,236 @@
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "66" href = "#66" > 66< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TokenStorageInterface Methods.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "67" href = "#67" > 67< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "68" href = "#68" > 68< / 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" > createAuthCode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "default" > string< / 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 69" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "69" href = "#69" > 69< / 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" > generateRandomString < / span > < span class = "keyword" > (< / span > < span class = "default" > self < / span > < span class = "default" > :: < / span > < span class = "default" > TOKEN_LENGTH < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 70" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "70" href = "#70" > 70< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $accessToken < / 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" > hash < / span > < span class = "keyword " > ( < / span > < span class = "default" > $authCode < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "71" href = "#71" > 71< / 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 72" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "72" href = "#72" > 72< / 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" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $data< / 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 73" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "73" href = "#73" > 73< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / 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" > authCodeTtl< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "74" href = "#74" > 74< / 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 = "75" href = "#75" > 75< / 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 = "9 tests cover line 76" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "76" href = "#76" > 76< / 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" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > put < / span > < span class = "keyword" > (< / span > < span class = "default" > $accessToken < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "77" href = "#77" > 77< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > nul l< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 69" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "69" href = "#69" > 69< / 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 authorization code." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $data < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 70" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "70" href = "#70" > 70< / 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" > generateRandomString < / span > < span class = "keyword" > ( < / span > < span class = "default" > self < / span > < span class = "default " > :: < / span > < span class = "default" > TOKEN_LENGTH < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 71" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "71" href = "#71" > 71< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $accessToken< / 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" > hash< / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "72" href = "#72" > 72< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "73" href = "#73" > 73< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // TODO: valid_until should be expire_after(? — look up), and should not be set here, < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "74" href = "#74" > 74< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // as it applies only to access tokens, not auth codes! Auth code TTL should always be < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "75" href = "#75" > 75< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // the default.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 76" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "76" href = "#76" > 76< / 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" > array_key_exists < / span > < span class = "keyword" > (< / span > < span class = "default" > 'valid_until' < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $data< / 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 77" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "77" href = "#77" > 77< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / 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" > authCodeTt l< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "78" href = "#78" > 78< / 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 = "9 tests cover line 79" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "79" href = "#79" > 79< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "80" href = "#80" > 80< / 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 = "81" href = "#81" > 81< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "82" href = "#82" > 82< / 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" > exchangeAuthCodeForAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > callable< / span > < span class = "default" > < / span > < span class = "default" > $validateAuthCode< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "83" href = "#83" > 83< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Hash the auth code to get the theoretical matching access token filename. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "8 tests cover line 84" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "84" href = "#84" > 84< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $accessToken< / 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" > hash< / span > < span class = "keyword" > (< / 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 = "79" href = "#79" > 79< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "9 tests cover line 80" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "80" href = "#80" > 80< / 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" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > put< / span > < span class = "keyword" > (< / span > < span class = "default" > $accessToken< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "81" href = "#81" > 81< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "82" href = "#82" > 82< / 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 = "9 tests cover line 83" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "83" href = "#83" > 83< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "84" href = "#84" > 84< / 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 = "85" href = "#85" > 85< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "86" href = "#86" > 86< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t"> // Prevent the token file from being read, modified or deleted while we’ re working with it. < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "87" href = "#87" > 87< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // r+ to allow reading and writing, but to make sure we don’ t create the file if it doesn’ t < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "88" href = "#88" > 88< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // already exist. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 89" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "89" href = "#89" > 89< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $accessToken< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r+'< / 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" > $fp< / 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" > $accessToken< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $validateAuthCode< / 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 = "90" href = "#90" > 90< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Read the file contents .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 91" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "91" href = "#91" > 91< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $fileContents< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / 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 92" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "92" href = "#92" > 92< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $d< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > fread< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 1024< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "default" > .=< / span > < span class = "default" > < / span > < span class = "default" > $d< / 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 = "93" href = "#93" > 93< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 94" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "94" href = "#94" > 94< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "defaul t" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > json_decode< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileContents< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "95" href = "#95" > 95< / 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 = "8 tests cover line 96" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "96" href = "#96" > 96< / 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" > is_array < / span > < span class = "keyword" > (< / span > < span class = "default" > $data < / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > null < / 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 = "86" href = "#86" > 86< / 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 = "defaul t"> < / span > < span class = "default" > exchangeAuthCodeForAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > callable< / span > < span class = "default" > < / span > < span class = "default" > $validateAuthCode< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "87" href = "#87" > 87< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Hash the auth code to get the theoretical matching access token filename. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 88" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "88" href = "#88" > 88< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $accessToken< / span > < span class = "defaul t" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > hash< / span > < span class = "keyword" > (< / 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 = "89" href = "#89" > 89< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "90" href = "#90" > 90< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Prevent the token file from being read, modified or deleted while we’ re working with it .< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "91" href = "#91" > 91< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // r+ to allow reading and writing, but to make sure we don’ t create the file if it doesn’ t < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "92" href = "#92" > 92< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // already exist. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 93" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "93" href = "#93" > 93< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $accessToken< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r+'< / 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" > $fp< / 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" > $accessToken< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $validateAuthCode< / 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 = "94" href = "#94" > 94< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Read the file contents. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 95" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "95" href = "#95" > 95< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / 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 96" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "96" href = "#96" > 96< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while < / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $d< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > fread< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 1024 < / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $fileContents < / span > < span class = "default" > < / span > < span class = "default" > .=< / span > < span class = "default" > < / span > < span class = "default" > $d < / 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 = "97" href = "#97" > 97< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "98" href = "#98" > 98< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Make sure the auth code hasn’ t already been redeemed. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 99" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "99" href = "#99" > 99< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'exchanged_at'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "100" href = "#100" > 100< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "101" href = "#101" > 101< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Mak e sure th e auth code isn’ t expired. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 102" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "102" href = "#102" > 102< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > 0< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > time< / 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" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "103" href = "#103" > 103< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "104" href = "#104" > 104< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // The auth code is valid as far as we know, pass it to the validation callback passed from the< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "105" href = "#105" > 105< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Server .< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "106" href = "#106" > 106< / 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 = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 107" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "107" href = "#107" > 107< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $validateAuthCode< / span > < span class = "keyword" > (< / span > < span class = "default" > $data < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 108" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "108" href = "#108" > 108< / 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 = "109" href = "#109" > 109< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If there was an issue with the auth code, delete it before bubbling the exception < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "110" href = "#110" > 110< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // up to the Server for handling. We currently have a lock on the file path, so pass< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "111" href = "#111" > 111< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // fals e to $observeLock to prevent a deadlock .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 112" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "112" href = "#112" > 112< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this < / span > < span class = "default" > - > ; < / span > < span class = "default" > delete < / span > < span class = "keyword" > ( < / span > < span class = "default" > $accessToken < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > false < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 113" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "113" href = "#113" > 113< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw < / span > < span class = "default" > < / span > < span class = "default" > $e < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "114" href = "#114" > 114< / 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 = "115" href = "#115" > 115< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "116" href = "#116" > 116< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the access token is valid, mark it as redeemed and set a new expiry time.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 117" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "117" href = "#117" > 117< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'exchanged_at'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > time< / 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 = "118" href = "#118" > 118< / 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 119" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "119" href = "#119" > 119< / 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_int< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > '_access_token_ttl'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "120" href = "#120" > 120< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // This access token has a custom TTL, use that. < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "121" href = "#121" > 121< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > + < / span > < span class = "default" > < / span > < span class = "default" > $data < / span > < span class = "keyword" > [ < / span > < span class = "default" > '_access_code_ttl'< / 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 122" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "122" href = "#122" > 122< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > elseif< / span > < span class = "defaul t"> < / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > accessTokenTtl< / span > < span class = "default" > < / span > < span class = "default" > ==< / span > < span class = "default" > < / span > < span class = "default" > 0< / 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 = "123" href = "#123" > 123< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // The token should be valid unt il explicitly revoked. < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "124" href = "#124" > 124< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "125" href = "#125" > 125< / 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 = "126" href = "#126" > 126< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Use the default TTL. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 127" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointToken ExchangeReturnsCorrectResponseForValidRequest </li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequ est </li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatRequests WithoutPkceWorkCorrectlyWith BothExchangeFlow s</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "127" href = "#127" > 127< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / 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" > accessTokenTtl < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 98" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "98" href = "#98" > 98< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $data< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > json_decode< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileContents< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "99" href = "#99" > 99< / 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 = "8 tests cover line 100" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "100" href = "#100" > 100< / 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" > is_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "101" href = "#101" > 101< / 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" > 'Authoriazation Cod e data could not b e parsed as a JSON object.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "102" href = "#102" > 102< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < span class = "default" > < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "103" href = "#103" > 103< / 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 = "104" href = "#104" > 104< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "105" href = "#105" > 105< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Make sure the auth code hasn’ t already been redeemed .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 106" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "106" href = "#106" > 106< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'exchanged_at'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "107" href = "#107" > 107< / 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" > " This authorization code has already been exchanged." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "108" href = "#108" > 108< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "109" href = "#109" > 109< / 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 = "110" href = "#110" > 110< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "111" href = "#111" > 111< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Mak e sure the auth code isn’ t expired .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 112" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "112" href = "#112" > 112< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ] < / span > < span class = "default" >   ; < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > 0 < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > time< / 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 = "danger d-flex" > < td class = "col-1 text-right" > < a id = "113" href = "#113" > 113< / 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" > " This authorization code has expired." < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "114" href = "#114" > 114< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "115" href = "#115" > 115< / 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 = "116" href = "#116" > 116< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "117" href = "#117" > 117< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // The auth code is valid as far as we know, pass it to the validation callback passed from the < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "118" href = "#118" > 118< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Server.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "119" href = "#119" > 119< / 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 = "covered-by-large-tests popin d-flex" > < td data-title = "8 tests cover line 120" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "120" href = "#120" > 120< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > $validateAuthCode< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 121" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "121" href = "#121" > 121< / 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 = "122" href = "#122" > 122< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t"> // If there was an issue with the auth code, delete it before bubbling the exception < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "123" href = "#123" > 123< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // up to the Server for handling. We currently have a lock on the f ile path, so pass < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "124" href = "#124" > 124< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // false to $observeLock to prevent a deadlock. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 125" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "125" href = "#125" > 125< / 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" > " Deleting authorization code, as it failed the Server-level validation." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 126" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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 = "126" href = "#126" > 126< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > delete< / span > < span class = "keyword" > (< / span > < span class = "default" > $accessToken< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 127" 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::test ExchangeFlows ReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope </li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScop es</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testBackCompatAuthCode WithoutPkceCannotBeExchangedWithCodeVerifier BothExchangeEndpoint s</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "127" href = "#127" > 127< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > $e < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "128" href = "#128" > 128< / 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 = "129" href = "#129" > 129< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "130" href = "#130" > 130< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Write the new file contents, truncating afterwards in c ase the new data is shorter than the old data .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 131" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "131" href = "#131" > 131< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $jsonData < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > json_encode < / span > < span class = "keyword" > ( < / span > < span class = "default" > $data < / 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 132" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "132" href = "#132" > 132< / 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" > rewind< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "3 tests cover line 133" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "133" href = "#133" > 133< / 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" > fwrite < / span > < span class = "keyword" > (< / span > < span class = "default" > $fp < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > $jsonData< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > === < / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null < / 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 = "3 tests cover line 134" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "134" href = "#134" > 134< / 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" > ftruncate< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > strlen< / span > < span class = "keyword" > (< / span > < span class = "default" > $jsonData< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "135" href = "#135" > 135< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "136" href = "#136" > 136< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Return the OAuth2-compatible access token data to the Server for passing onto < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "137" href = "#137" > 137< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // t he cli ent app. Passed vi a array_filter to remove the scope key if scope is null .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 138" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "138" href = "#138" > 138< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > array_filter < / 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 139" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "139" href = "#139" > 139< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'access_token' < / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $accessToken< / span > < span class = "keyword" > , < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 140" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "140" href = "#140" > 140< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'scope'< / span > < span class = "defaul t" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 141" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "141" href = "#141" > 141< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'me'< / span > < span class = "default" > < / span > < span class = "default" > = > < / span > < span class = "default" > < / span > < span class = "default" > $data < / span > < span class = "keyword" > [ < / span > < span class = "default" > 'me' < / 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 142" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "142" href = "#142" > 142< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'profile'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'profile'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "143" href = "#143" > 143< / 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 = "8 tests cover line 144" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "144" href = "#144" > 144< / 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 = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "145" href = "#145" > 145< / 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 = "146" href = "#146" > 146< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "147" href = "#147" > 147< / 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" > getAccessToken < / span > < span class = "keyword" > ( < / span > < span class = "default" > string < / span > < span class = "default" > < / span > < span class = "default" > $token < / span > < span class = "keyword" > )< / span > < span class = "keyword" > : < / span > < span class = "default" > < / span > < span class = "keyword" > ? < / span > < span class = "keyword" > array < / 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 148" data-content = "<ul><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 = "148" href = "#148" > 148< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / 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" > get < / span > < span class = "keyword" > ( < / span > < span class = "default" > $token< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "130" href = "#130" > 130< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the access token is valid, mark it as redeemed and set a new expiry time .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 131" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "131" href = "#131" > 131< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [ < / span > < span class = "default" > 'exchanged_at' < / span > < span class = "keyword" > ] < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > time< / 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 = "132" href = "#132" > 132< / 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 133" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "133" href = "#133" > 133< / 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_int < / span > < span class = "keyword" > (< / span > < span class = "default" > $data < / span > < span class = "keyword" > [ < / span > < span class = "default" > '_access_token_ttl' < / span > < span class = "keyword" > ] < / span > < span class = "default" > < / span > < span class = "default" > ?? < / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "134" href = "#134" > 134< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // This access token has a custom TTL, use that. < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "135" href = "#135" > 135< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > +< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > '_access_code_ttl'< / 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 136" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "136" href = "#136" > 136< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "defaul t" > < / span > < span class = "keyword" > elseif< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > accessTokenTtl< / span > < span class = "default" > < / span > < span class = "default" > ==< / span > < span class = "default" > < / span > < span class = "default" > 0< / 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 = "137" href = "#137" > 137< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // T he tok en should be valid until explicitly revoked .< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "138" href = "#138" > 138< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default " > null < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "139" href = "#139" > 139< / 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 = "140" href = "#140" > 140< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Use the default TTL. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 141" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "141" href = "#141" > 141< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ] < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > time< / span > < span class = "keyword" > ( < / span > < span class = "keyword" > ) < / 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" > accessTokenTtl < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "142" href = "#142" > 142< / 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 = "143" href = "#143" > 143< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "144" href = "#144" > 144< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Write the new file contents, truncating afterwards in case the new data is shorter than the old data. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "3 tests cover line 145" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "145" href = "#145" > 145< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $jsonData< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / 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 146" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "146" href = "#146" > 146< / 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" > rewind< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "3 tests cover line 147" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "147" href = "#147" > 147< / 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" > fwrite< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > $jsonData < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false < / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null < / 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 = "3 tests cover line 148" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "148" href = "#148" > 148< / 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" > ftruncate< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > strlen< / span > < span class = "keyword" > (< / span > < span class = "default" > $jsonData< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > === < / span > < span class = "default" >   ; < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "149" href = "#149" > 149< / 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 150" data-content = "<ul><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 = "150" href = "#150" > 150< / 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" > is_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "151" href = "#151" > 151< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "152" href = "#152" > 152< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that this is a redeemed access token. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 153" data-content = "<ul><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 = "153" href = "#153" > 153< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'exchanged_at'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "154" href = "#154" > 154< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "155" href = "#155" > 155< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Check that the access token is still valid. valid_until=null means it should live until < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "156" href = "#156" > 156< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // explicitly revoked. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 157" data-content = "<ul><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 = "157" href = "#157" > 157< / 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_int< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > time< / 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" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / 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 = "158" href = "#158" > 158< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "159" href = "#159" > 159< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // The token is valid! < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 160" data-content = "<ul><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 = "160" href = "#160" > 160< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "161" href = "#161" > 161< / 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 = "162" href = "#162" > 162< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "163" href = "#163" > 163< / 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" > revokeAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $token< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / 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 164" data-content = "<ul><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 = "164" href = "#164" > 164< / 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" > delete < / span > < span class = "keyword" > (< / span > < span class = "default" > $token < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "165" href = "#165" > 165< / 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 = "166" href = "#166" > 166< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "167" href = "#167" > 167< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Implementation-Specifc Methods. < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "150" href = "#150" > 150< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Return the OAuth2-compatible access token data to the Server for passing onto < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "151" href = "#151" > 151< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // the client app. Passed via array_filter to remove the scope key if scope is null.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 152" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "152" href = "#152" > 152< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > array_filter< / 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 153" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "153" href = "#153" > 153< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'access_token' < / span > < span class = "default" > < / span > < span class = "default" > = > < / span > < span class = "default" > < / span > < span class = "default" > $accessToken < / span > < span class = "keyword" > , < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 154" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "154" href = "#154" > 154< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'scope'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 155" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "155" href = "#155" > 155< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "defaul t" > 'me'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / 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 156" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "156" href = "#156" > 156< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'profile'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'profile'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "157" href = "#157" > 157< / 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 = "8 tests cover line 158" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "158" href = "#158" > 158< / 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 = "warning d-flex" > < td class = "col-1 text-right" > < a id = "159" href = "#159" > 159< / 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 = "160" href = "#160" > 160< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "161" href = "#161" > 161< / 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" > getAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $token< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "keyword" > array< / 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 162" data-content = "<ul><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 = "162" href = "#162" > 162< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / 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" > get< / span > < span class = "keyword" > (< / span > < span class = "default" > $token< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "163" href = "#163" > 163< / 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 164" data-content = "<ul><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 = "164" href = "#164" > 164< / 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" > is_array < / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / 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 pop in d-flex" > < td data-title = "1 test covers line 165" data-content = "<ul><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 = "165" href = "#165" > 165< / 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 access token could not be parsed as a JSON object." < / 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 166" data-content = "<ul><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 = "166" href = "#166" > 166< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "167" href = "#167" > 167< / 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 = "168" href = "#168" > 168< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "169" href = "#169" > 169< / 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" > deleteExpiredTokens< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > int< / 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 170" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "170" href = "#170" > 170< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $deleted< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 0 < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "171" href = "#171" > 171< / 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 172" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "172" href = "#172" > 172< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > foreach< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > DirectoryIterator< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > path< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > as < / span > < span class = "default" > < / span > < span class = "default" > $fileInfo< / 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 173" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "173" href = "#173" > 173< / 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" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > isFile< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > getExtension< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ==< / span > < span class = "default" > < / span > < span class = "default" > 'json'< / 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 = "174" href = "#174" > 174< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Only delete files which we can lock.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 175" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "175" href = "#175" > 175< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $successfullyDeleted< / span > < span class = "defaul t"> < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > getPathname< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > f unc tion< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / 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" > $fileInfo< / 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 = "176" href = "#176" > 176< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Read the file, check expiry date! Only unlink if file is expir ed.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 177" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "177" href = "#177" > 177< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / 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 178" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "178" href = "#178" > 178< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $d< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" >   ; < / span > < span class = "default" > fread< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > , < / span > < span class = "default" >   ; < / span > < span class = "default" > 1024< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "default" > .=< / span > < span class = "default" > < / span > < span class = "default" > $d< / 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 = "179" href = "#179" > 179< / 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 180" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "180" href = "#180" > 180< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > json_decode< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileContents< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "169" href = "#169" > 169< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that this is a redeemed access token.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 170" data-content = "<ul><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 = "170" href = "#170" > 170< / 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" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'exchanged_at'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > == =< / span > < span class = "default" > < / span > < span class = "default" > false < / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "171" href = "#171" > 171< / 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" > " This authorization code has not yet been exchanged for an access token." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "172" href = "#172" > 172< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "173" href = "#173" > 173< / 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 = "174" href = "#174" > 174< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "175" href = "#175" > 175< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t"> // Check that the access token is still valid. valid_ until=null means it should live until < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "176" href = "#176" > 176< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // explicitly revok ed.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 177" data-content = "<ul><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 = "177" href = "#177" > 177< / 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_int< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > time< / 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 = "danger d-flex" > < td class = "col-1 text-right" > < a id = "178" href = "#178" > 178< / 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" > " This access token has expired." < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "179" href = "#179" > 179< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "180" href = "#180" > 180< / 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 = "181" href = "#181" > 181< / 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 182" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "182" href = "#182" > 182< / 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" > is_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "keyword" > return< / 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 = "183" href = "#183" > 183< / 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 = "184" href = "#184" > 184< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If valid_until is a valid time, and is in the past, delete the token.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 185" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "185" href = "#185" > 185< / 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_int< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > time< / 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 186" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "186" href = "#186" > 186< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > retur n< / span > < span class = "default" > < / span > < span class = "default" > unlink < / span > < span class = "keyword" > (< / span > < span class = "default" > $fileInfo < / span > < span class = "default" > - > ; < / span > < span class = "default" > getPathname < / 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 = "187" href = "#187" > 187< / 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 = "1 test covers line 188" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "188" href = "#188" > 188< / 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 = "189" href = "#189" > 189< / 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 190" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "190" href = "#190" > 190< / 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" > $successfullyDeleted< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $deleted< / span > < span class = "default" > ++< / 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 = "191" href = "#191" > 191< / 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 = "192" href = "#192" > 192< / 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 = "193" href = "#193" > 193< / 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 194" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "194" href = "#194" > 194< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > $deleted < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "195" href = "#195" > 195< / 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 = "196" href = "#196" > 196< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "197" href = "#197" > 197< / 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" > get < / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > : < / span > < span class = "default" > < / span > < span class = "keyword" > ? < / span > < span class = "keyword" > array < / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 198" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "198" href = "#198" > 198< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $path< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "defaul t" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "199" href = "#199" > 199< / 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 200" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "200" href = "#200" > 200< / 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" > file_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / 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 = "3 tests cover line 201" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</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 = "201" href = "#201" > 201< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "202" href = "#202" > 202< / 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 = "182" href = "#182" > 182< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // The token is valid! < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 183" data-content = "<ul><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 = "183" href = "#183" > 183< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "184" href = "#184" > 184< / 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 = "185" href = "#185" > 185< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "186" href = "#186" > 186< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > functio n< / span > < span class = "default" > < / span > < span class = "default" > revokeAccessToken < / span > < span class = "keyword" > (< / span > < span class = "default" > string < / span > < span class = "default" >   ; < / span > < span class = "default" > $token < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / 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 187" data-content = "<ul><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 = "187" href = "#187" > 187< / 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 = "string" > " < / span > < span class = "string" > Deleting access token < / span > < span class = "string" > {< / span > < span class = "string" > $token< / 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 188" data-content = "<ul><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 = "188" href = "#188" > 188< / 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" > delete< / span > < span class = "keyword" > (< / span > < span class = "default" > $token< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "189" href = "#189" > 189< / 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 = "190" href = "#190" > 190< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "191" href = "#191" > 191< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Implementation-Specifc Methods.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "192" href = "#192" > 192< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "193" href = "#193" > 193< / 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" > deleteExpiredTokens< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > int< / 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 194" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "194" href = "#194" > 194< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $deleted < / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 0 < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "195" href = "#195" > 195< / 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 196" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "196" href = "#196" > 196< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > foreach< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > DirectoryIterator< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > path< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > as< / span > < span class = "default" > < / span > < span class = "default" > $fileInfo< / 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 197" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "197" href = "#197" > 197< / 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" > $fileInfo < / span > < span class = "default" > - > ; < / span > < span class = "default" > isFile < / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > getExtension < / span > < span class = "keyword" > ( < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > ==< / span > < span class = "default" > < / span > < span class = "default" > 'json' < / 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 = "198" href = "#198" > 198< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Only delete files which we can lock. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 199" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "199" href = "#199" > 199< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $successfullyDeleted< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > getPathname< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r'< / 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" > $fp< / 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" > $fileInfo< / 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 = "200" href = "#200" > 200< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Read the file, check expiry date! Only unlink if file is expired. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 201" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "201" href = "#201" > 201< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / 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 202" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "202" href = "#202" > 202< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $d< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > fread< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 1024< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "default" > .=< / span > < span class = "default" > < / span > < span class = "default" > $d< / 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 = "203" href = "#203" > 203< / 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 204" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "204" href = "#204" > 204< / 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" > withLock< / span > < span class = "keyword" > ( < / span > < span class = "default" > $path < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > 'r' < / 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" > $fp < / 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 = "4 tests cover line 205" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "205" href = "#205" > 205< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > ''< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 206" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "206" href = "#206" > 206< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while < / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default " > $data < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default " > fread < / span > < span class = "keyword" > ( < / span > < span class = "default" > $fp < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > 1024< / 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 = "4 tests cover line 207" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "207" href = "#207" > 207< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents< / span > < span class = "default" > < / span > < span class = "default" > .=< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "208" href = "#208" > 208< / 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 = "4 tests cover line 209" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "209" href = "#209" > 209< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $result < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > json_decode < / span > < span class = "keyword" > ( < / span > < span class = "default" > $fileContents < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > tru e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "210" href = "#210" > 210< / 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 211" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "211" href = "#211" > 211< / 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_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $result< / 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 = "4 tests cover line 212" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "212" href = "#212" > 212< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > $result < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "213" href = "#213" > 213< / 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 = "214" href = "#214" > 214< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "215" href = "#215" > 215< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 216" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "216" href = "#216" > 216< / 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 = "warning d-flex" > < td class = "col-1 text-right" > < a id = "217" href = "#217" > 217< / 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 = "218" href = "#218" > 218< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "219" href = "#219" > 219< / 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" > put< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "220" href = "#220" > 220< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Ensure that the containing folder exists.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 221" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "221" href = "#221" > 221< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > @ < / span > < span class = "default" > mkdir < / span > < span class = "keyword" > ( < / span > < span class = "default" > $this < / span > < span class = "default" > -> < / span > < span class = "default " > path < / span > < span class = "keyword " > , < / span > < span class = "default" > < / span > < span class = "default" > 0777 < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default " > true < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "222" href = "#222" > 222< / 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 = "11 tests cover line 223" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "223" href = "#223" > 223< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'w'< / 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" > $fp< / 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" > $data< / 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 = "11 tests cover line 224" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "224" href = "#224" > 224< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > fwrite< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "default" > $d ata < / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 225" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "225" href = "#225" > 225< / 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 = "warning d-flex" > < td class = "col-1 text-right" > < a id = "226" href = "#226" > 226< / 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 = "1 test covers line 204" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "204" href = "#204" > 204< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $data < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > json_decode < / span > < span class = "keyword" > ( < / span > < span class = "default" > $fileContents < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > true < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "205" href = "#205" > 205< / 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 206" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "206" href = "#206" > 206< / 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" > is_array < / span > < span class = "keyword" > ( < / span > < span class = "default" > $data < / span > < span class = "keyword " > ) < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < span class = "default" > < / span > < span class = "keyword" > return < / 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 = "207" href = "#207" > 207< / 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 = "208" href = "#208" > 208< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If valid_until is a valid time, and is in the past, delete the token.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 209" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "209" href = "#209" > 209< / 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_int< / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "keyword" > [< / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ?? < / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > [ < / span > < span class = "default" > 'valid_until'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > < < / span > < span class = "default" > < / span > < span class = "default" > tim e< / 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 210" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "210" href = "#210" > 210< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > unlink< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileInfo< / span > < span class = "default" > -> < / span > < span class = "default" > getPathname< / 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 = "211" href = "#211" > 211< / 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 = "1 test covers line 212" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "212" href = "#212" > 212< / 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 = "213" href = "#213" > 213< / 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 214" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "214" href = "#214" > 214< / 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" > $successfullyDeleted< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < span class = "default" > < / span > < span class = "default" > $deleted< / span > < span class = "default" > ++< / 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 = "215" href = "#215" > 215< / 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 = "216" href = "#216" > 216< / 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 = "217" href = "#217" > 217< / 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 218" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "218" href = "#218" > 218< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $deleted< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "219" href = "#219" > 219< / 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 = "220" href = "#220" > 220< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "221" href = "#221" > 221< / 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" > get < / span > < span class = "keyword " > ( < / span > < span class = "default " > string < / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > : < / span > < span class = "default" > < / span > < span class = "keyword " > ? < / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 222" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "222" href = "#222" > 222< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $path< / 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" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "223" href = "#223" > 223< / 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 224" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "224" href = "#224" > 224< / 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" > file_exists < / span > < span class = "keyword" > (< / span > < span class = "default" > $p ath < / 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 = "3 tests cover line 225" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</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 = "225" href = "#225" > 225< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default " > null < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "226" href = "#226" > 226< / 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 = "227" href = "#227" > 227< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "228" href = "#228" > 228< / 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" > delete < / span > < span class = "keyword" > (< / span > < span class = "default" > string < / span > < span class = "default" > < / span > < span class = "default" > $key < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $observeLock < / span > < span class = "keyword" > = < / span > < span class = "default" > true< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > : < / span > < span class = "default" > < / span > < span class = "default " > bool < / 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 229" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "229" href = "#229" > 229< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $path< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $thi s< / span > < span class = "default" > - > < / span > < span class = "default" > getPath < / span > < span class = "keyword" > ( < / span > < span class = "default" > $key < / span > < span class = "keyword " > ) < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "7 tests cover line 230" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "230" href = "#230" > 230< / 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" > file_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > $path < / 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 231" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints </li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "231" href = "#231" > 231< / 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" > $observeLock< / 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 232" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "232" href = "#232" > 232< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r'< / 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" > $fp< / 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" > $path< / 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 233" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "233" href = "#233" > 233< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > unlink < / span > < span class = "keyword" > ( < / span > < span class = "default" > $path < / 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 234" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "234" href = "#234" > 234< / 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 = "235" href = "#235" > 235< / 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 = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 236" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope </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 = "236" href = "#236" > 236< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > unlink< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / 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 228" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "228" href = "#228" > 228< / 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" > withLock < / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > 'r' < / 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" > $fp < / 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 = "4 tests cover line 229" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "229" href = "#229" > 229< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContent s< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default " > '' < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 230" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "230" href = "#230" > 230< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > while < / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $data< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > fread< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 1024 < / 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 = "4 tests cover line 231" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "231" href = "#231" > 231< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fileContents < / span > < span class = "default" > < / span > < span class = "default " > .= < / span > < span class = "default" > < / span > < span class = "default" > $data < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "232" href = "#232" > 232< / 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 = "4 tests cover line 233" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "233" href = "#233" > 233< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $result< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > json_decode< / span > < span class = "keyword" > (< / span > < span class = "default" > $fileContents < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "234" href = "#234" > 234< / 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 235" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "235" href = "#235" > 235< / 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_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $result< / 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 = "4 tests cover line 236" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud </li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp </li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly </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 = "236" href = "#236" > 236< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $result < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "237" href = "#237" > 237< / 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 = "238" href = "#238" > 238< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "239" href = "#239" > 239< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > false < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "240" href = "#240" > 240< / 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 = "241" href = "#241" > 241< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "242" href = "#242" > 242< / 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" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "243" href = "#243" > 243< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t"> // TODO: ensure that the calculated path is a child of $this-> path. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 244" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "244" href = "#244" > 244< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "defaul t" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > path< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "string" > " < / span > < span class = "string" > $key< / span > < span class = "string" > .json< / span > < span class = "string" > " < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "245" href = "#245" > 245< / 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 = "246" href = "#246" > 246< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "247" href = "#247" > 247< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $path< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > string < / span > < span class = "default" > < / span > < span class = "default" > $mode < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "keyword" > callabl e< / span > < span class = "default" > < / span > < span class = "default" > $callback < / 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 = "11 tests cover line 248" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "248" href = "#248" > 248< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default " > $fp < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "keyword" > @ < / span > < span class = "default" > fopen < / span > < span class = "keyword" > (< / span > < span class = "default" > $p ath < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > $mode < / span > < span class = "keyword " > ) < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "249" href = "#249" > 249< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "11 tests cover line 250" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "250" href = "#250" > 250< / 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" > $fp< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / 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 251" 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 = "251" href = "#251" > 251< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "252" href = "#252" > 252< / 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 = "253" href = "#253" > 253< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "254" href = "#254" > 254< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Wait for a lock. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 255" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "255" href = "#255" > 255< / 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" > flock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > LOCK_EX< / 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 = "11 tests cover line 256" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "256" href = "#256 " > 256 < / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $return < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "257" href = "#257" > 257< / 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 = "258" href = "#258" > 258< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Perform whatever action on the file pointer. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 259" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "259" href = "#259" > 259< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $return< / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "default" > $callback< / span > < span class = "keyword" > ( < / span > < span class = "default" > $fp< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 260" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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::testBackCompatRequestsWithoutPkceWorkCorrectlyWithBothExchangeFlow s</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 = "260" href = "#260" > 260< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > } < / span > < span class = "default" > < / span > < span class = "keyword" > finally < / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "261" href = "#261" > 261< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Regardless of what happens, release the lock. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 262" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "262" href = "#262" > 262< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > flock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > LOCK_UN< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 263" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "263" href = "#263" > 263< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > fclose< / span > < span class = "keyword" > ( < / span > < span class = "default" > $fp < / span > < span class = "keyword " > ) < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "264" href = "#264" > 264< / 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 = "11 tests cover line 265" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "265" href = "#265" > 265< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $return< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "266" href = "#266" > 266< / 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 = "267" href = "#267" > 267< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // It wasn’ t possible to get a lock .< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "268" href = "#268" > 268< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "238" href = "#238" > 238< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "239" href = "#239" > 239< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "4 tests cover line 240" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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 = "240" href = "#240" > 240< / 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 = "warning d-flex" > < td class = "col-1 text-right" > < a id = "241" href = "#241" > 241< / 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 = "242" href = "#242" > 242< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "243" href = "#243" > 243< / 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 = "defaul t"> < / span > < span class = "default" > put< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $data< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "244" href = "#244" > 244< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "commen t" > // Ensure that the containing folder exists. < / span > < / td > < / tr >
< tr class = "covered-by-large-tests pop in d-flex" > < td data-title = "11 tests cover line 245" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "245" href = "#245" > 245< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > @< / span > < span class = "default" > mkdir< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > path< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 0777< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "246" href = "#246" > 246< / 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 = "11 tests cover line 247" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "247" href = "#247" > 247< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'w'< / 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" > $fp < / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "keyword" > us e< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $data < / 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 = "11 tests cover line 248" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "248" href = "#248" > 248< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword " > return < / span > < span class = "default" > < / span > < span class = "default" > fwrite< / span > < span class = "keyword" > ( < / span > < span class = "default" > $fp < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "default" > $d ata < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ) < / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default " > false < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 249" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "249" href = "#249" > 249< / 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 = "warn ing d-flex" > < td class = "col-1 text-right" > < a id = "250" href = "#250" > 250< / 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 = "251" href = "#251" > 251< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "252" href = "#252" > 252< / 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" > delete< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $observeLock< / span > < span class = "keyword" > =< / span > < span class = "default" > true< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / 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 253" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "253" href = "#253" > 253< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $path< / 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" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "7 tests cover line 254" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "254" href = "#254" > 254< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "defaul t" > < / span > < span class = "keyword" > (< / span > < span class = "default" > file_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / 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 255" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</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::testBackCompatAuthCodeWithoutPkceCannotBeExchangedWithCodeVerifierBothExchangeEndpoints</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "255" href = "#255" > 255< / 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" > $observeLock < / 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 256" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "256" href = "#256" > 256< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'r'< / 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" > $fp< / 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" > $path< / 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 257" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "257" href = "#257" > 257< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > unlink< / span > < span class = "keyword" > (< / span > < span class = "default" > $path< / 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 258" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</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 = "258" href = "#258" > 258< / 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 = "259" href = "#259" > 259< / 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 = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 260" 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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScope s</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 = "260" href = "#260" > 260< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default" > unlink< / span > < span class = "keyword" > ( < / span > < span class = "default" > $path< / span > < span class = "keyword" > ) < / span > < span class = "keyword" > ; < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "261" href = "#261" > 261< / 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 = "262" href = "#262" > 262< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > } < / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "263" href = "#263" > 263< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return < / span > < span class = "default" > < / span > < span class = "default " > false < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "264" href = "#264" > 264< / 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 = "265" href = "#265" > 265< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "266" href = "#266" > 266< / 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" > getPath< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $key< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "keyword" > { < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "267" href = "#267" > 267< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: ensure that the calculated path is a child of $this-> path .< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 268" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "268" href = "#268" > 268< / 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" > path< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "string" > " < / span > < span class = "string" > $key< / span > < span class = "string" > .json< / span > < span class = "string" > " < / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "269" href = "#269" > 269< / 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 = "270" href = "#270" > 270< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "271" href = "#271" > 271< / 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" > hash< / span > < span class = "keyword" > ( < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $token < / span > < span class = "keyword" > ) < / span > < span class = "keyword" > : < / span > < span class = "default" > < / span > < span class = "default" > string < / 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 272" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "272" href = "#272" > 272< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > hash_hmac < / span > < span class = "keyword" > ( < / span > < span class = "default" > 'sha256' < / span > < span class = "keyword" > , < / span > < span class = "default" > < / span > < span class = "default" > $token< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > secret < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "273" href = "#273" > 273< / 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 = "274" href = "#274" > 274< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > } < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "271" href = "#271" > 271< / 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" > withLock< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $path< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $mode < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > callable < / span > < span class = "default" > < / span > < span class = "default" > $callback< / 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 = "11 tests cover line 272" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "272" href = "#272" > 272< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $fp < / span > < span class = "default" > < / span > < span class = "keyword" > = < / span > < span class = "default" > < / span > < span class = "keyword" > @ < / span > < span class = "default" > fopen< / span > < span class = "keyword" > (< / span > < span class = "default" > $path < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $mode < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "273" href = "#273" > 273< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 274" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "274" href = "#274" > 274< / 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" > $fp< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > false< / 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 275" 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 = "275" href = "#275" > 275< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "276" href = "#276" > 276< / 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 = "277" href = "#277" > 277< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "278" href = "#278" > 278< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Wait for a lock.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 279" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "279" href = "#279" > 279< / 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" > flock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > LOCK_EX< / 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 = "11 tests cover line 280" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "280" href = "#280" > 280< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $return< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "281" href = "#281" > 281< / 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 = "282" href = "#282" > 282< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Perform whatever action on the file pointer.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 283" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "283" href = "#283" > 283< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $return< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $callback< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 284" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "284" href = "#284" > 284< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > finally< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "285" href = "#285" > 285< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Regardless of what happens, release the lock.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 286" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "286" href = "#286" > 286< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > flock< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > LOCK_UN< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 287" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "287" href = "#287" > 287< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > fclose< / span > < span class = "keyword" > (< / span > < span class = "default" > $fp< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "288" href = "#288" > 288< / 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 = "11 tests cover line 289" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCrud</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\FilesystemJsonStorageTest::testCleanUp</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</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::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "289" href = "#289" > 289< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $return< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "290" href = "#290" > 290< / 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 = "291" href = "#291" > 291< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // It wasn’ t possible to get a lock.< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "292" href = "#292" > 292< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "293" href = "#293" > 293< / 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 = "294" href = "#294" > 294< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "295" href = "#295" > 295< / 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" > hash< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $token< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > string< / 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 296" 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::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</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 = "296" href = "#296" > 296< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > hash_hmac< / span > < span class = "keyword" > (< / span > < span class = "default" > 'sha256'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $token< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > secret< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "297" href = "#297" > 297< / 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 = "298" href = "#298" > 298< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > }< / span > < / td > < / tr >
< / tbody >
< / table >
@@ -663,7 +687,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 >