From 8ecaed3d2f5a19bf1a5c4cb077658e1bd3bc8438 Mon Sep 17 00:00:00 2001 From: Aaron Parecki Date: Sat, 31 Aug 2024 09:27:42 -0700 Subject: [PATCH] remove all the twitter junk --- controllers/auth.php | 104 ---------------------- controllers/controllers.php | 172 +----------------------------------- lib/config.template.php | 3 - views/docs/syndication.php | 8 +- views/new-post.php | 13 +-- views/privacy.php | 2 - views/settings.php | 30 ------- views/twitter.php | 83 ----------------- 8 files changed, 4 insertions(+), 411 deletions(-) delete mode 100644 views/twitter.php diff --git a/controllers/auth.php b/controllers/auth.php index 50fd15b..9dcc81d 100644 --- a/controllers/auth.php +++ b/controllers/auth.php @@ -1,5 +1,4 @@ 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 4feba3f..153c9e2 100644 --- a/controllers/controllers.php +++ b/controllers/controllers.php @@ -1,5 +1,4 @@ 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(); @@ -443,125 +425,14 @@ $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; - $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; @@ -581,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; @@ -795,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.')'); @@ -870,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,'@')); } } @@ -884,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; diff --git a/lib/config.template.php b/lib/config.template.php index 99f69a7..c7a3b66 100644 --- a/lib/config.template.php +++ b/lib/config.template.php @@ -17,9 +17,6 @@ class Config { public static $jwtSecret = 'xxx'; - public static $twitterClientID = ''; - public static $twitterClientSecret = ''; - public static $atlasToken = ''; public static $mapTileURL = ''; diff --git a/views/docs/syndication.php b/views/docs/syndication.php index 3452173..aaa695d 100644 --- a/views/docs/syndication.php +++ b/views/docs/syndication.php @@ -17,10 +17,6 @@ Content-type: application/json { "syndicate-to": [ - { - "uid": "https://twitter.com/aaronpk", - "name": "twitter.com/aaronpk" - }, { "uid": "https://news.indieweb.org/en", "name": "IndieNews" @@ -29,10 +25,10 @@ Content-type: application/json } -

The specific values of names and uids are up to your Micropub endpoint, but a good convention is to use the domain name of the service (e.g. https://twitter.com), or domain name and username (e.g. https://twitter.com/aaronpk) for the uid, and a friendly name like "Twitter" or "twitter.com/aaronpk" as the name.

+

The specific values of names and uids are up to your Micropub endpoint, but a good convention is to use the domain name of the service (e.g. https://news.indieweb.org), or domain name and username (e.g. https://mastodon.social/@aaronpk) for the uid, and a friendly name like "IndieNews" or "mastodon.social/@aaronpk" as the name.

Quill will check for your supported syndication targets when you sign in, but there is also a link on the new post screen to manually re-check if you'd like.

-

When you create a post and tap one of the syndication options, the value of uid is sent in a property called mp-syndicate-to, which instructs your endpoint to syndicate to that target. Note that Quill doesn't know whether the target is Twitter, Facebook, or something else, and doesn't talk to the service directly. It's just an instruction to your endpoint to syndicate to that destination.

+

When you create a post and tap one of the syndication options, the value of uid is sent in a property called mp-syndicate-to, which instructs your endpoint to syndicate to that target. Note that Quill doesn't know whether the target is Mastodon, IndieNews, or something else, and doesn't talk to the service directly. It's just an instruction to your endpoint to syndicate to that destination.

diff --git a/views/new-post.php b/views/new-post.php index ea8eb78..2190752 100644 --- a/views/new-post.php +++ b/views/new-post.php @@ -622,7 +622,7 @@ $(function(){ $("#note_content").on('change keyup', function(e){ var text = $("#note_content").val(); var tweet_length = tw_text_proxy(text).length; - var tweet_check = tw_length_check(text, 280, "user->twitter_username ?>"); + var tweet_check = tw_length_check(text, 280, ""); var remaining = 280 - tweet_length; $("#note_content_remaining span").text(remaining); $("#note_content_remaining").removeClass("pcheck200 pcheck206 pcheck207 pcheck208 pcheck413"); @@ -683,17 +683,6 @@ $(function(){ // } // $("#note_category").val(category.join(", ")); - /* - // stop auto-populating usernames in replies, since Twitter no longer requires it - if($("#note_content").val() == "" && data.mentions) { - var mentions = ''; - for(var i in data.mentions) { - mentions += '@'+data.mentions[i]+' '; - } - $("#note_content").val(mentions); - } - */ - if(data.entry) { $(".reply-context .content").text(data.entry.content.text); if(data.entry.name) { diff --git a/views/privacy.php b/views/privacy.php index 40ce393..c870f99 100644 --- a/views/privacy.php +++ b/views/privacy.php @@ -7,6 +7,4 @@

Quill does not store your posts itself, but does cache the last response from your website and provides it to you for debugging purposes.

-

If you connect Quill to your Twitter account, Quill can favorite tweets on your behalf when you favorite a Twitter URL. Quill will never post anything to your accounts without an explicit action on your part.

- diff --git a/views/settings.php b/views/settings.php index f51e69c..a479924 100644 --- a/views/settings.php +++ b/views/settings.php @@ -123,13 +123,6 @@ - -

Twitter

-

Connecting a Twitter account will automatically "favorite" and "retweet" tweets on Twitter when you favorite and retweet a Twitter URL in Quill.

- - - -

Backwards Compatibility

You can customize some of the properties that are sent in the Micropub request to work with older software.

@@ -168,29 +161,6 @@