From e0084a6fdf314365c6e58334bdd44a99f8e79bd1 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 18 Jul 2015 11:39:34 +0200 Subject: [PATCH] Exception handling regarding Foreign_link --- classes/Foreign_link.php | 4 +- .../actions/facebookfinishlogin.php | 40 +++++++-------- plugins/FacebookBridge/lib/facebookclient.php | 11 ++-- .../actions/twitterauthorization.php | 13 +++-- .../TwitterBridge/actions/twittersettings.php | 2 +- .../daemons/synctwitterfriends.php | 50 +++++++++---------- .../daemons/twitterstatusfetcher.php | 9 +--- .../TwitterBridge/lib/tweetinqueuehandler.php | 6 +-- plugins/TwitterBridge/lib/twitterimport.php | 22 ++++---- plugins/TwitterBridge/scripts/fakestream.php | 7 +-- plugins/TwitterBridge/scripts/streamtest.php | 7 +-- plugins/TwitterBridge/twitter.php | 19 +++++-- 12 files changed, 88 insertions(+), 102 deletions(-) diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index 6e050d0c94..b3757448ad 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -136,12 +136,12 @@ class Foreign_link extends Managed_DataObject function getUser() { - return User::getKV($this->user_id); + return Profile::getByID($this->user_id)->getUser(); } function getProfile() { - return Profile::getKV('id', $this->user_id); + return Profile::getByID($this->user_id); } // Make sure we only ever delete one record at a time diff --git a/plugins/FacebookBridge/actions/facebookfinishlogin.php b/plugins/FacebookBridge/actions/facebookfinishlogin.php index 080c59612c..7cf493a994 100644 --- a/plugins/FacebookBridge/actions/facebookfinishlogin.php +++ b/plugins/FacebookBridge/actions/facebookfinishlogin.php @@ -519,34 +519,30 @@ class FacebookfinishloginAction extends Action function tryLogin() { - $flink = Foreign_link::getByForeignID($this->fbuid, FACEBOOK_SERVICE); - - if (!empty($flink)) { + try { + $flink = Foreign_link::getByForeignID($this->fbuid, FACEBOOK_SERVICE); $user = $flink->getUser(); - if (!empty($user)) { + common_log( + LOG_INFO, + sprintf( + 'Logged in Facebook user %s as user %d (%s)', + $this->fbuid, + $user->nickname, + $user->id + ), + __FILE__ + ); - common_log( - LOG_INFO, - sprintf( - 'Logged in Facebook user %s as user %d (%s)', - $this->fbuid, - $user->nickname, - $user->id - ), - __FILE__ - ); + common_set_user($user); + common_real_login(true); - common_set_user($user); - common_real_login(true); + // clear out the stupid cookie + setcookie('fb_access_token', '', time() - 3600); // one hour ago - // clear out the stupid cookie - setcookie('fb_access_token', '', time() - 3600); // one hour ago + $this->goHome($user->nickname); - $this->goHome($user->nickname); - } - - } else { + } catch (NoResultException $e) { $this->showForm(null, $this->bestNewNickname()); } } diff --git a/plugins/FacebookBridge/lib/facebookclient.php b/plugins/FacebookBridge/lib/facebookclient.php index e55e19d88b..5faad5dfb7 100644 --- a/plugins/FacebookBridge/lib/facebookclient.php +++ b/plugins/FacebookBridge/lib/facebookclient.php @@ -66,13 +66,12 @@ class Facebookclient $this->notice = $notice; $profile_id = $profile ? $profile->id : $notice->profile_id; - $this->flink = Foreign_link::getByUserID( - $profile_id, - FACEBOOK_SERVICE - ); - - if (!empty($this->flink)) { + try { + $this->flink = Foreign_link::getByUserID($profile_id, FACEBOOK_SERVICE); $this->user = $this->flink->getUser(); + } catch (NoResultException $e) { + // at least $this->flink could've gotten set to something, + // but the logic that was here before didn't care, so let's not care either } } diff --git a/plugins/TwitterBridge/actions/twitterauthorization.php b/plugins/TwitterBridge/actions/twitterauthorization.php index 3eb302bda4..c9b892b640 100644 --- a/plugins/TwitterBridge/actions/twitterauthorization.php +++ b/plugins/TwitterBridge/actions/twitterauthorization.php @@ -553,20 +553,19 @@ class TwitterauthorizationAction extends FormAction $flink = Foreign_link::getByForeignID($this->twuid, TWITTER_SERVICE); $user = $flink->getUser(); - if ($user instanceof User) { - common_debug('TwitterBridge Plugin - ' . - "Logged in Twitter user $flink->foreign_id as user $user->id ($user->nickname)"); + common_debug('TwitterBridge Plugin - ' . + "Logged in Twitter user $flink->foreign_id as user $user->id ($user->nickname)"); - common_set_user($user); - common_real_login(true); - $this->goHome($user->nickname); - } + common_set_user($user); + common_real_login(true); + $this->goHome($user->nickname); } catch (NoResultException $e) { // Either no Foreign_link was found or not the user connected to it. // Let's just continue to allow creating or logging in as a new user. } common_debug("TwitterBridge Plugin - No flink found for twuid: {$this->twuid} - new user"); + // FIXME: what do we want to do here? I forgot return; throw new ServerException(_m('No foreign link found for Twitter user')); } diff --git a/plugins/TwitterBridge/actions/twittersettings.php b/plugins/TwitterBridge/actions/twittersettings.php index 6665ae619e..ccdb44fcb9 100644 --- a/plugins/TwitterBridge/actions/twittersettings.php +++ b/plugins/TwitterBridge/actions/twittersettings.php @@ -184,7 +184,7 @@ class TwittersettingsAction extends ProfileSettingsAction $this->elementEnd('ul'); - if ($this->flink) { + if ($this->flink instanceof Foreign_link) { // TRANS: Button text for saving Twitter integration settings. $this->submit('save', _m('BUTTON','Save')); } else { diff --git a/plugins/TwitterBridge/daemons/synctwitterfriends.php b/plugins/TwitterBridge/daemons/synctwitterfriends.php index a3862eedfd..9fa3b282b4 100755 --- a/plugins/TwitterBridge/daemons/synctwitterfriends.php +++ b/plugins/TwitterBridge/daemons/synctwitterfriends.php @@ -104,6 +104,7 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon return $flinks; } + // FIXME: make it so we can force a Foreign_link here without colliding with parent function childTask($flink) { // Each child ps needs its own DB connection @@ -124,7 +125,7 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon unset($_DB_DATAOBJECT['CONNECTIONS']); } - function fetchTwitterFriends($flink) + function fetchTwitterFriends(Foreign_link $flink) { $friends = array(); @@ -192,8 +193,14 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon return $friends; } - function subscribeTwitterFriends($flink) + function subscribeTwitterFriends(Foreign_link $flink) { + try { + $profile = $flink->getProfile(); + } catch (NoResultException $e) { + common_log(LOG_WARNING, 'Foreign_link has no matching local profile for local ID: '.$flink->user_id); + } + $friends = $this->fetchTwitterFriends($flink); if (empty($friends)) { @@ -203,8 +210,6 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon return false; } - $profile = $flink->getProfile(); - foreach ($friends as $friend) { $friend_name = $friend->screen_name; @@ -219,31 +224,24 @@ class SyncTwitterFriendsDaemon extends ParallelizingDaemon continue; } - // Check to see if there's a related local user - - $friend_flink = Foreign_link::getByForeignID($friend_id, - TWITTER_SERVICE); - - if (!empty($friend_flink)) { + // Check to see if there's a related local user and try to subscribe + try { + $friend_flink = Foreign_link::getByForeignID($friend_id, TWITTER_SERVICE); // Get associated user and subscribe her + $friend_profile = $friend_flink->getProfile(); - $friend_profile = Profile::getKV('id', $friend_flink->user_id); - - if ($friend_profile instanceof Profile) { - try { - $other = Profile::getKV('id', $invites->user_id); - Subscription::start($profile, $friend_profile); - common_log(LOG_INFO, - $this->name() . ' - Subscribed ' . - "{$friend_profile->nickname} to {$profile->nickname}."); - } catch (Exception $e) { - common_debug($this->name() . - ' - Tried and failed subscribing ' . - "{$friend_profile->nickname} to {$profile->nickname} - " . - $e->getMessage()); - } - } + Subscription::start($profile, $friend_profile); + common_log(LOG_INFO, + $this->name() . ' - Subscribed ' . + "{$friend_profile->nickname} to {$profile->nickname}."); + } catch (NoResultException $e) { + // either no foreign link for this friend's foreign ID or no profile found on local ID. + } catch (Exception $e) { + common_debug($this->name() . + ' - Tried and failed subscribing ' . + "{$friend_profile->nickname} to {$profile->nickname} - " . + $e->getMessage()); } } diff --git a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php index d444b8aa5d..83e8a0df5e 100755 --- a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php +++ b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php @@ -128,6 +128,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon return $flinks; } + // FIXME: make it so we can force a Foreign_link here without colliding with parent function childTask($flink) { // Each child ps needs its own DB connection @@ -149,14 +150,8 @@ class TwitterStatusFetcher extends ParallelizingDaemon unset($_DB_DATAOBJECT['CONNECTIONS']); } - function getTimeline($flink, $timelineUri = 'home_timeline') + function getTimeline(Foreign_link $flink, $timelineUri = 'home_timeline') { - if (empty($flink)) { - common_log(LOG_ERR, $this->name() . - " - Can't retrieve Foreign_link for foreign ID $fid"); - return; - } - common_log(LOG_DEBUG, $this->name() . ' - Trying to get ' . $timelineUri . ' timeline for Twitter user ' . $flink->foreign_id); diff --git a/plugins/TwitterBridge/lib/tweetinqueuehandler.php b/plugins/TwitterBridge/lib/tweetinqueuehandler.php index cc0c05f9a6..69ce5a61e9 100644 --- a/plugins/TwitterBridge/lib/tweetinqueuehandler.php +++ b/plugins/TwitterBridge/lib/tweetinqueuehandler.php @@ -51,8 +51,8 @@ class TweetInQueueHandler extends QueueHandler $importer = new TwitterImport(); $notice = $importer->importStatus($status); if ($notice instanceof Notice) { - $flink = Foreign_link::getByForeignID($receiver, TWITTER_SERVICE); - if ($flink instanceof Foreign_link) { + try { + $flink = Foreign_link::getByForeignID($receiver, TWITTER_SERVICE); common_log(LOG_DEBUG, "TweetInQueueHandler - Got flink so add notice ". $notice->id." to attentions for user ".$flink->user_id); try { @@ -63,7 +63,7 @@ class TweetInQueueHandler extends QueueHandler common_log(LOG_ERR, "Failed adding notice {$notice->id} to attentions for user {$flink->user_id}: " . $e->getMessage()); } - } else { + } catch (NoResultException $e) { common_log(LOG_DEBUG, "TweetInQueueHandler - No flink found for foreign user ".$receiver); } } diff --git a/plugins/TwitterBridge/lib/twitterimport.php b/plugins/TwitterBridge/lib/twitterimport.php index 45b7547ce2..d929fecf83 100644 --- a/plugins/TwitterBridge/lib/twitterimport.php +++ b/plugins/TwitterBridge/lib/twitterimport.php @@ -542,17 +542,17 @@ class TwitterImport } foreach ($status->entities->user_mentions as $mention) { - $flink = Foreign_link::getByForeignID($mention->id, TWITTER_SERVICE); - if (!empty($flink)) { - $user = User::getKV('id', $flink->user_id); - if (!empty($user)) { - $reply = new Reply(); - $reply->notice_id = $notice->id; - $reply->profile_id = $user->id; - $reply->modified = $notice->created; - common_log(LOG_INFO, __METHOD__ . ": saving reply: notice {$notice->id} to profile {$user->id}"); - $id = $reply->insert(); - } + try { + $flink = Foreign_link::getByForeignID($mention->id, TWITTER_SERVICE); + $user = $flink->getUser(); + $reply = new Reply(); + $reply->notice_id = $notice->id; + $reply->profile_id = $user->id; + $reply->modified = $notice->created; + common_log(LOG_INFO, __METHOD__ . ": saving reply: notice {$notice->id} to profile {$user->id}"); + $id = $reply->insert(); + } catch (NoResultException $e) { + common_log(LOG_WARNING, 'No local user found for Foreign_link with local User id: '.$flink->user_id); } } } diff --git a/plugins/TwitterBridge/scripts/fakestream.php b/plugins/TwitterBridge/scripts/fakestream.php index e827a07117..5d965e7394 100644 --- a/plugins/TwitterBridge/scripts/fakestream.php +++ b/plugins/TwitterBridge/scripts/fakestream.php @@ -62,12 +62,7 @@ if (have_option('n')) { */ function twitterAuthForUser(User $user) { - $flink = Foreign_link::getByUserID($user->id, - TWITTER_SERVICE); - if (!$flink) { - throw new ServerException("No Twitter config for this user."); - } - + $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); $token = TwitterOAuthClient::unpackToken($flink->credentials); if (!$token) { throw new ServerException("No Twitter OAuth credentials for this user."); diff --git a/plugins/TwitterBridge/scripts/streamtest.php b/plugins/TwitterBridge/scripts/streamtest.php index 4e8340bb3f..a642920cee 100644 --- a/plugins/TwitterBridge/scripts/streamtest.php +++ b/plugins/TwitterBridge/scripts/streamtest.php @@ -63,12 +63,7 @@ if (have_option('n')) { */ function twitterAuthForUser(User $user) { - $flink = Foreign_link::getByUserID($user->id, - TWITTER_SERVICE); - if (!$flink) { - throw new ServerException("No Twitter config for this user."); - } - + $flink = Foreign_link::getByUserID($user->id, TWITTER_SERVICE); $token = TwitterOAuthClient::unpackToken($flink->credentials); if (!$token) { throw new ServerException("No Twitter OAuth credentials for this user."); diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index bdcd61db45..0f1e686ac8 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -181,11 +181,15 @@ function twitter_id($status, $field='id') */ function broadcast_twitter($notice) { - $flink = Foreign_link::getByUserID($notice->profile_id, - TWITTER_SERVICE); + try { + $flink = Foreign_link::getByUserID($notice->profile_id, TWITTER_SERVICE); + } catch (NoResultException $e) { + // Alright so don't broadcast it then! (since there's no foreign link) + return true; + } // Don't bother with basic auth, since it's no longer allowed - if (!empty($flink) && TwitterOAuthClient::isPackedToken($flink->credentials)) { + if (TwitterOAuthClient::isPackedToken($flink->credentials)) { if (is_twitter_bound($notice, $flink)) { if (!empty($notice->repeat_of) && is_twitter_notice($notice->repeat_of)) { $retweet = retweet_notice($flink, Notice::getKV('id', $notice->repeat_of)); @@ -273,8 +277,13 @@ function twitter_update_params($notice) return $params; } -function broadcast_oauth($notice, $flink) { - $user = $flink->getUser(); +function broadcast_oauth($notice, Foreign_link $flink) { + try { + $user = $flink->getUser(); + } catch (ServerException $e) { + common_log(LOG_WARNING, 'Discarding broadcast_oauth for notice '.$notice->id.' because of exception: '.$e->getMessage()); + return true; + } $statustxt = format_status($notice); $params = twitter_update_params($notice);