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