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'); +  } +}); +  | 
