diff options
Diffstat (limited to 'controllers')
| -rw-r--r-- | controllers/auth.php | 46 | ||||
| -rw-r--r-- | controllers/controllers.php | 8 | ||||
| -rw-r--r-- | controllers/static.php | 8 | 
3 files changed, 33 insertions, 29 deletions
diff --git a/controllers/auth.php b/controllers/auth.php index e6a2d24..d812956 100644 --- a/controllers/auth.php +++ b/controllers/auth.php @@ -31,9 +31,11 @@ $app->get('/auth/start', function() use($app) {    $_SESSION['attempted_me'] = $me; -  $authorizationEndpoint = IndieAuth\Client::discoverAuthorizationEndpoint($me); -  $tokenEndpoint = IndieAuth\Client::discoverTokenEndpoint($me); -  $micropubEndpoint = IndieAuth\Client::discoverMicropubEndpoint($me); +  $_SESSION['indieauth'] = [ +    'authorization_endpoint' => ($authorizationEndpoint=IndieAuth\Client::discoverAuthorizationEndpoint($me)), +    'token_endpoint' => ($tokenEndpoint=IndieAuth\Client::discoverTokenEndpoint($me)), +    'micropub_endpoint' => ($micropubEndpoint=IndieAuth\Client::discoverMicropubEndpoint($me)), +  ];    $defaultScope = 'create update media'; @@ -74,16 +76,6 @@ $app->get('/auth/start', function() use($app) {    } else { -    if(!$user) -      $user = ORM::for_table('users')->create(); -    $user->url = $me; -    $user->date_created = date('Y-m-d H:i:s'); -    $user->micropub_endpoint = $micropubEndpoint; -    $user->authorization_endpoint = $authorizationEndpoint; -    $user->token_endpoint = $tokenEndpoint; -    $user->micropub_access_token = ''; // blank out the access token if they attempt to sign in again -    $user->save(); -      if(k($params, 'dontask') && $params['dontask']) {        // Request whatever scope was previously granted        $authorizationURL = parse_url($authorizationURL); @@ -131,7 +123,12 @@ $app->get('/auth/callback', function() use($app) {    // If there is no state in the session, start the login again    if(!array_key_exists('auth_state', $_SESSION)) { -    $app->redirect('/?error=missing_session_state'); +    $html = render('auth_error', array( +      'title' => 'Auth Callback', +      'error' => 'Missing session state', +      'errorDescription' => 'Something went wrong, please try signing in again, and make sure cookies are enabled for this domain.' +    )); +    $app->response()->body($html);      return;    } @@ -182,12 +179,11 @@ $app->get('/auth/callback', function() use($app) {    // An authorization code is in the query string, and we want to exchange that for an access token at the token endpoint.    // Discover the endpoints -  $micropubEndpoint = IndieAuth\Client::discoverMicropubEndpoint($me); -  $tokenEndpoint = IndieAuth\Client::discoverTokenEndpoint($me); +  $micropubEndpoint = $_SESSION['indieauth']['micropub_endpoint']; +  $tokenEndpoint = $_SESSION['indieauth']['token_endpoint'];    if($tokenEndpoint) { -    $token = IndieAuth\Client::getAccessToken($tokenEndpoint, $params['code'], $me, buildRedirectURI(), Config::$base_url, k($params,'state'), true); - +    $token = IndieAuth\Client::getAccessToken($tokenEndpoint, $params['code'], $me, buildRedirectURI(), Config::$base_url, true);    } else {      $token = array('auth'=>false, 'response'=>false);    } @@ -197,11 +193,11 @@ $app->get('/auth/callback', function() use($app) {    // If a valid access token was returned, store the token info in the session and they are signed in    if(k($token['auth'], array('me','access_token','scope'))) {      // Double check that the domain of the returned "me" matches the expected -    if(parse_url($token['auth']['me'], PHP_URL_HOST) != parse_url($me, PHP_URL_HOST)) { +    if(!\p3k\url\host_matches($token['auth']['me'], $me)) {        $html = render('auth_error', [          'title' => 'Error Signing In',          'error' => 'Invalid user', -        'errorDescription' => 'The user URL that was returned in the access token did not match the domain of the user signing in.' +        'errorDescription' => 'The user URL that was returned from the token endpoint (<code>'.$token['auth']['me'].'</code>) did not match the domain of the user signing in (<code>'.$me.'</code>).'        ]);        $app->response()->body($html);        return; @@ -223,6 +219,8 @@ $app->get('/auth/callback', function() use($app) {        $user->url = $me;        $user->date_created = date('Y-m-d H:i:s');      } +    $user->authorization_endpoint = $_SESSION['indieauth']['authorization_endpoint']; +    $user->token_endpoint = $tokenEndpoint;      $user->micropub_endpoint = $micropubEndpoint;      $user->micropub_access_token = $token['auth']['access_token'];      $user->micropub_scope = $token['auth']['scope']; @@ -237,6 +235,7 @@ $app->get('/auth/callback', function() use($app) {    unset($_SESSION['auth_state']);    unset($_SESSION['attempted_me']); +  unset($_SESSION['indieauth']);    if($redirectToDashboardImmediately || k($_SESSION, 'dontask')) {      unset($_SESSION['dontask']); @@ -253,6 +252,11 @@ $app->get('/auth/callback', function() use($app) {        $app->redirect('/new?' . http_build_query($query), 302);      }    } else { +    $tokenResponse = $token['response']; +    $parsed = @json_decode($tokenResponse); +    if($parsed) +      $tokenResponse = json_encode($parsed, JSON_PRETTY_PRINT+JSON_UNESCAPED_SLASHES); +      $html = render('auth_callback', array(        'title' => 'Sign In',        'me' => $me, @@ -260,7 +264,7 @@ $app->get('/auth/callback', function() use($app) {        'meParts' => parse_url($me),        'tokenEndpoint' => $tokenEndpoint,        'auth' => $token['auth'], -      'response' => $token['response'], +      'response' => $tokenResponse,        'curl_error' => (array_key_exists('error', $token) ? $token['error'] : false),        'destination' => (k($_SESSION, 'redirect_after_login') ?: '/new')      )); diff --git a/controllers/controllers.php b/controllers/controllers.php index 237c4bb..cc74674 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -724,7 +724,7 @@ $app->get('/code', function() use($app) {        'nginx' => ['conf'],        'apache' => [],        'text' => ['txt'], -    ];  +    ];      ksort($languages);      $language_map = [];      foreach($languages as $lang=>$exts) { @@ -989,18 +989,18 @@ $app->get('/edit', function() use($app) {          'error' => 'There was a problem!',          'error_description' => $error        ]); -      return;       +      return;      }      // Until all interfaces are complete, show an error here for unsupported ones -    if(!in_array($url, ['/favorite','/repost'])) { +    if(!in_array($url, ['/favorite','/repost','/code'])) {        render('edit/error', [          'title' => 'Not Yet Supported',          'summary' => '',          'error' => 'Not Yet Supported',          'error_description' => 'Editing is not yet supported for this type of post.'        ]); -      return;       +      return;      }      $app->redirect($url . '?edit=' . $params['url'], 302); diff --git a/controllers/static.php b/controllers/static.php index 9822d6b..8c4425d 100644 --- a/controllers/static.php +++ b/controllers/static.php @@ -11,7 +11,7 @@ function doc_pages($page=null) {      'syndication' => 'Syndication',      'post-status' => 'Post Status',    ]; -  if($page == null)  +  if($page == null)      return $pages;    else      return $pages[$page]; @@ -28,7 +28,7 @@ $app->get('/', function($format='html') use($app) {    render('index', array(      'title' => 'Quill',      'meta' => '', -    'authorizing' => false +    'authorizing' => false,    ));  }); @@ -42,7 +42,7 @@ $app->get('/creating-a-micropub-endpoint', function() use($app) {  $app->get('/docs', function() use($app) {    render('docs/index', array( -    'title' => 'Documentation',  +    'title' => 'Documentation',      'authorizing' => false,      'pages' => doc_pages()    )); @@ -51,7 +51,7 @@ $app->get('/docs', function() use($app) {  $app->get('/docs/:page', function($page) use($app) {    if(file_exists('views/docs/'.$page.'.php'))      render('docs/'.$page, array( -      'title' => doc_pages($page).' - Quill Documentation',  +      'title' => doc_pages($page).' - Quill Documentation',        'authorizing' => false      ));    else  | 
