diff options
Diffstat (limited to 'controllers')
-rw-r--r-- | controllers/auth.php | 134 | ||||
-rw-r--r-- | controllers/controllers.php | 197 |
2 files changed, 149 insertions, 182 deletions
diff --git a/controllers/auth.php b/controllers/auth.php index de6c8c5..9dcc81d 100644 --- a/controllers/auth.php +++ b/controllers/auth.php @@ -1,5 +1,4 @@ <?php -use Abraham\TwitterOAuth\TwitterOAuth; IndieAuth\Client::$clientID = Config::$base_url; IndieAuth\Client::$redirectURL = Config::$base_url.'auth/callback'; @@ -9,13 +8,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 +25,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 +54,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 +68,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 +153,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 +174,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 +202,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') )); @@ -255,107 +248,4 @@ $app->post('/auth/reset', function() use($app) { $app->redirect('/', 302); }); -$app->post('/auth/twitter', function() use($app) { - if(!Config::$twitterClientID) { - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'error' - ))); - return; - } - - if($user=require_login($app, false)) { - $params = $app->request()->params(); - // User just auth'd with twitter, store the access token - $user->twitter_access_token = $params['twitter_token']; - $user->twitter_token_secret = $params['twitter_secret']; - $user->save(); - - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'ok' - ))); - } else { - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'error' - ))); - } -}); - -function getTwitterLoginURL(&$twitter) { - $request_token = $twitter->oauth('oauth/request_token', [ - 'oauth_callback' => Config::$base_url . 'auth/twitter/callback' - ]); - $_SESSION['twitter_auth'] = $request_token; - return $twitter->url('oauth/authorize', ['oauth_token' => $request_token['oauth_token']]); -} - -$app->get('/auth/twitter', function() use($app) { - if(!Config::$twitterClientID) { - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'error' - ))); - return; - } - - $params = $app->request()->params(); - if($user=require_login($app, false)) { - - // If there is an existing Twitter token, check if it is valid - // Otherwise, generate a Twitter login link - $twitter_login_url = false; - - if(array_key_exists('login', $params)) { - $twitter = new TwitterOAuth(Config::$twitterClientID, Config::$twitterClientSecret); - $twitter_login_url = getTwitterLoginURL($twitter); - } else { - $twitter = new TwitterOAuth(Config::$twitterClientID, Config::$twitterClientSecret, - $user->twitter_access_token, $user->twitter_token_secret); - - if($user->twitter_access_token) { - if($twitter->get('account/verify_credentials')) { - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'ok' - ))); - return; - } else { - // If the existing twitter token is not valid, generate a login link - $twitter_login_url = getTwitterLoginURL($twitter); - } - } else { - $twitter_login_url = getTwitterLoginURL($twitter); - } - } - - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'url' => $twitter_login_url - ))); - - } else { - $app->response()['Content-type'] = 'application/json'; - $app->response()->body(json_encode(array( - 'result' => 'error' - ))); - } -}); - -$app->get('/auth/twitter/callback', function() use($app) { - if($user=require_login($app)) { - $params = $app->request()->params(); - - $twitter = new TwitterOAuth(Config::$twitterClientID, Config::$twitterClientSecret, - $_SESSION['twitter_auth']['oauth_token'], $_SESSION['twitter_auth']['oauth_token_secret']); - $credentials = $twitter->oauth('oauth/access_token', ['oauth_verifier' => $params['oauth_verifier']]); - $user->twitter_access_token = $credentials['oauth_token']; - $user->twitter_token_secret = $credentials['oauth_token_secret']; - $user->twitter_username = $credentials['screen_name']; - $user->save(); - - $app->redirect('/settings'); - } -}); diff --git a/controllers/controllers.php b/controllers/controllers.php index 0917315..153c9e2 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -1,5 +1,4 @@ <?php -use Abraham\TwitterOAuth\TwitterOAuth; use IndieWeb\DateFormatter; function require_login(&$app, $redirect=true) { @@ -234,6 +233,7 @@ $app->get('/review', function() use($app) { } }); + $app->get('/repost', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); @@ -394,6 +394,9 @@ $app->post('/settings/save', function() use($app) { $user->micropub_syndicate_field = $params['syndicate_field']; } + if(array_key_exists('weight_unit', $params) && $params['weight_unit']) + $user->weight_unit = $params['weight_unit']; + $user->save(); $app->response()['Content-type'] = 'application/json'; $app->response()->body(json_encode(array( @@ -422,30 +425,14 @@ $app->get('/settings/html-content', function() use($app) { } }); + function create_favorite(&$user, $url) { $tweet_id = false; - $twitter_syndication = false; - - // POSSE favorites to Twitter - if($user->twitter_access_token && preg_match('/https?:\/\/(?:www\.)?twitter\.com\/[^\/]+\/status(?:es)?\/(\d+)/', $url, $match)) { - $tweet_id = $match[1]; - $twitter = new TwitterOAuth(Config::$twitterClientID, Config::$twitterClientSecret, - $user->twitter_access_token, $user->twitter_token_secret); - $result = $twitter->post('favorites/create', array( - 'id' => $tweet_id - )); - if(property_exists($result, 'id_str')) { - $twitter_syndication = 'https://twitter.com/'.$user->twitter_username.'/status/'.$result->id_str; - } - } $micropub_request = array( 'like-of' => $url ); - if($twitter_syndication) { - $micropub_request['syndication'] = $twitter_syndication; - } $r = micropub_post_for_user($user, $micropub_request); return $r; @@ -465,25 +452,9 @@ function edit_favorite(&$user, $post_url, $like_of) { function create_repost(&$user, $url) { - $tweet_id = false; - $twitter_syndication = false; - - if($user->twitter_access_token && preg_match('/https?:\/\/(?:www\.)?twitter\.com\/[^\/]+\/status(?:es)?\/(\d+)/', $url, $match)) { - $tweet_id = $match[1]; - $twitter = new TwitterOAuth(Config::$twitterClientID, Config::$twitterClientSecret, - $user->twitter_access_token, $user->twitter_token_secret); - $result = $twitter->post('statuses/retweet/'.$tweet_id); - if(property_exists($result, 'id_str')) { - $twitter_syndication = 'https://twitter.com/'.$user->twitter_username.'/status/'.$result->id_str; - } - } - $micropub_request = array( 'repost-of' => $url ); - if($twitter_syndication) { - $micropub_request['syndication'] = $twitter_syndication; - } $r = micropub_post_for_user($user, $micropub_request); return $r; @@ -679,29 +650,10 @@ $app->get('/reply/preview', function() use($app) { $reply_url = trim($params['url']); - if(preg_match('/twtr\.io\/([0-9a-z]+)/i', $reply_url, $match)) { - $twtr = 'https://twitter.com/_/status/' . sxg_to_num($match[1]); - $ch = curl_init($twtr); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_exec($ch); - $expanded_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); - if($expanded_url) $reply_url = $expanded_url; - } - $entry = false; $xray_opts = []; - if(preg_match('/twitter\.com\/(?:[^\/]+)\/statuse?s?\/(.+)/', $reply_url, $match)) { - 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; - } - } - // Pass to X-Ray to see if it can expand the entry $xray = new p3k\XRay(); $xray->http = new p3k\HTTP('Quill ('.Config::$base_url.')'); @@ -754,7 +706,7 @@ $app->get('/reply/preview', function() use($app) { if(isset($entry['content']) && $entry['content'] && isset($entry['content']['text'])) { if(preg_match_all('/(^|(?<=[\s\/]))@([a-z0-9_]+([a-z0-9_\.]*)?)/i', $entry['content']['text'], $matches)) { foreach($matches[0] as $nick) { - if(trim($nick,'@') != $user->twitter_username && trim($nick,'@') != display_url($user->url)) + if(trim($nick,'@') != display_url($user->url)) $mentions[] = strtolower(trim($nick,'@')); } } @@ -768,12 +720,6 @@ $app->get('/reply/preview', function() use($app) { foreach($entry['syndication'] as $s) { $host = parse_url($s, PHP_URL_HOST); switch($host) { - case 'twitter.com': - case 'www.twitter.com': - $icon = 'twitter.ico'; break; - case 'facebook.com': - case 'www.facebook.com': - $icon = 'facebook.ico'; break; case 'github.com': case 'www.github.com': $icon = 'github.ico'; break; @@ -898,3 +844,134 @@ $app->get('/airport-info', function() use($app){ $app->response()->body(json_encode($response)); } }); + +$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, $published) { + $micropub_request = array( + 'type' => ['h-entry'], + 'properties' => [ + 'weight' => [[ + 'type' => ['h-measure'], + 'properties' => [ + 'num' => [$weight_num], + 'unit' => [$weight_unit] + ] + ]] + ] + ); + try { + $date = new DateTime($published); + $micropub_request['properties']['published'] = [$date->format('c')]; + } catch(Exception $e) { + } + $r = micropub_post_for_user($user, $micropub_request, null, true); + + return $r; +} + +$app->get('/weight', function() use($app){ + if($user=require_login($app)) { + render('new-weight', array( + 'title' => 'New Weight', + 'unit' => $user->weight_unit + )); + } +}); + +$app->post('/weight', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $r = create_weight($user, $params['weight_num'], $user->weight_unit, $params['published']); + $location = $r['location']; + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode(array( + 'location' => $location, + 'error' => $r['error'] + ))); + } +}); + + +function create_exercise(&$user, $activity, $minutes, $heartrate, $published) { + $micropub_request = array( + 'type' => ['h-entry'], + 'properties' => [ + 'workout' => [[ + 'type' => ['h-workout'], + 'properties' => [ + 'activity' => [$activity], + 'duration' => [[ + 'type' => ['h-measure'], + 'properties' => [ + 'num' => [($minutes*60)], + 'unit' => ['second'] + ], + ]], + 'heartrate' => [[ + 'type' => 'h-measure', + 'properties' => [ + 'num' => [$heartrate], + 'unit' => ['bpm'], + ] + ]] + ] + ]] + ] + ); + try { + $date = new DateTime($published); + $micropub_request['properties']['published'] = [$date->format('c')]; + } catch(Exception $e) { + } + $r = micropub_post_for_user($user, $micropub_request, null, true); + + return $r; +} + +$app->get('/exercise', function() use($app){ + if($user=require_login($app)) { + render('new-exercise', array( + 'title' => 'New Exercise', + )); + } +}); + +$app->post('/exercise', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $r = create_exercise($user, $params['activity'], $params['minutes'], $params['heartrate'], $params['published']); + $location = $r['location']; + + $app->response()['Content-type'] = 'application/json'; + $app->response()->body(json_encode(array( + 'location' => $location, + 'error' => $r['error'] + ))); + } +}); |