2021-06-13 14:35:07 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
2021-06-14 22:53:15 +01:00
< title > Code Coverage for /Users/barnabywalters/Documents/Programming/taproot/indieauth/src/Server.php< / title >
2021-06-13 14:35:07 +01:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2021-06-13 14:47:54 +01:00
< link href = "phpunit_css/bootstrap.min.css" rel = "stylesheet" type = "text/css" >
< link href = "phpunit_css/octicons.css" rel = "stylesheet" type = "text/css" >
< link href = "phpunit_css/style.css" rel = "stylesheet" type = "text/css" >
< link href = "phpunit_css/custom.css" rel = "stylesheet" type = "text/css" >
2021-06-13 14:35:07 +01:00
< / head >
< body >
< header >
< div class = "container-fluid" >
< div class = "row" >
< div class = "col-md-12" >
< nav aria-label = "breadcrumb" >
< ol class = "breadcrumb" >
2021-06-14 22:53:15 +01:00
< li class = "breadcrumb-item" > < a href = "index.html" > /Users/barnabywalters/Documents/Programming/taproot/indieauth/src< / a > < / li >
2021-06-13 14:35:07 +01:00
< li class = "breadcrumb-item active" > Server.php< / li >
< / ol >
< / nav >
< / div >
< / div >
< / div >
< / header >
< div class = "container-fluid" >
< div class = "table-responsive" >
< table class = "table table-bordered" >
< thead >
< tr >
< td > < / td >
< td colspan = "10" > < div align = "center" > < strong > Code Coverage< / strong > < / div > < / td >
< / tr >
< tr >
< td > < / td >
< td colspan = "3" > < div align = "center" > < strong > Classes and Traits< / strong > < / div > < / td >
< td colspan = "4" > < div align = "center" > < strong > Functions and Methods< / strong > < / div > < / td >
< td colspan = "3" > < div align = "center" > < strong > Lines< / strong > < / div > < / td >
< / tr >
< / thead >
< tbody >
< tr >
< td class = "danger" > Total< / 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 = "danger small" > < div align = "right" > 0.00%< / div > < / td >
< td class = "danger small" > < div align = "right" > 0 / 1< / div > < / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "60.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 60.00%" >
< span class = "sr-only" > 60.00% covered (warning)< / span >
< / div >
< / div >
< / td >
< td class = "warning small" > < div align = "right" > 60.00%< / div > < / td >
< td class = "warning small" > < div align = "right" > 3 / 5< / div > < / td >
< td class = "warning small" > < abbr title = "Change Risk Anti-Patterns (CRAP) Index" > CRAP< / abbr > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "94.90" aria-valuemin = "0" aria-valuemax = "100" style = "width: 94.90%" >
< span class = "sr-only" > 94.90% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 94.90%< / div > < / td >
< td class = "success small" > < div align = "right" > 242 / 255< / div > < / td >
< / tr >
< tr >
< td class = "danger" > < abbr title = "Taproot\IndieAuth\Server" > Server< / abbr > < / 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 = "danger small" > < div align = "right" > 0.00%< / div > < / td >
< td class = "danger small" > < div align = "right" > 0 / 1< / div > < / td >
< td class = "warning big" > < div class = "progress" >
< div class = "progress-bar bg-warning" role = "progressbar" aria-valuenow = "60.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 60.00%" >
< span class = "sr-only" > 60.00% covered (warning)< / span >
< / div >
< / div >
< / td >
< td class = "warning small" > < div align = "right" > 60.00%< / div > < / td >
< td class = "warning small" > < div align = "right" > 3 / 5< / div > < / td >
< td class = "warning small" > 83.91< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "94.90" aria-valuemin = "0" aria-valuemax = "100" style = "width: 94.90%" >
< span class = "sr-only" > 94.90% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 94.90%< / div > < / td >
< td class = "success small" > < div align = "right" > 242 / 255< / div > < / td >
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#188" > < abbr title = "__construct(array $config)" > __construct< / 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 >
< / div >
< / 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" > 17< / 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 >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 45 / 45< / div > < / td >
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#283" > < abbr title = "getTokenStorage(): Taproot\IndieAuth\Storage\TokenStorageInterface" > getTokenStorage< / 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 >
< / div >
< / 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" > 1< / 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 >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#322" > < abbr title = "handleAuthorizationEndpointRequest(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface" > handleAuthorizationEndpointRequest< / 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 = "danger small" > < div align = "right" > 0.00%< / div > < / td >
< td class = "danger small" > < div align = "right" > 0 / 1< / div > < / td >
< td class = "danger small" > 51.93< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "92.90" aria-valuemin = "0" aria-valuemax = "100" style = "width: 92.90%" >
< span class = "sr-only" > 92.90% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 92.90%< / div > < / td >
< td class = "success small" > < div align = "right" > 144 / 155< / div > < / td >
< / tr >
< tr >
< td class = "danger" colspan = "4" > < a href = "#680" > < abbr title = "handleTokenEndpointRequest(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ResponseInterface" > handleTokenEndpointRequest< / 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 = "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< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "95.35" aria-valuemin = "0" aria-valuemax = "100" style = "width: 95.35%" >
< span class = "sr-only" > 95.35% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 95.35%< / div > < / td >
< td class = "success small" > < div align = "right" > 41 / 43< / div > < / td >
< / tr >
< tr >
< td class = "success" colspan = "4" > < a href = "#775" > < abbr title = "handleException(Taproot\IndieAuth\IndieAuthException $exception): Psr\Http\Message\ResponseInterface" > handleException< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "sr-only" > 100.00% covered (success)< / span >
< / div >
< / 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" > 3< / 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 >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 11 / 11< / div > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< table id = "code" class = "table table-borderless table-condensed" >
< tbody >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "1" href = "#1" > 1< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < ?php < / span > < span class = "keyword" > declare< / span > < span class = "keyword" > (< / span > < span class = "default" > strict_types< / span > < span class = "keyword" > =< / span > < span class = "default" > 1< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "2" href = "#2" > 2< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "3" href = "#3" > 3< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > namespace< / span > < span class = "default" > < / span > < span class = "default" > Taproot< / span > < span class = "default" > \< / span > < span class = "default" > IndieAuth< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "4" href = "#4" > 4< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "5" href = "#5" > 5< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "6" href = "#6" > 6< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > BarnabyWalters< / span > < span class = "default" > \< / span > < span class = "default" > Mf2< / span > < span class = "default" > < / span > < span class = "keyword" > as< / span > < span class = "default" > < / span > < span class = "default" > M< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "7" href = "#7" > 7< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Exception< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "8" href = "#8" > 8< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > GuzzleHttp< / span > < span class = "default" > \< / span > < span class = "default" > Psr7< / span > < span class = "default" > \< / span > < span class = "default" > Header< / span > < span class = "default" > < / span > < span class = "keyword" > as< / span > < span class = "default" > < / span > < span class = "default" > HeaderParser< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "9" href = "#9" > 9< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > IndieAuth< / span > < span class = "default" > \< / span > < span class = "default" > Client< / span > < span class = "default" > < / span > < span class = "keyword" > as< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthClient< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "10" href = "#10" > 10< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Mf2< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "11" href = "#11" > 11< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Nyholm< / span > < span class = "default" > \< / span > < span class = "default" > Psr7< / span > < span class = "default" > \< / span > < span class = "default" > Response< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "12" href = "#12" > 12< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > PDO< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "13" href = "#13" > 13< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Client< / span > < span class = "default" > \< / span > < span class = "default" > ClientExceptionInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "14" href = "#14" > 14< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Client< / span > < span class = "default" > \< / span > < span class = "default" > NetworkExceptionInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "15" href = "#15" > 15< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Client< / span > < span class = "default" > \< / span > < span class = "default" > RequestExceptionInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "16" href = "#16" > 16< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Message< / span > < span class = "default" > \< / span > < span class = "default" > ResponseInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "17" href = "#17" > 17< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Message< / span > < span class = "default" > \< / span > < span class = "default" > ServerRequestInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "18" href = "#18" > 18< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Http< / span > < span class = "default" > \< / span > < span class = "default" > Server< / span > < span class = "default" > \< / span > < span class = "default" > MiddlewareInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "19" href = "#19" > 19< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Log< / span > < span class = "default" > \< / span > < span class = "default" > LoggerInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "20" href = "#20" > 20< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Psr< / span > < span class = "default" > \< / span > < span class = "default" > Log< / span > < span class = "default" > \< / span > < span class = "default" > NullLogger< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "21" href = "#21" > 21< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Taproot< / span > < span class = "default" > \< / span > < span class = "default" > IndieAuth< / span > < span class = "default" > \< / span > < span class = "default" > Callback< / span > < span class = "default" > \< / span > < span class = "default" > AuthorizationFormInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "22" href = "#22" > 22< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Taproot< / span > < span class = "default" > \< / span > < span class = "default" > IndieAuth< / span > < span class = "default" > \< / span > < span class = "default" > Callback< / span > < span class = "default" > \< / span > < span class = "default" > DefaultAuthorizationForm< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "23" href = "#23" > 23< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Taproot< / span > < span class = "default" > \< / span > < span class = "default" > IndieAuth< / span > < span class = "default" > \< / span > < span class = "default" > Storage< / span > < span class = "default" > \< / span > < span class = "default" > TokenStorageInterface< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "24" href = "#24" > 24< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "25" href = "#25" > 25< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "26" href = "#26" > 26< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * IndieAuth Server< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "27" href = "#27" > 27< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "28" href = "#28" > 28< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * A PSR-7-compatible implementation of the request-handling logic for IndieAuth authorization endpoints< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "29" href = "#29" > 29< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * and token endpoints.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "30" href = "#30" > 30< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "31" href = "#31" > 31< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Typical minimal usage looks something like this:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "32" href = "#32" > 32< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "33" href = "#33" > 33< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // Somewhere in your app set-up code:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "34" href = "#34" > 34< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * $server = new Taproot\IndieAuth\Server([< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "35" href = "#35" > 35< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // A secret key, > = 64 characters long.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "36" href = "#36" > 36< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * 'secret' => YOUR_APP_INDIEAUTH_SECRET,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "37" href = "#37" > 37< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "38" href = "#38" > 38< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // A path to store token data, or an object implementing TokenStorageInterface.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "39" href = "#39" > 39< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * 'tokenStorage' => '/../data/auth_tokens/',< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "40" href = "#40" > 40< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "41" href = "#41" > 41< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // An authentication callback function, which either returns data about the current user,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "42" href = "#42" > 42< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // or redirects to/implements an authentication flow.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "43" href = "#43" > 43< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * 'authenticationHandler' => function (ServerRequestInterface $request, string $authenticationRedirect, ?string $normalizedMeUrl) {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "44" href = "#44" > 44< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // If the request is authenticated, return an array with a `me` key containing the< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "45" href = "#45" > 45< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // canonical URL of the currently logged-in user.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "46" href = "#46" > 46< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * if ($userUrl = getLoggedInUserUrl($request)) {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "47" href = "#47" > 47< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * return ['me' => $userUrl];< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "48" href = "#48" > 48< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "49" href = "#49" > 49< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "50" href = "#50" > 50< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // Otherwise, redirect the user to a login page, ensuring that they will be redirected< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "51" href = "#51" > 51< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // back to the IndieAuth flow with query parameters intact once logged in.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "52" href = "#52" > 52< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * return new Response('302', ['Location' => 'https://example.com/login?next=' . urlencode($authenticationRedirect)]);< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "53" href = "#53" > 53< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "54" href = "#54" > 54< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * ]);< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "55" href = "#55" > 55< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "56" href = "#56" > 56< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // In your authorization endpoint route:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "57" href = "#57" > 57< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * return $server-> handleAuthorizationEndpointRequest($request);< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "58" href = "#58" > 58< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "59" href = "#59" > 59< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // In your token endpoint route:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "60" href = "#60" > 60< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * return $server-> handleTokenEndpointRequest($request);< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "61" href = "#61" > 61< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "62" href = "#62" > 62< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // In another route (e.g. a micropub route), to authenticate the request:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "63" href = "#63" > 63< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // (assuming $bearerToken is a token parsed from an “Authorization: Bearer XXXXXX” header< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "64" href = "#64" > 64< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * // or access_token property from a request body)< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "65" href = "#65" > 65< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * if ($accessToken = $server-> getTokenStorage()-> getAccessToken($bearerToken)) {< / span > < / td > < / tr >
< 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 = "comment" > * // Request is authenticated as $accessToken['me'], and is allowed to< / 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" > < span class = "comment" > * // act according to the scopes listed in $accessToken['scope'].< / span > < / 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 = "comment" > * $scopes = explode(' ', $accessToken['scope']);< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "69" href = "#69" > 69< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "70" href = "#70" > 70< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "71" href = "#71" > 71< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Refer to the `__construct` documentation for further configuration options, and to the< / 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" > < span class = "comment" > * documentation for both handling methods for further documentation about them.< / span > < / 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 = "comment" > * < / 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 = "comment" > * @link https://indieauth.spec.indieweb.org/< / 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 = "comment" > * @link https://www.rfc-editor.org/rfc/rfc6749.html#section-5.2< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "76" href = "#76" > 76< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @link https://github.com/indieweb/indieauth-client-php< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "77" href = "#77" > 77< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @link https://github.com/Zegnat/php-mindee/blob/development/index.php< / 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 = "comment" > */< / 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 = "keyword" > class< / span > < span class = "default" > < / span > < span class = "default" > Server< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " 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" > const< / span > < span class = "default" > < / span > < span class = "default" > HANDLE_NON_INDIEAUTH_REQUEST< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'handleNonIndieAuthRequestCallback'< / 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" > < span class = "default" > < / span > < span class = "keyword" > const< / span > < span class = "default" > < / span > < span class = "default" > HANDLE_AUTHENTICATION_REQUEST< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'authenticationHandler'< / 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" > < / 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" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "84" href = "#84" > 84< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * The query string parameter key used for storing the hash used for validating authorization request parameters.< / 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" > < span class = "comment" > */< / 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" > const< / span > < span class = "default" > < / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'taproot_indieauth_server_hash'< / 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" > < / 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 = "comment" > /**< / 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" > < span class = "comment" > * The key used to store the CSRF token everywhere it’ s used: Request parameters, Request body, and Cookies.< / 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 = "comment" > */< / 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 = "keyword" > const< / span > < span class = "default" > < / span > < span class = "default" > DEFAULT_CSRF_KEY< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'taproot_indieauth_server_csrf'< / span > < span class = "keyword" > ;< / 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" > < / 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" > < span class = "default" > < / span > < span class = "comment" > /**< / 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 = "comment" > * The form data key used for identifying a request as an authorization (consent screen) form submissions.< / 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 = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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" > const< / span > < span class = "default" > < / span > < span class = "default" > APPROVE_ACTION_KEY< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'taproot_indieauth_action'< / 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 = "comment" > /**< / 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 = "comment" > * The form data value used for identifying a request as an authorization (consent screen) form submissions.< / 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" > < span class = "comment" > */< / span > < / 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 = "keyword" > const< / span > < span class = "default" > < / span > < span class = "default" > APPROVE_ACTION_VALUE< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > 'approve'< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "102" href = "#102" > 102< / a > < / td > < td class = "col-11 codeLine" > < / 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" > protected< / span > < span class = "default" > < / span > < span class = "default" > Storage< / span > < span class = "default" > \< / span > < span class = "default" > TokenStorageInterface< / span > < span class = "default" > < / span > < span class = "default" > $tokenStorage< / 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 = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > AuthorizationFormInterface< / span > < span class = "default" > < / span > < span class = "default" > $authorizationForm< / span > < span class = "keyword" > ;< / 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" > < / td > < / tr >
< tr class = " 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 = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > MiddlewareInterface< / span > < span class = "default" > < / span > < span class = "default" > $csrfMiddleware< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "108" href = "#108" > 108< / a > < / td > < td class = "col-11 codeLine" > < / 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" > protected< / span > < span class = "default" > < / span > < span class = "default" > LoggerInterface< / span > < span class = "default" > < / span > < span class = "default" > $logger< / 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 = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > $httpGetWithEffectiveUrl< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "112" href = "#112" > 112< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " 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 = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > $handleAuthenticationRequestCallback< / 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" > < / 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" > protected< / span > < span class = "default" > < / span > < span class = "default" > $handleNonIndieAuthRequest< / 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 = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $exceptionTemplatePath< / 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 = " 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" > protected< / span > < span class = "default" > < / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $secret< / 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" > < / td > < / tr >
< tr class = " 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 = "comment" > /**< / 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 = "comment" > * Constructor< / 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 = "comment" > * < / 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 = "comment" > * Server instances are configured by passing a config array to the constructor.< / 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 = "comment" > * < / 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 = "comment" > * The following keys are required:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "127" href = "#127" > 127< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "128" href = "#128" > 128< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * `authenticationHandler`: a callable with the signature< / 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" > < span class = "comment" > * `function (ServerRequestInterface $request, string $authenticationRedirect, ?string $normalizedMeUrl): array|ResponseInterface`.< / 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 = "comment" > * This function is called on IndieAuth authorization requests, after validating the query parameters.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "131" href = "#131" > 131< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "132" href = "#132" > 132< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * It should check to see if $request is authenticated, then:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "133" href = "#133" > 133< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * If it is authenticated, return an array which MUST have a `me` key, mapping to the < / 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 = "comment" > * canonical URL of the currently logged-in user. It may additionally have a `profile` key. These< / 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" > < span class = "comment" > * keys will be stored in the authorization code and sent to the client, if successful.< / span > < / 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 = "comment" > * * If it is not authenticated, either present or redirect to an authentication flow. This flow MUST< / 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 = "comment" > * redirect the logged-in used back to `$authenticationRedirect`.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "138" href = "#138" > 138< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "139" href = "#139" > 139< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * If the request has a valid `me` parameter, the canonicalized version of it is passed as< / 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 = "comment" > * `$normalizedMeUrl`. Otherwise, this parameter is null. This parameter can optionally be used < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "141" href = "#141" > 141< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * as a suggestion for which user to log in as in a multi-user authentication flow, but should NOT< / 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 = "comment" > * be considered valid data.< / 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 = "comment" > * < / span > < / 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 = "comment" > * If redirecting to an existing authentication flow, this callable can usually be implemented as a< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "145" href = "#145" > 145< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * closure. The callable may also implement its own authentication logic. For an example, see < / 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" > < span class = "comment" > * `Callback\SingleUserPasswordAuthenticationCallback`.< / span > < / 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 = "comment" > * * `secret`: A cryptographically random string with a minimum length of 64 characters. Used< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "148" href = "#148" > 148< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * to hash and subsequently verify request query parameters which get passed around.< / 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" > < span class = "comment" > * * `tokenStorage`: Either an object implementing `Storage\TokenStorageInterface`, or a string path,< / 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 = "comment" > * which will be passed to `Storage\FilesystemJsonStorage`. This object handles persisting authorization< / 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 = "comment" > * codes and access tokens, as well as implementation-specific parts of the exchange process which are < / span > < / 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 = "comment" > * out of the scope of the Server class (e.g. lifetimes and expiry). Refer to the `Storage\TokenStorageInterface`< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "153" href = "#153" > 153< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * documentation for more details.< / 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" > < span class = "comment" > * < / span > < / 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 = "comment" > * The following keys may be required depending on which packages you have installed:< / 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 = "comment" > * < / 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 = "comment" > * * `httpGetWithEffectiveUrl`: must be a callable with the following signature:< / 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" > < span class = "comment" > * `function (string $url): array [ResponseInterface $response, string $effectiveUrl]`, where < / span > < / 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 = "comment" > * `$effectiveUrl` is the final URL after following any redirects (unfortunately, neither the PSR-7< / 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" > < span class = "comment" > * Response nor the PSR-18 Client interfaces offer a standard way of getting this very important< / span > < / 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 = "comment" > * data, hence the unusual return signature). If `guzzlehttp/guzzle` is installed, this parameter< / 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" > < span class = "comment" > * will be created automatically. Otherwise, the user must provide their own callable.< / 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" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "164" href = "#164" > 164< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * The following keys are optional:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "165" href = "#165" > 165< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "166" href = "#166" > 166< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * `authorizationForm`: an instance of `AuthorizationFormInterface`. Defaults to `DefaultAuthorizationForm`.< / 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 = "comment" > * Refer to that implementation if you wish to replace the consent screen/scope choosing/authorization form.< / 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" > < span class = "comment" > * * `csrfMiddleware`: an instance of `MiddlewareInterface`, which will be used to CSRF-protect the< / 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 = "comment" > * user-facing authorization flow. By default an instance of `DoubleSubmitCookieCsrfMiddleware`.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "170" href = "#170" > 170< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Refer to that implementation if you want to replace it with your own middleware — you will < / 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" > < span class = "comment" > * likely have to either make sure your middleware sets the same request attribute, or alter your< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "172" href = "#172" > 172< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * templates accordingly.< / 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 = "comment" > * * `exceptionTemplatePath`: string, path to a template which will be used for displaying user-facing< / 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 = "comment" > * errors. Defaults to `../templates/default_exception_response.html.php`, refer to that if you wish< / span > < / 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 = "comment" > * to write your own template.< / 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 = "comment" > * * `handleNonIndieAuthRequestCallback`: A callback with the following signature:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "177" href = "#177" > 177< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * `function (ServerRequestInterface $request): ?ResponseInterface` which will be called if the< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "178" href = "#178" > 178< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * authorization endpoint gets a request which is not identified as an IndieAuth request or authorization< / 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" > < span class = "comment" > * form submission request. You could use this to handle various requests e.g. client-side requests< / 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 = "comment" > * made by your authentication or authorization pages, if it’ s not convenient to put them elsewhere.< / 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" > < span class = "comment" > * Returning `null` will result in a standard `invalid_request` error being returned.< / 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 = "comment" > * * `logger`: An instance of `LoggerInterface`. Will be used for internal logging, and will also be set< / 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 = "comment" > * as the logger for any objects passed in config which implement `LoggerAwareInterface`.< / 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 = "comment" > * < / 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" > < span class = "comment" > * @param array $config An array of configuration variables< / span > < / 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 = "comment" > * @return self< / 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 = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > __construct< / span > < span class = "keyword" > (< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $config< / 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 = "26 tests cover line 189" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 190" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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 = "default" > 'logger'< / 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 = "26 tests cover line 192" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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 = "default" > 'tokenStorage'< / 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 = " d-flex" > < td 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" > 'httpGetWithEffectiveUrl'< / 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 = "26 tests cover line 195" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "196" href = "#196" > 196< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exceptionTemplatePath'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > __DIR__< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > '/../templates/default_exception_response.html.php'< / span > < span class = "keyword" > ,< / span > < / 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" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $config< / span > < span class = "keyword" > )< / 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" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 199" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 200" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['exceptionTemplatePath'] must be a string (path)." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 202" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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 = "26 tests cover line 204" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 205" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['secret'] must be a string with a minimum length of 64 characters." < / span > < span class = "keyword" > )< / 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 > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 208" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "209" href = "#209" > 209< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 210" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 211" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['logger'] must be an instance of \\Psr\\Log\\LoggerInterface or null." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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 > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 213" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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 = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 215" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 216" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > '$callbacks[\''< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HANDLE_AUTHENTICATION_REQUEST< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > '\'] must be present and callable.'< / span > < span class = "keyword" > )< / 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" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 218" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< 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 > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 220" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 221" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['" < / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HANDLE_NON_INDIEAUTH_REQUEST< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > " '] must be callable" < / 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 > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 223" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "224" href = "#224" > 224< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 225" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 226" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "25 tests cover line 227" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "227" href = "#227" > 227< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > &
< 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 = "comment" > // Create a default access token storage with a TTL of 7 days.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "25 tests cover line 229" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "229" href = "#229" > 229< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > &
< tr class = " d-flex" > < td 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" > }< / 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 = "1 test covers line 231" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['tokenStorage'] parameter must be either a string (path) or an instance of Taproot\IndieAuth\TokenStorageInterface." < / span > < span class = "keyword" > )< / 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 = " d-flex" > < td 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" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 234" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 235" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "236" href = "#236" > 236< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 237" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 238" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 239" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li></ul>" data-placement = "top" data-html = "true" 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" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['csrfMiddleware'] must be null or implement MiddlewareInterface." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " 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 = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 241" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 242" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "243" href = "#243" > 243< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 244" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 245" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "18 tests cover line 246" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "246" href = "#246" > 246< / 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" > class_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > '\GuzzleHttp\Client'< / 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 = "18 tests cover line 247" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "247" href = "#247" > 247< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $httpGetWithEffectiveUrl< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $uri< / 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 = "248" href = "#248" > 248< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // This code can’ t be tested, ignore it for coverage purposes.< / 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" > < span class = "default" > < / span > < span class = "comment" > // @codeCoverageIgnoreStart< / span > < / td > < / tr >
< tr class = " 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 = "default" > $resp< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > \< / span > < span class = "default" > GuzzleHttp< / span > < span class = "default" > \< / span > < span class = "default" > Client< / span > < span class = "keyword" > (< / 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" > < span class = "default" > < / span > < span class = "default" > \< / span > < span class = "default" > GuzzleHttp< / span > < span class = "default" > \< / span > < span class = "default" > RequestOptions< / span > < span class = "default" > ::< / span > < span class = "default" > ALLOW_REDIRECTS< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / 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 = "default" > 'max'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 10< / 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" > < span class = "default" > < / span > < span class = "default" > 'strict'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > ,< / span > < / 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 = "default" > 'referer'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "255" href = "#255" > 255< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'track_redirects'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > true< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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" > ]< / 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" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > -> < / span > < span class = "default" > get< / span > < span class = "keyword" > (< / span > < span class = "default" > $uri< / span > < span class = "keyword" > )< / 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 > < / 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 = "default" > $rdh< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $resp< / span > < span class = "default" > -> < / span > < span class = "default" > getHeader< / span > < span class = "keyword" > (< / span > < span class = "default" > 'X-Guzzle-Redirect-History'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "260" href = "#260" > 260< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $effectiveUrl< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $rdh< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "default" > < / span > < span class = "default" > $uri< / span > < span class = "default" > < / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > array_values< / span > < span class = "keyword" > (< / span > < span class = "default" > $rdh< / span > < span class = "keyword" > )< / span > < span class = "keyword" > [< / span > < span class = "default" > count< / span > < span class = "keyword" > (< / span > < span class = "default" > $rdh< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > -< / span > < span class = "default" > < / span > < span class = "default" > 1< / 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" > < / 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" > return< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > $resp< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $effectiveUrl< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " 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" > }< / 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 > < 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 = "265" href = "#265" > 265< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['httpGetWithEffectiveUrl'] was not provided, and guzzlehttp/guzzle was not installed. Either require guzzlehttp/guzzle, or provide a valid callable." < / span > < span class = "keyword" > )< / 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 = "comment" > // @codeCoverageIgnoreEnd< / 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 = "keyword" > }< / span > < / td > < / tr >
< tr class = " 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" > }< / 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 = "9 tests cover line 269" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" 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" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > is_callable< / span > < span class = "keyword" > (< / span > < span class = "default" > $httpGetWithEffectiveUrl< / 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 270" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "270" href = "#270" > 270< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " \$config['httpGetWithEffectiveUrl'] must be callable." < / span > < span class = "keyword" > )< / span > < 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" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td 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" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 273" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 274" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "275" href = "#275" > 275< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "26 tests cover line 276" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placem
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 277" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidConfigRaisesException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "277" href = "#277" > 277< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > BadMethodCallException< / span > < span class = "keyword" > (< / span > < span class = "default" > " When provided, \$config['authorizationForm'] must implement Taproot\IndieAuth\Callback\AuthorizationForm." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / 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 = "keyword" > }< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "25 tests cover line 279" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "279" href = "#279" > 279< / a > < / td > < td class = "col-11 codeLine" > < span class = "
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "25 tests cover line 280" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "280" href = "#280" > 280< / a > < / td > < td class = "col-11 codeLine" > < span class = "
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "25 tests cover line 281" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "281" href = "#281" > 281< / a > < / td > < td class = "col-11 codeLine" > < span class = "
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "282" href = "#282" > 282< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "283" href = "#283" > 283< / 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" > getTokenStorage< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > TokenStorageInterface< / 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 284" 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 = "284" href = "#284" > 284< / 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" > tokenStorage< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning 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 = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "286" href = "#286" > 286< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "287" href = "#287" > 287< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "288" href = "#288" > 288< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Handle Authorization Endpoint Request< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "289" href = "#289" > 289< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "290" href = "#290" > 290< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * This method handles all requests to your authorization endpoint, passing execution off to< / 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 = "comment" > * other callbacks when necessary. The logical flow can be summarised as follows:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "292" href = "#292" > 292< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "293" href = "#293" > 293< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * If this request an **auth code exchange for profile information**, validate the request< / 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" > < span class = "comment" > * and return a response or error response.< / span > < / 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 = "comment" > * * Otherwise, proceed, wrapping all execution in CSRF-protection middleware.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "296" href = "#296" > 296< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Validate the request’ s indieauth authorization code request parameters, returning an < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "297" href = "#297" > 297< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * error response if any are missing or invalid.< / 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 = "comment" > * * Call the authentication callback< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "299" href = "#299" > 299< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * If the callback returned an instance of ResponseInterface, the user is not currently< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "300" href = "#300" > 300< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * logged in. Return the Response, which will presumably start an authentication flow.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "301" href = "#301" > 301< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Otherwise, the callback returned information about the currently logged-in user. Continue.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "302" href = "#302" > 302< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * If this request is an authorization form submission, validate the data, store and authorization< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "303" href = "#303" > 303< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * code and return a redirect response to the client redirect_uri with code data. On an error, return< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "304" href = "#304" > 304< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * an appropriate error response.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "305" href = "#305" > 305< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Otherwise, fetch the client_id, parse app data if present, validate the `redirect_uri` and present< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "306" href = "#306" > 306< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * the authorization form/consent screen to the user.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "307" href = "#307" > 307< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * If none of the above apply, try calling the non-indieauth request handler. If it returns a Response,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "308" href = "#308" > 308< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * return that, otherwise return an error response.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "309" href = "#309" > 309< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "310" href = "#310" > 310< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * This route should NOT be wrapped in additional CSRF-protection, due to the need to handle API < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "311" href = "#311" > 311< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * POST requests from the client. Make sure you call it from a route which is excluded from any< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "312" href = "#312" > 312< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * CSRF-protection you might be using. To customise the CSRF protection used internally, refer to the< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "313" href = "#313" > 313< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * `__construct` config array documentation for the `csrfMiddleware` key.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "314" href = "#314" > 314< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "315" href = "#315" > 315< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Most user-facing errors are thrown as instances of `IndieAuthException`, which are passed off to< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "316" href = "#316" > 316< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * `handleException` to be turned into an instance of `ResponseInterface`. If you want to customise< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "317" href = "#317" > 317< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * error behaviour, one way to do so is to subclass `Server` and override that method.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "318" href = "#318" > 318< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "319" href = "#319" > 319< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @param ServerRequestInterface $request< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "320" href = "#320" > 320< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @return ResponseInterface< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "321" href = "#321" > 321< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "322" href = "#322" > 322< / 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" > handleAuthorizationEndpointRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > ServerRequestInterface< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > ResponseInterface< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "22 tests cover line 323" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "323" href = "#323" > 323< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > info< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Handling an IndieAuth Authorization Endpoint request.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "324" href = "#324" > 324< / 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 = "325" href = "#325" > 325< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If it’ s a profile information request:< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "22 tests cover line 326" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::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::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "326" href = "#326" > 326< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > isIndieAuthAuthorizationCodeRedeemingRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 327" 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></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "327" href = "#327" > 327< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > info< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Handling a request to redeem an authorization code for profile information.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "328" href = "#328" > 328< / 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 = "4 tests cover line 329" 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></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "329" href = "#329" > 329< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "default" > -> < / span > < span class = "default" > getParsedBody< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "330" href = "#330" > 330< / 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 331" 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></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "331" href = "#331" > 331< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > isset< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 332" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "332" href = "#332" > 332< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > 'The exchange request was missing the code parameter. Returning an error response.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 333" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "333" href = "#333" > 333< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 334" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "334" href = "#334" > 334< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'invalid_request'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "335" href = "#335" > 335< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'The code parameter was missing.'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "336" href = "#336" > 336< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "337" href = "#337" > 337< / 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 = "338" href = "#338" > 338< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "339" href = "#339" > 339< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Attempt to internally exchange the provided auth code for an access token.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "340" href = "#340" > 340< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // We do this before anything else so that the auth code is invalidated as soon as the request starts,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "341" href = "#341" > 341< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // and the resulting access token is revoked if we encounter an error. This ends up providing a simpler< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "342" href = "#342" > 342< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // and more flexible interface for TokenStorage implementors.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "343" href = "#343" > 343< / 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 = "344" href = "#344" > 344< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Call the token exchange method, passing in a callback which performs additional validation< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "345" href = "#345" > 345< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // on the auth code before it gets exchanged.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 346" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "346" href = "#346" > 346< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $tokenData< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > tokenStorage< / span > < span class = "default" > -> < / span > < span class = "default" > exchangeAuthCodeForAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "347" href = "#347" > 347< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Verify that all required parameters are included.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 348" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "348" href = "#348" > 348< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $requiredParameters< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'code_verifier'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 349" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "349" href = "#349" > 349< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > array_filter< / span > < span class = "keyword" > (< / span > < span class = "default" > $requiredParameters< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $p< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 350" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "350" href = "#350" > 350< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > $p< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > $p< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 351" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "351" href = "#351" > 351< / 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 = "3 tests cover line 352" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "352" href = "#352" > 352< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "353" href = "#353" > 353< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > 'The exchange request was missing required parameters. Returning an error response.'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'missing'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "354" href = "#354" > 354< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_REQUEST< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "355" href = "#355" > 355< / 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 = "356" href = "#356" > 356< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "357" href = "#357" > 357< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Verify that it was issued for the same client_id and redirect_uri< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 358" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "358" href = "#358" > 358< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 359" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "359" href = "#359" > 359< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 360" 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 = "360" href = "#360" > 360< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " The provided client_id and/or redirect_uri did not match those stored in the token." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 361" 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 = "361" href = "#361" > 361< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "362" href = "#362" > 362< / 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 = "363" href = "#363" > 363< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "364" href = "#364" > 364< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that the supplied code_verifier hashes to the stored code_challenge< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "365" href = "#365" > 365< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: support method = plain as well as S256.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 366" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "366" href = "#366" > 366< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > hash_equals< / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > generatePKCECodeChallenge< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_verifier'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 367" 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 = "367" href = "#367" > 367< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " The provided code_verifier did not hash to the stored code_challenge" < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 368" 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 = "368" href = "#368" > 368< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "369" href = "#369" > 369< / 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 = "370" href = "#370" > 370< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "371" href = "#371" > 371< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that this token either grants at most the profile scope.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 372" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "372" href = "#372" > 372< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $requestedScopes< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > explode< / span > < span class = "keyword" > (< / span > < span class = "default" > ' '< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / 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" > ''< / 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 373" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "373" href = "#373" > 373< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $requestedScopes< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > $requestedScopes< / span > < span class = "default" > < / span > < span class = "default" > !=< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'profile'< / 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 374" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "374" href = "#374" > 374< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " An exchange request for a token granting scopes other than “profile” was sent to the authorization endpoint." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 375" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "375" href = "#375" > 375< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "376" href = "#376" > 376< / 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 = "3 tests cover line 377" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "377" href = "#377" > 377< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 378" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "378" href = "#378" > 378< / 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 = "379" href = "#379" > 379< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If an exception was thrown, return a corresponding error response.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 380" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "380" href = "#380" > 380< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 381" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "381" href = "#381" > 381< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > getInfo< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > [< / span > < span class = "default" > 'error'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 382" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeFailsForTokensWithInvalidScope</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "382" href = "#382" > 382< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > getMessage< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "383" href = "#383" > 383< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "384" href = "#384" > 384< / 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 = "385" href = "#385" > 385< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 386" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "386" href = "#386" > 386< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $tokenData< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 387" 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 = "387" href = "#387" > 387< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Attempting to exchange an auth code for a token resulted in null.'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 388" 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 = "388" href = "#388" > 388< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 389" 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 = "389" href = "#389" > 389< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'invalid_grant'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "390" href = "#390" > 390< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'The provided credentials were not valid.'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "391" href = "#391" > 391< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "392" href = "#392" > 392< / 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 = "393" href = "#393" > 393< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "394" href = "#394" > 394< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: return an error if the token doesn’ t contain a me key.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "395" href = "#395" > 395< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "396" href = "#396" > 396< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If everything checked out, return {" me" : " https://example.com" } response< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 397" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "397" href = "#397" > 397< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 200< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 398" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "398" href = "#398" > 398< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "399" href = "#399" > 399< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'cache-control'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'no-store'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 400" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "400" href = "#400" > 400< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "default" > array_filter< / span > < span class = "keyword" > (< / span > < span class = "default" > $tokenData< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $k< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "401" href = "#401" > 401< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Prevent codes exchanged at the authorization endpoint from returning any information other than< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "402" href = "#402" > 402< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // me and profile.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 403" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "403" href = "#403" > 403< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > in_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $k< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'profile'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 404" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthEndpointTokenExchangeReturnsCorrectResponseForValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "404" href = "#404" > 404< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > ARRAY_FILTER_USE_KEY< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "405" href = "#405" > 405< / 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 = "406" href = "#406" > 406< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "407" href = "#407" > 407< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Because the special case above isn’ t allowed to be CSRF-protected, we have to do some rather silly< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "408" href = "#408" > 408< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // closure gymnastics here to selectively-CSRF-protect requests which do need it.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "18 tests cover line 409" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "409" href = "#409" > 409< / 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" > csrfMiddleware< / span > < span class = "default" > -> < / span > < span class = "default" > process< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Middleware< / span > < span class = "default" > \< / span > < span class = "default" > ClosureRequestHandler< / span > < span class = "keyword" > (< / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > ServerRequestInterface< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "410" href = "#410" > 410< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Wrap the entire user-facing handler in a try/catch block which catches any exception, converts it< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "411" href = "#411" > 411< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // to IndieAuthException if necessary, then passes it to $this-> handleException() to be turned into a< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "412" href = "#412" > 412< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // response.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "413" href = "#413" > 413< / 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 = "18 tests cover line 414" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "414" href = "#414" > 414< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "default" > -> < / span > < span class = "default" > getQueryParams< / 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 = "415" href = "#415" > 415< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "416" href = "#416" > 416< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /** @var ResponseInterface|null $clientIdResponse */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "417" href = "#417" > 417< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /** @var string|null $clientIdEffectiveUrl */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "418" href = "#418" > 418< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /** @var array|null $clientIdMf2 */< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "18 tests cover line 419" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "419" href = "#419" > 419< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > list< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdResponse< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdMf2< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > null< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "420" href = "#420" > 420< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "421" href = "#421" > 421< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If this is an authorization or approval request (allowing POST requests as well to accommodate < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "422" href = "#422" > 422< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // approval requests and custom auth form submission.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "18 tests cover line 423" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "423" href = "#423" > 423< / 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" > isIndieAuthAuthorizationRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'get'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'post'< / 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 = "16 tests cover line 424" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "424" href = "#424" > 424< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > info< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Handling an authorization request'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'method'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "default" > -> < / span > < span class = "default" > getMethod< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "425" href = "#425" > 425< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "426" href = "#426" > 426< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Validate the Client ID.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "16 tests cover line 427" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "427" href = "#427" > 427< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > isset< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / 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 = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > filter_var< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > FILTER_VALIDATE_URL< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > isClientIdentifier< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyw
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 428" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "428" href = "#428" > 428< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The client_id provided in an authorization request was not valid." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 429" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "429" href = "#429" > 429< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_CLIENT_ID< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "430" href = "#430" > 430< / 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 = "431" href = "#431" > 431< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "432" href = "#432" > 432< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Validate the redirect URI.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "16 tests cover line 433" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "433" href = "#433" > 433< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > isset< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > filter_var< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > FILTER_VALIDATE_URL< / 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 434" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "434" href = "#434" > 434< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The client_id provided in an authorization request was not valid." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 435" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "435" href = "#435" > 435< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_REDIRECT_URI< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "436" href = "#436" > 436< / 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 = "437" href = "#437" > 437< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "438" href = "#438" > 438< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // How most errors are handled depends on whether or not the request has a valid redirect_uri. In< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "439" href = "#439" > 439< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // order to know that, we need to also validate, fetch and parse the client_id.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "440" href = "#440" > 440< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the request lacks a hash, or if the provided hash was invalid, perform the validation.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "15 tests cover line 441" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "441" href = "#441" > 441< / 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" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > hash_equals< / span > < span class = "keyword" > (< / span > < span class = "default" > hashAuthorizationRequestParameters< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / 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 > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > <
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "442" href = "#442" > 442< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // All we need to know at this stage is whether the redirect_uri is valid. If it< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "443" href = "#443" > 443< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // sufficiently matches the client_id, we don’ t (yet) need to fetch the client_id.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "13 tests cover line 444" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "444" href = "#444" > 444< / 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" > urlComponentsMatch< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > PHP_URL_SCHEME< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > PHP_URL_HOST< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > PHP_URL_PORT< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "445" href = "#445" > 445< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If we do need to fetch the client_id, store the response and effective URL in variables< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "446" href = "#446" > 446< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // we defined earlier, so they’ re available to the approval request code path, which additionally< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "447" href = "#447" > 447< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // needs to parse client_id for h-app markup.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "448" href = "#448" > 448< / 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 = "4 tests cover line 449" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "449" href = "#449" > 449< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > list< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdResponse< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > call_user_func< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > httpGetWithEffectiveUrl< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 450" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "450" href = "#450" > 450< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientIdMf2< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > Mf2< / span > < span class = "default" > \< / span > < span class = "default" > parse< / span > < span class = "keyword" > (< / span > < span class = "default" > (string)< / span > < span class = "default" > < / span > < span class = "default" > $clientIdResponse< / span > < span class = "default" > -> < / span > < span class = "default" > getBody< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "451" href = "#451" > 451< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > catch< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > ClientExceptionInterface< / span > < span class = "default" > < / span > < span class = "keyword" > |< / span > < span class = "default" > < / span > < span class = "default" > RequestExceptionInterface< / span > < span class = "default" > < / span > < span class = "keyword" > |< / span > < span class = "default" > < / span > < span class = "default" > NetworkExceptionInterface< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "452" href = "#452" > 452< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " Caught an HTTP exception while trying to fetch the client_id. Returning an error response." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "453" href = "#453" > 453< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'client_id'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "454" href = "#454" > 454< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exception'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > __toString< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "455" href = "#455" > 455< / 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 = "456" href = "#456" > 456< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "457" href = "#457" > 457< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > HTTP_EXCEPTION_FETCHING_CLIENT_ID< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "458" href = "#458" > 458< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > catch< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > Exception< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "459" href = "#459" > 459< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " Caught an unknown exception while trying to fetch the client_id. Returning an error response." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "460" href = "#460" > 460< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exception'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > __toString< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "461" href = "#461" > 461< / 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 = "462" href = "#462" > 462< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "463" href = "#463" > 463< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INTERNAL_EXCEPTION_FETCHING_CLIENT_ID< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "464" href = "#464" > 464< / 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 = "465" href = "#465" > 465< / 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 = "466" href = "#466" > 466< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Search for all link@rel=redirect_uri at the client_id.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 467" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "467" href = "#467" > 467< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientIdRedirectUris< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 468" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "468" href = "#468" > 468< / 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" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdMf2< / span > < span class = "keyword" > [< / span > < span class = "default" > 'rels'< / 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 = "2 tests cover line 469" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "469" href = "#469" > 469< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientIdRedirectUris< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > array_merge< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdRedirectUris< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdMf2< / span > < span class = "keyword" > [< / span > < span class = "default" > 'rels'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "470" href = "#470" > 470< / 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 = "471" href = "#471" > 471< / 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 = "4 tests cover line 472" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "472" href = "#472" > 472< / 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 = "default" > HeaderParser< / span > < span class = "default" > ::< / span > < span class = "default" > parse< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdResponse< / span > < span class = "default" > -> < / span > < span class = "default" > getHeader< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Link'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > as< / span > < span class = "default" > < / span > < span class = "default" > $link< / 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 473" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "473" href = "#473" > 473< / 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" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > 'rel'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $link< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "default" > mb_strpos< / span > < span class = "keyword" > (< / span > < span class = "string" > " < / span > < span class = "string" > < / span > < span class = "string" > {< / span > < span class = "string" > $link< / span > < span class = "keyword" > [< / span > < span class = "string" > 'rel'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > }< / span > < span class = "string" > < / span > < span class = "string" > " < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > " redirect_uri " < / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > !==< / 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 = " d-flex" > < td class = "col-1 text-right" > < a id = "474" href = "#474" > 474< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Strip off the < > which surround the link URL for some reason.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 475" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "475" href = "#475" > 475< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientIdRedirectUris< / span > < span class = "keyword" > [< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > substr< / span > < span class = "keyword" > (< / span > < span class = "default" > $link< / span > < span class = "keyword" > [< / span > < span class = "default" > 0< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 1< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > strlen< / span > < span class = "keyword" > (< / span > < span class = "default" > $link< / span > < span class = "keyword" > [< / span > < span class = "default" > 0< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > -< / span > < span class = "default" > < / span > < span class = "default" > 2< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "476" href = "#476" > 476< / 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 = "477" href = "#477" > 477< / 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 = "478" href = "#478" > 478< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "479" href = "#479" > 479< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the authority of the redirect_uri does not match the client_id, or exactly match one of their redirect URLs, return an error.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 480" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "480" href = "#480" > 480< / 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" > in_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdRedirectUris< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 481" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "481" href = "#481" > 481< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The provided redirect_uri did not match either the client_id, nor the discovered redirect URIs." < / 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 482" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "482" href = "#482" > 482< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'provided_redirect_uri'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 483" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "483" href = "#483" > 483< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'provided_client_id'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 484" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "484" href = "#484" > 484< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'discovered_redirect_uris'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $clientIdRedirectUris< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "485" href = "#485" > 485< / 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 = "486" href = "#486" > 486< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 487" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "487" href = "#487" > 487< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_REDIRECT_URI< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "488" href = "#488" > 488< / 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 = "489" href = "#489" > 489< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "490" href = "#490" > 490< / 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 = "491" href = "#491" > 491< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "492" href = "#492" > 492< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // From now on, we can assume that redirect_uri is valid. Any IndieAuth-related errors should be< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "493" href = "#493" > 493< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // reported by redirecting to redirect_uri with error parameters.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "494" href = "#494" > 494< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "495" href = "#495" > 495< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Validate the state parameter.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "13 tests cover line 496" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "496" href = "#496" > 496< / 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" > isValidState< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'state'< / 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 497" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "497" href = "#497" > 497< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The state provided in an authorization request was not valid." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 498" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "498" href = "#498" > 498< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_STATE< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "499" href = "#499" > 499< / 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 = "500" href = "#500" > 500< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "501" href = "#501" > 501< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Validate code_challenge parameter.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "13 tests cover line 502" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "502" href = "#502" > 502< / 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" > isValidCodeChallenge< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 503" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "503" href = "#503" > 503< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The code_challenge provided in an authorization request was not valid." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 504" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "504" href = "#504" > 504< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_CODE_CHALLENGE< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "505" href = "#505" > 505< / 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 = "506" href = "#506" > 506< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "507" href = "#507" > 507< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // From now on, any redirect error responses should include the state parameter.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "508" href = "#508" > 508< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // This is handled automatically in `handleException()` and is only noted here< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "509" href = "#509" > 509< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // for reference.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "510" href = "#510" > 510< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "511" href = "#511" > 511< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Validate the scope parameter, if provided.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "13 tests cover line 512" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "512" href = "#512" > 512< / 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" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > & & < / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > isValidScope< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 513" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "513" href = "#513" > 513< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The scope provided in an authorization request was not valid." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 514" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "514" href = "#514" > 514< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_SCOPE< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "515" href = "#515" > 515< / 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 = "516" href = "#516" > 516< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "517" href = "#517" > 517< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Normalise the me parameter, if it exists.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 518" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "518" href = "#518" > 518< / 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" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > 'me'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 519" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "519" href = "#519" > 519< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthClient< / span > < span class = "default" > ::< / span > < span class = "default" > normalizeMeURL< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / 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 = "520" href = "#520" > 520< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the me parameter is not a valid profile URL, ignore it.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 521" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "521" href = "#521" > 521< / 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" > false< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > isProfileUrl< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / 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 522" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "522" href = "#522" > 522< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / 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 = "523" href = "#523" > 523< / 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 = "524" href = "#524" > 524< / 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 = "525" href = "#525" > 525< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "526" href = "#526" > 526< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Build a URL containing the indieauth authorization request parameters, hashing them< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "527" href = "#527" > 527< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // to protect them from being changed.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "528" href = "#528" > 528< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Make a hash of the protected indieauth-specific parameters.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 529" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "529" href = "#529" > 529< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $hash< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > hashAuthorizationRequestParameters< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / 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 = " d-flex" > < td class = "col-1 text-right" > < a id = "530" href = "#530" > 530< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Operate on a copy of $queryParams, otherwise requests will always have a valid hash!< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 531" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "531" href = "#531" > 531< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $redirectQueryParams< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 532" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "532" href = "#532" > 532< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $redirectQueryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $hash< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 533" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "533" href = "#533" > 533< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $authenticationRedirect< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "default" > -> < / span > < span class = "default" > getUri< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > -> < / span > < span class = "default" > withQuery< / span > < span class = "keyword" > (< / span > < span class = "default" > buildQueryString< / span > < span class = "keyword" > (< / span > < span class = "default" > $redirectQueryParams< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > -> < / span > < span class = "default" > __toString< / 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 = "534" href = "#534" > 534< / 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 = "535" href = "#535" > 535< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // User-facing requests always start by calling the authentication request callback.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 536" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "536" href = "#536" > 536< / 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" > 'Calling handle_authentication_request callback'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 537" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "537" href = "#537" > 537< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $authenticationResult< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > call_user_func< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > handleAuthenticationRequestCallback< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $authenticationRedirect< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'me'< / 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 > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "538" href = "#538" > 538< / 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 = "539" href = "#539" > 539< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the authentication handler returned a Response, return that as-is.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "12 tests cover line 540" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "540" href = "#540" > 540< / 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" > $authenticationResult< / span > < span class = "default" > < / span > < span class = "keyword" > instanceof< / span > < span class = "default" > < / span > < span class = "default" > ResponseInterface< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 541" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "541" href = "#541" > 541< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $authenticationResult< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 542" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "542" href = "#542" > 542< / 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 = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $authenticationResult< / 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 = "543" href = "#543" > 543< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check the resulting array for errors.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "10 tests cover line 544" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "544" href = "#544" > 544< / 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" > 'me'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $authenticationResult< / 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 545" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "545" href = "#545" > 545< / 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 handle_authentication_request callback returned an array with no me key.'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'array'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $authenticationResult< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 546" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "546" href = "#546" > 546< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > AUTHENTICATION_CALLBACK_MISSING_ME_PARAM< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "547" href = "#547" > 547< / 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 = "548" href = "#548" > 548< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "549" href = "#549" > 549< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If this is a POST request sent from the authorization (i.e. scope-choosing) form:< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "9 tests cover line 550" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "550" href = "#550" > 550< / 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" > isAuthorizationApprovalRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "551" href = "#551" > 551< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Authorization approval requests MUST include a hash protecting the sensitive IndieAuth< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "552" href = "#552" > 552< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // authorization request parameters from being changed, e.g. by a malicious script which< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "553" href = "#553" > 553< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // found its way onto the authorization form.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 554" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "554" href = "#554" > 554< / 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" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / 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 555" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "555" href = "#555" > 555< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " An authorization approval request did not have a " < / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "default" > < / span > < span class = "keyword" > .< / span > < span class = "default" > < / span > < span class = "default" > " parameter." < / 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 556" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "556" href = "#556" > 556< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > AUTHORIZATION_APPROVAL_REQUEST_MISSING_HASH< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "557" href = "#557" > 557< / 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 = "558" href = "#558" > 558< / 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 559" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "559" href = "#559" > 559< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $expectedHash< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > hashAuthorizationRequestParameters< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / 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 = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 560" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "560" href = "#560" > 560< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > hash_equals< / span > < span class = "keyword" > (< / span > < span class = "default" > $expectedHash< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / 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 561" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "561" href = "#561" > 561< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > " The hash provided in the URL was invalid!" < / 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 562" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "562" href = "#562" > 562< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'expected'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $expectedHash< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 563" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "563" href = "#563" > 563< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'actual'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > self< / span > < span class = "default" > ::< / span > < span class = "default" > HASH_QUERY_STRING_KEY< / span > < span class = "keyword" > ]< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "564" href = "#564" > 564< / 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 = "1 test covers line 565" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "565" href = "#565" > 565< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > AUTHORIZATION_APPROVAL_REQUEST_INVALID_HASH< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "566" href = "#566" > 566< / 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 = "567" href = "#567" > 567< / 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 = "568" href = "#568" > 568< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Assemble the data for the authorization code, store it somewhere persistent.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 569" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "569" href = "#569" > 569< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > array_merge< / span > < span class = "keyword" > (< / span > < span class = "default" > $authenticationResult< / 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 570" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "570" href = "#570" > 570< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'client_id'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 571" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "571" href = "#571" > 571< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'redirect_uri'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 572" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "572" href = "#572" > 572< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'state'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'state'< / 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 573" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "573" href = "#573" > 573< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'code_challenge'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 574" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "574" href = "#574" > 574< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'code_challenge_method'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge_method'< / 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 575" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "575" href = "#575" > 575< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'requested_scope'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > ''< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "576" href = "#576" > 576< / 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 = "577" href = "#577" > 577< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "578" href = "#578" > 578< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Pass it to the auth code customisation callback.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 579" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "579" href = "#579" > 579< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > authorizationForm< / span > < span class = "default" > -> < / span > < span class = "default" > transformAuthorizationCode< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "580" href = "#580" > 580< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "581" href = "#581" > 581< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Store the authorization code.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 582" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "582" href = "#582" > 582< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > tokenStorage< / span > < span class = "default" > -> < / span > < span class = "default" > createAuthCode< / span > < span class = "keyword" > (< / span > < span class = "default" > $code< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 583" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "583" href = "#583" > 583< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "584" href = "#584" > 584< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If saving the authorization code failed silently, there isn’ t much we can do about it,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "585" href = "#585" > 585< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // but should at least log and return an error.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 586" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "586" href = "#586" > 586< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " Saving the authorization code failed and returned false without raising an exception." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 587" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "587" href = "#587" > 587< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INTERNAL_ERROR_REDIRECT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "588" href = "#588" > 588< / 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 = "589" href = "#589" > 589< / 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 = "590" href = "#590" > 590< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Return a redirect to the client app.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 591" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "591" href = "#591" > 591< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 302< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 592" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "592" href = "#592" > 592< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'Location'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > appendQueryParams< / span > < span class = "keyword" > (< / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 593" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "593" href = "#593" > 593< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'code'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 594" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "594" href = "#594" > 594< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'state'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $code< / span > < span class = "keyword" > [< / span > < span class = "default" > 'state'< / span > < span class = "keyword" > ]< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "595" href = "#595" > 595< / 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 = "1 test covers line 596" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "596" href = "#596" > 596< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'Cache-control'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'no-cache'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "597" href = "#597" > 597< / 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 = "598" href = "#598" > 598< / 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 = "599" href = "#599" > 599< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "600" href = "#600" > 600< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Otherwise, the user is authenticated and needs to authorize the client app + choose scopes.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "601" href = "#601" > 601< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "602" href = "#602" > 602< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Fetch the client_id URL to find information about the client to present to the user.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "603" href = "#603" > 603< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: in order to comply with https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "604" href = "#604" > 604< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // it may be necessary to do this before returning any other kind of error response, as, per< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "605" href = "#605" > 605< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // the spec, errors should only be shown to the user if the client_id and redirect_uri parameters< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "606" href = "#606" > 606< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // are missing or invalid. Otherwise, they should be sent back to the client with an error< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "607" href = "#607" > 607< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // redirect response.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 608" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "608" href = "#608" > 608< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdResponse< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdMf2< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "609" href = "#609" > 609< / 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 = "610" href = "#610" > 610< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /** @var ResponseInterface $clientIdResponse */< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 611" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "611" href = "#611" > 611< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > list< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdResponse< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > call_user_func< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > httpGetWithEffectiveUrl< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 612" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "612" href = "#612" > 612< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientIdMf2< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > Mf2< / span > < span class = "default" > \< / span > < span class = "default" > parse< / span > < span class = "keyword" > (< / span > < span class = "default" > (string)< / span > < span class = "default" > < / span > < span class = "default" > $clientIdResponse< / span > < span class = "default" > -> < / span > < span class = "default" > getBody< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientIdEffectiveUrl< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 613" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "613" href = "#613" > 613< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > catch< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > ClientExceptionInterface< / span > < span class = "default" > < / span > < span class = "keyword" > |< / span > < span class = "default" > < / span > < span class = "default" > RequestExceptionInterface< / span > < span class = "default" > < / span > < span class = "keyword" > |< / span > < span class = "default" > < / span > < span class = "default" > NetworkExceptionInterface< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 614" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "614" href = "#614" > 614< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " Caught an HTTP exception while trying to fetch the client_id. Returning an error response." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 615" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "615" href = "#615" > 615< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'client_id'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 616" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "616" href = "#616" > 616< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exception'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > __toString< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "617" href = "#617" > 617< / 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 = "618" href = "#618" > 618< / 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 = "619" href = "#619" > 619< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // At this point in the flow, we’ ve already guaranteed that the redirect_uri is valid,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "620" href = "#620" > 620< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // so in theory we should report these errors by redirecting there.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 621" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "621" href = "#621" > 621< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INTERNAL_ERROR_REDIRECT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 622" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "622" href = "#622" > 622< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > catch< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > Exception< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 623" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "623" href = "#623" > 623< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " Caught an unknown exception while trying to fetch the client_id. Returning an error response." < / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 624" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "624" href = "#624" > 624< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exception'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > __toString< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "625" href = "#625" > 625< / 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 = "626" href = "#626" > 626< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 627" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "627" href = "#627" > 627< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INTERNAL_ERROR_REDIRECT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "628" href = "#628" > 628< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "629" href = "#629" > 629< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "630" href = "#630" > 630< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "631" href = "#631" > 631< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Search for an h-app with u-url matching the client_id.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 632" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "632" href = "#632" > 632< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientHApps< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > M< / span > < span class = "default" > \< / span > < span class = "default" > findMicroformatsByProperty< / span > < span class = "keyword" > (< / span > < span class = "default" > M< / span > < span class = "default" > \< / span > < span class = "default" > findMicroformatsByType< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientIdMf2< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'h-app'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'url'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $queryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 633" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "633" href = "#633" > 633< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $clientHApp< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $clientHApps< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > ?< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "default" > < / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > $clientHApps< / span > < span class = "keyword" > [< / span > < span class = "default" > 0< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "634" href = "#634" > 634< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "635" href = "#635" > 635< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Present the authorization UI.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 636" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "636" href = "#636" > 636< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > authorizationForm< / span > < span class = "default" > -> < / span > < span class = "default" > showForm< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $authenticationResult< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $authenticationRedirect< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $clientHApp< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 637" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "637" href = "#637" > 637< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > -> < / span > < span class = "default" > withAddedHeader< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Cache-control'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'no-cache'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "638" href = "#638" > 638< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "639" href = "#639" > 639< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "640" href = "#640" > 640< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "641" href = "#641" > 641< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the request isn’ t an IndieAuth Authorization or Code-redeeming request, it’ s either an invalid< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "642" href = "#642" > 642< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // request or something to do with a custom auth handler (e.g. sending a one-time code in an email.)< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 643" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "643" href = "#643" > 643< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $nonIndieAuthRequestResult< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > call_user_func< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > handleNonIndieAuthRequest< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 644" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "644" href = "#644" > 644< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $nonIndieAuthRequestResult< / span > < span class = "default" > < / span > < span class = "keyword" > instanceof< / span > < span class = "default" > < / span > < span class = "default" > ResponseInterface< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 645" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "645" href = "#645" > 645< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $nonIndieAuthRequestResult< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "646" href = "#646" > 646< / 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 = "647" href = "#647" > 647< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // In this code path we have not validated the redirect_uri, so show a regular error page< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "648" href = "#648" > 648< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // rather than returning a redirect error.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 649" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "649" href = "#649" > 649< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INTERNAL_ERROR< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "650" href = "#650" > 650< / 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 651" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "651" href = "#651" > 651< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / 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 = "652" href = "#652" > 652< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // All IndieAuthExceptions will already have been logged.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 653" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "653" href = "#653" > 653< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > handleException< / span > < span class = "keyword" > (< / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 654" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "654" href = "#654" > 654< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "default" > < / span > < span class = "keyword" > catch< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > Exception< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "655" href = "#655" > 655< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Unknown exceptions will not have been logged; do so now.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 656" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "656" href = "#656" > 656< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "string" > " < / span > < span class = "string" > Caught unknown exception: < / span > < span class = "string" > {< / span > < span class = "string" > $e< / span > < span class = "keyword" > }< / span > < span class = "string" > " < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 657" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "657" href = "#657" > 657< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > handleException< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > 0< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "658" href = "#658" > 658< / 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 = "18 tests cover line 659" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testUnauthenticatedRequestReturnsAuthenticationResponse</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdSufficientlyMatchesRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkHeaderRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsAuthorizationFormIfClientIdExactlyMatchesParsedLinkElementRedirectUri</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testFindsFirstHAppExactlyMatchingClientId</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testValidApprovalRequestIsHandledCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testResponseReturnedFromNonIndieAuthRequestHandler</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "659" href = "#659" > 659< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < span class = "default" > < / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "660" href = "#660" > 660< / 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 = "661" href = "#661" > 661< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "662" href = "#662" > 662< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "663" href = "#663" > 663< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Handle Token Endpoint Request< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "664" href = "#664" > 664< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "665" href = "#665" > 665< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Handles requests to the IndieAuth token endpoint. The logical flow can be summarised as follows:< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "666" href = "#666" > 666< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "667" href = "#667" > 667< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Check that the request is a code redeeming request. Return an error if not.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "668" href = "#668" > 668< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Ensure that all required parameters are present. Return an error if not.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "669" href = "#669" > 669< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Attempt to exchange the `code` parameter for an access token. Return an error if it fails.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "670" href = "#670" > 670< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Make sure the client_id and redirect_uri request parameters match those stored in the auth code. If not, revoke the access token and return an error.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "671" href = "#671" > 671< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Make sure the provided code_verifier hashes to the code_challenge stored in the auth code. If not, revoke the access token and return an error.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "672" href = "#672" > 672< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Make sure the granted scope stored in the auth code is not empty. If it is, revoke the access token and return an error.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "673" href = "#673" > 673< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * * Otherwise, return a success response containing information about the issued access token.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "674" href = "#674" > 674< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "675" href = "#675" > 675< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * This method must NOT be CSRF-protected as it accepts external requests from client apps.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "676" href = "#676" > 676< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "677" href = "#677" > 677< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @param ServerRequestInterface $request< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "678" href = "#678" > 678< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @return ResponseInterface< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "679" href = "#679" > 679< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "680" href = "#680" > 680< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > handleTokenEndpointRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > ServerRequestInterface< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > ResponseInterface< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 681" 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::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "681" href = "#681" > 681< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > isIndieAuthAuthorizationCodeRedeemingRequest< / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "4 tests cover line 682" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "682" href = "#682" > 682< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > info< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Handling a request to redeem an authorization code for profile information.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "683" href = "#683" > 683< / 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 = "4 tests cover line 684" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "684" href = "#684" > 684< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "default" > -> < / span > < span class = "default" > getParsedBody< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "685" href = "#685" > 685< / 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 686" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "686" href = "#686" > 686< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > isset< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 687" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "687" href = "#687" > 687< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > 'The exchange request was missing the code parameter. Returning an error response.'< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 688" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "688" href = "#688" > 688< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 689" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorsIfParametersAreMissing</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "689" href = "#689" > 689< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'invalid_request'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "690" href = "#690" > 690< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'The code parameter was missing.'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "691" href = "#691" > 691< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "692" href = "#692" > 692< / 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 = "693" href = "#693" > 693< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "694" href = "#694" > 694< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Attempt to internally exchange the provided auth code for an access token.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "695" href = "#695" > 695< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // We do this before anything else so that the auth code is invalidated as soon as the request starts,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "696" href = "#696" > 696< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // and the resulting access token is revoked if we encounter an error. This ends up providing a simpler< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "697" href = "#697" > 697< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // and more flexible interface for TokenStorage implementors.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "698" href = "#698" > 698< / 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 = "699" href = "#699" > 699< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Call the token exchange method, passing in a callback which performs additional validation< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "700" href = "#700" > 700< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // on the auth code before it gets exchanged.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 701" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "701" href = "#701" > 701< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $tokenData< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > tokenStorage< / span > < span class = "default" > -> < / span > < span class = "default" > exchangeAuthCodeForAccessToken< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > array< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $request< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "702" href = "#702" > 702< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Verify that all required parameters are included.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 703" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "703" href = "#703" > 703< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $requiredParameters< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'code_verifier'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 704" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "704" href = "#704" > 704< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > array_filter< / span > < span class = "keyword" > (< / span > < span class = "default" > $requiredParameters< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $p< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 705" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "705" href = "#705" > 705< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > array_key_exists< / span > < span class = "keyword" > (< / span > < span class = "default" > $p< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > $p< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 706" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "706" href = "#706" > 706< / 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 = "3 tests cover line 707" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "707" href = "#707" > 707< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "708" href = "#708" > 708< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > warning< / span > < span class = "keyword" > (< / span > < span class = "default" > 'The exchange request was missing required parameters. Returning an error response.'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'missing'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $missingRequiredParameters< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "danger d-flex" > < td class = "col-1 text-right" > < a id = "709" href = "#709" > 709< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_REQUEST< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "710" href = "#710" > 710< / 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 = "711" href = "#711" > 711< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "712" href = "#712" > 712< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Verify that it was issued for the same client_id and redirect_uri< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 713" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "713" href = "#713" > 713< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'client_id'< / span > < span class = "keyword" > ]< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 714" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "714" href = "#714" > 714< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > ||< / span > < span class = "default" > < / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 715" 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 = "715" href = "#715" > 715< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " The provided client_id and/or redirect_uri did not match those stored in the token." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 716" 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 = "716" href = "#716" > 716< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "717" href = "#717" > 717< / 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 = "718" href = "#718" > 718< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "719" href = "#719" > 719< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that the supplied code_verifier hashes to the stored code_challenge< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "720" href = "#720" > 720< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: support method = plain as well as S256.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "3 tests cover line 721" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "721" href = "#721" > 721< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > hash_equals< / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > generatePKCECodeChallenge< / span > < span class = "keyword" > (< / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_verifier'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 722" 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 = "722" href = "#722" > 722< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " The provided code_verifier did not hash to the stored code_challenge" < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 723" 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 = "723" href = "#723" > 723< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "724" href = "#724" > 724< / 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 = "725" href = "#725" > 725< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "726" href = "#726" > 726< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Check that scope is not empty.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 727" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "727" href = "#727" > 727< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > empty< / span > < span class = "keyword" > (< / span > < span class = "default" > $authCode< / span > < span class = "keyword" > [< / span > < span class = "default" > 'scope'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 728" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "728" href = "#728" > 728< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > " An exchange request for a token with an empty scope was sent to the token endpoint." < / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 729" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "729" href = "#729" > 729< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > throw< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > create< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_GRANT< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $request< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "730" href = "#730" > 730< / 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 = "3 tests cover line 731" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "731" href = "#731" > 731< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 732" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "732" href = "#732" > 732< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "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 = "733" href = "#733" > 733< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If an exception was thrown, return a corresponding error response.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 734" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "734" href = "#734" > 734< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 735" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "735" href = "#735" > 735< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > getInfo< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > [< / span > < span class = "default" > 'error'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 736" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorIfAccessCodeGrantsNoScopes</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "736" href = "#736" > 736< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $e< / span > < span class = "default" > -> < / span > < span class = "default" > getMessage< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "737" href = "#737" > 737< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "738" href = "#738" > 738< / 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 = "739" href = "#739" > 739< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "2 tests cover line 740" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testExchangeFlowsReturnErrorOnInvalidParameters</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsAccessTokenOnValidRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "740" href = "#740" > 740< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $tokenData< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 741" 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 = "741" href = "#741" > 741< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > logger< / span > < span class = "default" > -> < / span > < span class = "default" > error< / span > < span class = "keyword" > (< / span > < span class = "default" > 'Attempting to exchange an auth code for a token resulted in null.'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $bodyParams< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 742" 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 = "742" href = "#742" > 742< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 743" 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 = "743" href = "#743" > 743< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'invalid_grant'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "744" href = "#744" > 744< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'The provided credentials were not valid.'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "745" href = "#745" > 745< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "746" href = "#746" > 746< / 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 = "747" href = "#747" > 747< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "748" href = "#748" > 748< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // TODO: return an error if the token doesn’ t contain a me key.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "749" href = "#749" > 749< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "750" href = "#750" > 750< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If everything checked out, return {" me" : " https://example.com" } response< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 751" 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 = "751" href = "#751" > 751< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 200< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 752" 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 = "752" href = "#752" > 752< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "753" href = "#753" > 753< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'cache-control'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'no-store'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 754" 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 = "754" href = "#754" > 754< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "default" > array_merge< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "755" href = "#755" > 755< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Ensure that the token_type key is present, if tokenStorage doesn’ t include it.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 756" 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 = "756" href = "#756" > 756< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'token_type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'Bearer'< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 757" 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 = "757" href = "#757" > 757< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > array_filter< / span > < span class = "keyword" > (< / span > < span class = "default" > $tokenData< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $k< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "758" href = "#758" > 758< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // We should be able to trust the return data from tokenStorage, but there’ s no harm in< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "759" href = "#759" > 759< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // preventing code_challenges from leaking, per OAuth2.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 760" 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 = "760" href = "#760" > 760< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > !< / span > < span class = "default" > in_array< / span > < span class = "keyword" > (< / span > < span class = "default" > $k< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'code_challenge'< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > 'code_challenge_method'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 761" 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 = "761" href = "#761" > 761< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > ARRAY_FILTER_USE_KEY< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "762" href = "#762" > 762< / 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 = "763" href = "#763" > 763< / 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 764" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "764" href = "#764" > 764< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > 400< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'application/json'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > json_encode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "1 test covers line 765" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testTokenEndpointReturnsErrorOnNonIndieauthRequest</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "765" href = "#765" > 765< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'invalid_request'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "766" href = "#766" > 766< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'Request to token endpoint was not a valid code exchange request.'< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "767" href = "#767" > 767< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "768" href = "#768" > 768< / 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 = "769" href = "#769" > 769< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "770" href = "#770" > 770< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "771" href = "#771" > 771< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Handle Exception< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "772" href = "#772" > 772< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "773" href = "#773" > 773< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * Turns an instance of `IndieAuthException` into an appropriate instance of `ResponseInterface`.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "774" href = "#774" > 774< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "775" href = "#775" > 775< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > handleException< / span > < span class = "keyword" > (< / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > ResponseInterface< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "11 tests cover line 776" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "776" href = "#776" > 776< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $exceptionData< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getInfo< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "777" href = "#777" > 777< / 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 778" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "778" href = "#778" > 778< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $exceptionData< / span > < span class = "keyword" > [< / span > < span class = "default" > 'statusCode'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ==< / span > < span class = "default" > < / span > < span class = "default" > 302< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "779" href = "#779" > 779< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // This exception is handled by redirecting to the redirect_uri with error parameters.< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "780" href = "#780" > 780< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $redirectQueryParams< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 781" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "781" href = "#781" > 781< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $exceptionData< / span > < span class = "keyword" > [< / span > < span class = "default" > 'error'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "default" > ??< / span > < span class = "default" > < / span > < span class = "default" > 'invalid_request'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 782" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "782" href = "#782" > 782< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'error_description'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > (string)< / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "783" href = "#783" > 783< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "784" href = "#784" > 784< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "785" href = "#785" > 785< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If the state parameter was valid, include it in the error redirect.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 786" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "786" href = "#786" > 786< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getCode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "default" > !==< / span > < span class = "default" > < / span > < span class = "default" > IndieAuthException< / span > < span class = "default" > ::< / span > < span class = "default" > INVALID_STATE< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 787" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "787" href = "#787" > 787< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $redirectQueryParams< / span > < span class = "keyword" > [< / span > < span class = "default" > 'state'< / span > < span class = "keyword" > ]< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getRequest< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > -> < / span > < span class = "default" > getQueryParams< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > [< / span > < span class = "default" > 'state'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "788" href = "#788" > 788< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "789" href = "#789" > 789< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 790" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "790" href = "#790" > 790< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > $exceptionData< / span > < span class = "keyword" > [< / span > < span class = "default" > 'statusCode'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "6 tests cover line 791" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testInvalidStateCodeChallengeOrScopeReturnErrorRedirects</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsServerErrorIfAuthenticationResultHasNoMeKey</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnErrorIfFetchingClientIdThrowsException</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasNoHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfApprovalRequestHasInvalidHash</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsInternalServerErrorIfAuthCodeCannotBeStored</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "791" href = "#791" > 791< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'Location'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > appendQueryParams< / span > < span class = "keyword" > (< / span > < span class = "default" > (string)< / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getRequest< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "default" > -> < / span > < span class = "default" > getQueryParams< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > [< / span > < span class = "default" > 'redirect_uri'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > $redirectQueryParams< / span > < span class = "keyword" > )< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "792" href = "#792" > 792< / 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 = "793" href = "#793" > 793< / 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 = "794" href = "#794" > 794< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // This exception should be shown to the user.< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 795" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "795" href = "#795" > 795< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > Response< / span > < span class = "keyword" > (< / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getStatusCode< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < span class = "default" > 'content-type'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'text/html'< / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "default" > renderTemplate< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > exceptionTemplatePath< / span > < span class = "keyword" > ,< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 796" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "796" href = "#796" > 796< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'request'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < span class = "default" > -> < / span > < span class = "default" > getRequest< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-title = "5 tests cover line 797" data-content = "<ul><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testAuthorizationRequestWithInvalidClientIdOrRedirectUriShowsErrorToUser</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testHandlesValidAndInvalidMeUrlsCorrectly</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdWithNoParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testReturnsErrorIfRedirectUriDoesntMatchClientIdOrParsedRedirectUris</li><li class="covered-by-large-tests">Taproot\IndieAuth\Test\ServerTest::testNonIndieAuthRequestWithDefaultHandlerReturnsError</li></ul>" data-placement = "top" data-html = "true" class = "col-1 text-right" > < a id = "797" href = "#797" > 797< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'exception'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $exception< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "798" href = "#798" > 798< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-right" > < a id = "799" href = "#799" > 799< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = "warning d-flex" > < td class = "col-1 text-right" > < a id = "800" href = "#800" > 800< / 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 = "801" href = "#801" > 801< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > }< / span > < / td > < / tr >
< / tbody >
< / table >
< footer >
< hr / >
< 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 >
2021-06-14 22:53:15 +01:00
< 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 Mon Jun 14 21:52:39 UTC 2021.< / small >
2021-06-13 14:35:07 +01:00
< / 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 >
< / a >
< / footer >
< / div >
2021-06-13 14:47:54 +01:00
< script src = "phpunit_js/jquery.min.js" type = "text/javascript" > < / script >
< script src = "phpunit_js/popper.min.js" type = "text/javascript" > < / script >
< script src = "phpunit_js/bootstrap.min.js" type = "text/javascript" > < / script >
< script src = "phpunit_js/file.js" type = "text/javascript" > < / script >
2021-06-13 14:35:07 +01:00
< / body >
< / html >