diff options
Diffstat (limited to 'controllers')
-rw-r--r-- | controllers/controllers.php | 298 |
1 files changed, 276 insertions, 22 deletions
diff --git a/controllers/controllers.php b/controllers/controllers.php index b6bb30a..0fef6df 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -1,6 +1,6 @@ <?php -function require_login(&$app) { +function require_login(&$app, $redirect=true) { $params = $app->request()->params(); if(array_key_exists('token', $params)) { try { @@ -8,16 +8,25 @@ function require_login(&$app) { $_SESSION['user_id'] = $data->user_id; $_SESSION['me'] = $data->me; } catch(DomainException $e) { - header('X-Error: DomainException'); - $app->redirect('/', 301); + if($redirect) { + header('X-Error: DomainException'); + $app->redirect('/', 301); + } else { + return false; + } } catch(UnexpectedValueException $e) { - header('X-Error: UnexpectedValueException'); - $app->redirect('/', 301); + if($redirect) { + header('X-Error: UnexpectedValueException'); + $app->redirect('/', 301); + } else { + return false; + } } } if(!array_key_exists('user_id', $_SESSION)) { - $app->redirect('/'); + if($redirect) + $app->redirect('/'); return false; } else { return ORM::for_table('users')->find_one($_SESSION['user_id']); @@ -95,6 +104,24 @@ $app->get('/bookmark', function() use($app) { } }); +$app->get('/favorite', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $url = ''; + + if(array_key_exists('url', $params)) + $url = $params['url']; + + $html = render('new-favorite', array( + 'title' => 'New Favorite', + 'url' => $url, + 'token' => generate_login_token() + )); + $app->response()->body($html); + } +}); + $app->post('/prefs', function() use($app) { if($user=require_login($app)) { $params = $app->request()->params(); @@ -165,6 +192,109 @@ $app->get('/add-to-home', function() use($app) { } }); +$app->get('/settings', function() use($app) { + if($user=require_login($app)) { + $html = render('settings', array('title' => 'Settings', 'include_facebook' => true)); + $app->response()->body($html); + } +}); + +$app->get('/favorite-popup', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $html = $app->render('favorite-popup.php', array( + 'url' => $params['url'], + 'token' => $params['token'] + )); + $app->response()->body($html); + } +}); + +function create_favorite(&$user, $url) { + $micropub_request = array( + 'like-of' => $url + ); + $r = micropub_post_for_user($user, $micropub_request); + + $facebook_id = false; + $instagram_id = false; + $tweet_id = false; + + /* + // Facebook likes are posted via Javascript, so pass the FB ID to the javascript code + if(preg_match('/https?:\/\/(?:www\.)?facebook\.com\/(?:[^\/]+)\/posts\/(\d+)/', $url, $match)) { + $facebook_id = $match[1]; + } + + if(preg_match('/https?:\/\/(?:www\.)?facebook\.com\/photo\.php\?fbid=(\d+)/', $url, $match)) { + $facebook_id = $match[1]; + } + */ + + if(preg_match('/https?:\/\/(?:www\.)?instagram\.com\/p\/([^\/]+)/', $url, $match)) { + $instagram_id = $match[1]; + if($user->instagram_access_token) { + $instagram = instagram_client(); + $instagram->setAccessToken($user->instagram_access_token); + $ch = curl_init('https://api.instagram.com/v1/media/shortcode/' . $instagram_id . '?access_token=' . $user->instagram_access_token); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $result = json_decode(curl_exec($ch)); + + $result = $instagram->likeMedia($result->data->id); + } else { + // TODO: indicate that the instagram post couldn't be liked because no access token was available + } + } + + if(preg_match('/https?:\/\/(?:www\.)?twitter\.com\/[^\/]+\/status(?:es)?\/(\d+)/', $url, $match)) { + $tweet_id = $match[1]; + $twitter = new \TwitterOAuth\Api(Config::$twitterClientID, Config::$twitterClientSecret, + $user->twitter_access_token, $user->twitter_token_secret); + $result = $twitter->post('favorites/create', array( + 'id' => $tweet_id + )); + } + + return $r; +} + +$app->get('/favorite.js', function() use($app) { + $app->response()->header("Content-type", "text/javascript"); + if($user=require_login($app, false)) { + $params = $app->request()->params(); + + if(array_key_exists('url', $params)) { + $r = create_favorite($user, $params['url']); + + $app->response()->body($app->render('favorite-js.php', array( + 'url' => $params['url'], + 'like_url' => $r['location'], + 'error' => $r['error'], + // 'facebook_id' => $facebook_id + ))); + } else { + $app->response()->body('alert("no url");'); + } + + } else { + $app->response()->body('alert("invalid token");'); + } +}); + +$app->post('/favorite', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $r = create_favorite($user, $params['url']); + + $app->response()->body(json_encode(array( + 'location' => $r['location'], + 'error' => $r['error'] + ))); + } +}); + $app->get('/micropub/syndications', function() use($app) { if($user=require_login($app)) { $data = get_syndication_targets($user); @@ -184,31 +314,155 @@ $app->post('/micropub/post', function() use($app) { return $v !== ''; }); - // Now send to the micropub endpoint - $r = micropub_post($user->micropub_endpoint, $params, $user->micropub_access_token); - $request = $r['request']; - $response = $r['response']; + $r = micropub_post_for_user($user, $params); - $user->last_micropub_response = json_encode($r); - $user->last_micropub_response_date = date('Y-m-d H:i:s'); + $app->response()->body(json_encode(array( + 'request' => htmlspecialchars($r['request']), + 'response' => htmlspecialchars($r['response']), + 'location' => $r['location'], + 'error' => $r['error'], + 'curlinfo' => $r['curlinfo'] + ))); + } +}); + +/* +$app->post('/auth/facebook', function() use($app) { + if($user=require_login($app, false)) { + $params = $app->request()->params(); + // User just auth'd with facebook, store the access token + $user->facebook_access_token = $params['fb_token']; + $user->save(); + + $app->response()->body(json_encode(array( + 'result' => 'ok' + ))); + } else { + $app->response()->body(json_encode(array( + 'result' => 'error' + ))); + } +}); +*/ + +$app->post('/auth/twitter', function() use($app) { + 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(); - // Check the response and look for a "Location" header containing the URL - if($response && preg_match('/Location: (.+)/', $response, $match)) { - $location = $match[1]; - $user->micropub_success = 1; + $app->response()->body(json_encode(array( + 'result' => 'ok' + ))); + } else { + $app->response()->body(json_encode(array( + 'result' => 'error' + ))); + } +}); + +function getTwitterLoginURL(&$twitter) { + $request_token = $twitter->getRequestToken(Config::$base_url . 'auth/twitter/callback'); + $_SESSION['twitter_auth'] = $request_token; + return $twitter->getAuthorizeURL($request_token['oauth_token']); +} + +$app->get('/auth/twitter', function() use($app) { + $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; + $twitter = new \TwitterOAuth\Api(Config::$twitterClientID, Config::$twitterClientSecret, + $user->twitter_access_token, $user->twitter_token_secret); + + if(array_key_exists('login', $params)) { + $twitter = new \TwitterOAuth\Api(Config::$twitterClientID, Config::$twitterClientSecret); + $twitter_login_url = getTwitterLoginURL($twitter); } else { - $location = false; + if($user->twitter_access_token) { + if ($twitter->get('account/verify_credentials')) { + $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()->body(json_encode(array( + 'url' => $twitter_login_url + ))); + + } else { + $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\Api(Config::$twitterClientID, Config::$twitterClientSecret, + $_SESSION['twitter_auth']['oauth_token'], $_SESSION['twitter_auth']['oauth_token_secret']); + $credentials = $twitter->getAccessToken($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'); + } +}); + +$app->get('/auth/instagram', function() use($app) { + if($user=require_login($app, false)) { + + $instagram = instagram_client(); + + // If there is an existing Instagram auth token, check if it's valid + if($user->instagram_access_token) { + $instagram->setAccessToken($user->instagram_access_token); + $igUser = $instagram->getUser(); + + if($igUser && $igUser->meta->code == 200) { + $app->response()->body(json_encode(array( + 'result' => 'ok', + 'username' => $igUser->data->username, + 'url' => $instagram->getLoginUrl(array('basic','likes')) + ))); + return; + } + } + $app->response()->body(json_encode(array( - 'request' => htmlspecialchars($request), - 'response' => htmlspecialchars($response), - 'location' => $location, - 'error' => $r['error'], - 'curlinfo' => $r['curlinfo'] + 'result' => 'error', + 'url' => $instagram->getLoginUrl(array('basic','likes')) ))); } }); +$app->get('/auth/instagram/callback', function() use($app) { + if($user=require_login($app)) { + $params = $app->request()->params(); + + $instagram = instagram_client(); + $data = $instagram->getOAuthToken($params['code']); + $user->instagram_access_token = $data->access_token; + $user->save(); + + $app->redirect('/settings'); + } +}); + |