diff options
Diffstat (limited to 'controllers')
-rw-r--r-- | controllers/auth.php | 30 | ||||
-rw-r--r-- | controllers/controllers.php | 155 | ||||
-rw-r--r-- | controllers/micropub.php | 13 |
3 files changed, 176 insertions, 22 deletions
diff --git a/controllers/auth.php b/controllers/auth.php index de6c8c5..50fd15b 100644 --- a/controllers/auth.php +++ b/controllers/auth.php @@ -9,13 +9,14 @@ $app->get('/auth/start', function() use($app) { $params = $req->params(); - $defaultScope = 'create update media'; + $defaultScope = 'create update media profile'; list($authorizationURL, $error) = IndieAuth\Client::begin($params['me'], $defaultScope); + $me = IndieAuth\Client::normalizeMeURL($params['me']); + // Double check for a micropub endpoint here for debugging purposes if(!$error) { - $me = $_SESSION['indieauth_url']; // set by IndieAuth\Client::begin(), will be the normalized and resolved URL $micropubEndpoint = $_SESSION['indieauth']['micropub_endpoint'] = IndieAuth\Client::discoverMicropubEndpoint($me); if(!$micropubEndpoint) { $error['error'] = 'missing_micropub_endpoint'; @@ -25,7 +26,6 @@ $app->get('/auth/start', function() use($app) { if($error && in_array($error['error'], ['missing_authorization_endpoint','missing_token_endpoint','missing_micropub_endpoint'])) { // Display debug info for these particular errors - $me = $_SESSION['indieauth_url']; // set by IndieAuth\Client::begin(), will be the normalized and resolved URL $micropubEndpoint = $_SESSION['indieauth']['micropub_endpoint'] = IndieAuth\Client::discoverMicropubEndpoint($me); $tokenEndpoint = $_SESSION['indieauth']['token_endpoint'] = IndieAuth\Client::discoverTokenEndpoint($me); $authorizationEndpoint = $_SESSION['indieauth']['authorization_endpoint'] = IndieAuth\Client::discoverAuthorizationEndpoint($me); @@ -55,7 +55,6 @@ $app->get('/auth/start', function() use($app) { return; } - $me = $_SESSION['indieauth_url']; // set by IndieAuth\Client::begin(), will be the normalized and resolved URL $micropubEndpoint = $_SESSION['indieauth']['micropub_endpoint'] = IndieAuth\Client::discoverMicropubEndpoint($me); $tokenEndpoint = $_SESSION['indieauth']['token_endpoint'] = IndieAuth\Client::discoverTokenEndpoint($me); $authorizationEndpoint = $_SESSION['indieauth']['authorization_endpoint'] = IndieAuth\Client::discoverAuthorizationEndpoint($me); @@ -70,7 +69,7 @@ $app->get('/auth/start', function() use($app) { // If the user has already signed in before and has a micropub access token, // and the endpoints are all the same, skip the debugging screens and redirect // immediately to the auth endpoint. - // This will still generate a new access token when they finish logging in. + // This will still get a new access token when they finish logging in. $user = ORM::for_table('users')->where('url', $me)->find_one(); if($user && $user->micropub_access_token && $user->micropub_endpoint == $micropubEndpoint @@ -155,10 +154,10 @@ $app->get('/auth/callback', function() use($app) { $redirectToDashboardImmediately = false; // 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'))) { + if(k($token['response'], array('me','access_token','scope'))) { - $_SESSION['auth'] = $token['auth']; - $_SESSION['me'] = $me = $token['auth']['me']; + $_SESSION['auth'] = $token['response']; + $_SESSION['me'] = $me = $token['me']; $user = ORM::for_table('users')->where('url', $me)->find_one(); if($user) { @@ -176,9 +175,9 @@ $app->get('/auth/callback', function() use($app) { $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']; - $user->micropub_response = $token['response']; + $user->micropub_access_token = $token['response']['access_token']; + $user->micropub_scope = $token['response']['scope']; + $user->micropub_response = $token['raw_response']; $user->save(); $_SESSION['user_id'] = $user->id(); @@ -204,19 +203,14 @@ $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, 'authorizing' => $me, 'meParts' => parse_url($me), 'tokenEndpoint' => $tokenEndpoint, - 'auth' => $token['auth'], - 'response' => $tokenResponse, + 'auth' => $token['response'], + 'response' => $token['raw_response'], '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 df8ddfd..7b7234c 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -86,9 +86,17 @@ $app->get('/new/last-photo.json', function() use($app) { if($user->micropub_media_endpoint) { // Request the last file uploaded from the media endpoint - $response = micropub_get($user->micropub_media_endpoint, ['q'=>'last'], $user->micropub_access_token); - if(isset($response['data']['url'])) { - $url = $response['data']['url']; + $response = micropub_get($user->micropub_media_endpoint, ['q'=>'source', 'limit'=>1], $user->micropub_access_token); + if(isset($response['data']['items'])) { + $items = $response['data']['items']; + if(isset($items[0])) { + $item = $items[0]; + // Only show the file if it was uploaded in the last 5 minutes or if no published date available + $show = !isset($item['published']) || (strtotime($item['published']) >= (time()-300)); + if($show && isset($item['url'])) { + $url = $item['url']; + } + } } } @@ -182,8 +190,11 @@ $app->get('/event', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); + $channels = $user->channels ? json_decode($user->channels, true) : []; + render('event', array( 'title' => 'Event', + 'channels' => $channels, 'authorizing' => false )); } @@ -223,6 +234,24 @@ $app->get('/review', function() use($app) { } }); + +$app->get('/twitter', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $tweet_url = ''; + + if(array_key_exists('tweet_url', $params)) + $tweet_url = $params['tweet_url']; + + render('twitter', array( + 'title' => 'Import Tweet', + 'tweet_url' => $tweet_url, + 'authorizing' => false + )); + } +}); + $app->get('/repost', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); @@ -362,6 +391,7 @@ $app->get('/settings', function() use($app) { 'title' => 'Settings', 'user' => $user, 'syndication_targets' => json_decode($user->syndication_targets, true), + 'channels' => json_decode($user->channels, true), 'authorizing' => false ]); } @@ -413,6 +443,101 @@ $app->get('/settings/html-content', function() use($app) { } }); +$app->post('/twitter/preview', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + if($user->twitter_access_token) { + $xray_opts['twitter_api_key'] = Config::$twitterClientID; + $xray_opts['twitter_api_secret'] = Config::$twitterClientSecret; + $xray_opts['twitter_access_token'] = $user->twitter_access_token; + $xray_opts['twitter_access_token_secret'] = $user->twitter_token_secret; + } + + $tweet_url = $params['tweet_url']; + + // Pass to X-Ray to download all the twitter data in a useful format + $xray = new p3k\XRay(); + $xray->http = new p3k\HTTP('Quill ('.Config::$base_url.')'); + $data = $xray->parse($tweet_url, $xray_opts); + + $postdata = tweet_to_micropub_request($data['data']); + + $response = [ + 'json' => json_encode($postdata, JSON_PRETTY_PRINT+JSON_UNESCAPED_SLASHES) + ]; + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode($response)); + } +}); + +$app->post('/twitter', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + if($user->twitter_access_token) { + $xray_opts['twitter_api_key'] = Config::$twitterClientID; + $xray_opts['twitter_api_secret'] = Config::$twitterClientSecret; + $xray_opts['twitter_access_token'] = $user->twitter_access_token; + $xray_opts['twitter_access_token_secret'] = $user->twitter_token_secret; + } + + $tweet_url = $params['tweet_url']; + + // Pass to X-Ray to download all the twitter data in a useful format + $xray = new p3k\XRay(); + $xray->http = new p3k\HTTP('Quill ('.Config::$base_url.')'); + $data = $xray->parse($tweet_url, $xray_opts); + + $location = null; + + if(isset($data['data']) && $data['data']['type'] == 'entry') { + $tweet = $data['data']; + + $postdata = tweet_to_micropub_request($tweet); + + $r = micropub_post_for_user($user, $postdata, null, true); + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode([ + 'location' => (isset($r['location']) && $r['location'] ? Mf2\resolveUrl($user->micropub_endpoint, $r['location']) : null), + 'error' => $r['error'], + 'response' => $r['response'] + ])); + } else { + $app->response()['Content-type'] = 'application/json'; + + $app->response()->body(json_encode([ + 'location' => null, + 'error' => 'Error fetching tweet', + ])); + } + } +}); + +function tweet_to_micropub_request($tweet) { + // Convert to a micropub post + $postdata = [ + 'type' => ['h-entry'], + 'properties' => [ + 'content' => [$tweet['content']['text']], + 'published' => [$tweet['published']], + 'syndication' => [$tweet['url']], + ] + ]; + if(isset($tweet['in-reply-to'])) + $postdata['properties']['in-reply-to'] = $tweet['in-reply-to']; + if(isset($tweet['category'])) + $postdata['properties']['category'] = $tweet['category']; + if(isset($tweet['photo'])) + $postdata['properties']['photo'] = $tweet['photo']; + if(isset($tweet['video'])) + $postdata['properties']['video'] = $tweet['video']; + + return $postdata; +} + function create_favorite(&$user, $url) { $tweet_id = false; @@ -890,6 +1015,30 @@ $app->get('/airport-info', function() use($app){ } }); +$app->get('/map-img', function() use($app) { + + $params = $app->request()->params(); + + $app->response()['Content-type'] = 'image/png'; + + $params = [ + 'marker[]' => 'lat:'.$params['lat'].';lng:'.$params['lng'].';icon:small-blue-cutout', + 'basemap' => 'custom', + 'width' => $params['w'], + 'height' => $params['h'], + 'zoom' => $params['z'], + 'attribution' => 'mapbox', + 'tileurl' => Config::$mapTileURL, + 'token' => Config::$atlasToken, + ]; + + $ch = curl_init('https://atlas.p3k.io/map/img'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); + curl_exec($ch); + +}); + function create_weight(&$user, $weight_num, $weight_unit) { $micropub_request = array( 'type' => ['h-entry'], diff --git a/controllers/micropub.php b/controllers/micropub.php index fa8e477..cc1ca02 100644 --- a/controllers/micropub.php +++ b/controllers/micropub.php @@ -2,7 +2,7 @@ $app->get('/micropub/syndications', function() use($app) { if($user=require_login($app)) { - $data = get_micropub_config($user); + $data = get_micropub_config($user, ['q'=>'config']); $app->response()['Content-type'] = 'application/json'; $app->response()->body(json_encode(array( 'targets' => $data['targets'], @@ -11,6 +11,17 @@ $app->get('/micropub/syndications', function() use($app) { } }); +$app->get('/micropub/channels', function() use($app) { + if($user=require_login($app)) { + $data = get_micropub_config($user, ['q'=>'config']); + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode(array( + 'channels' => $data['channels'], + 'response' => $data['response'] + ))); + } +}); + $app->post('/micropub/post', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); |