X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2Fclasses%2FOstatus_profile.php;h=7ab5b7c8f030818d3e6fd32ff4caaf230123cd23;hb=bbada781b70d78d5c85b675c7add80a9263c5b30;hp=1e493236537f6bc6801135f8783fb09430c5bb35;hpb=23a6b4595f37ba523594b57cdd3932e9ed02c2da;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 1e49323653..7ab5b7c8f0 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -76,6 +76,11 @@ class Ostatus_profile extends Managed_DataObject ); } + public function getUri() + { + return $this->uri; + } + /** * Fetch the StatusNet-side profile for this feed * @return Profile @@ -165,10 +170,10 @@ class Ostatus_profile extends Managed_DataObject return true; } else if ($this->group_id && ($this->profile_id || $this->peopletag_id)) { // TRANS: Server exception. %s is a URI - throw new ServerException(sprintf(_m('Invalid ostatus_profile state: Two or more IDs set for %s.'), $this->uri)); + throw new ServerException(sprintf(_m('Invalid ostatus_profile state: Two or more IDs set for %s.'), $this->getUri())); } else { // TRANS: Server exception. %s is a URI - throw new ServerException(sprintf(_m('Invalid ostatus_profile state: All IDs empty for %s.'), $this->uri)); + throw new ServerException(sprintf(_m('Invalid ostatus_profile state: All IDs empty for %s.'), $this->getUri())); } } @@ -183,10 +188,10 @@ class Ostatus_profile extends Managed_DataObject return true; } else if ($this->peopletag_id && ($this->profile_id || $this->group_id)) { // TRANS: Server exception. %s is a URI - throw new ServerException(sprintf(_m('Invalid ostatus_profile state: Two or more IDs set for %s.'), $this->uri)); + throw new ServerException(sprintf(_m('Invalid ostatus_profile state: Two or more IDs set for %s.'), $this->getUri())); } else { // TRANS: Server exception. %s is a URI - throw new ServerException(sprintf(_m('Invalid ostatus_profile state: All IDs empty for %s.'), $this->uri)); + throw new ServerException(sprintf(_m('Invalid ostatus_profile state: All IDs empty for %s.'), $this->getUri())); } } @@ -337,12 +342,13 @@ class Ostatus_profile extends Managed_DataObject * @param Profile $actor * @return boolean success */ - public function notifyActivity($entry, $actor) + public function notifyActivity($entry, Profile $actor) { if ($this->salmonuri) { $salmon = new Salmon(); return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry), $actor); } + common_debug(__CLASS__.' error: No salmonuri for Ostatus_profile uri: '.$this->uri); return false; } @@ -513,7 +519,7 @@ class Ostatus_profile extends Managed_DataObject $oprofile = $this->checkAuthorship($activity); - if (empty($oprofile)) { + if (!$oprofile instanceof Ostatus_profile) { common_log(LOG_INFO, "No author matched share activity"); return null; } @@ -534,7 +540,7 @@ class Ostatus_profile extends Managed_DataObject $shared = $activity->objects[0]; - if (!($shared instanceof Activity)) { + if (!$shared instanceof Activity) { // TRANS: Client exception thrown when trying to share a non-activity object. throw new ClientException(_m('Can only handle shared activities.')); } @@ -543,7 +549,7 @@ class Ostatus_profile extends Managed_DataObject if (!empty($shared->objects[0]->id)) { // Because StatusNet since commit 8cc4660 sets $shared->id to a TagURI which // fucks up federation, because the URI is no longer recognised by the origin. - // ...but it might still be empty (not present) because $shared->id is set. + // So we set it to the object ID if it exists, otherwise we trust $shared->id $sharedId = $shared->objects[0]->id; } if (empty($sharedId)) { @@ -554,18 +560,25 @@ class Ostatus_profile extends Managed_DataObject // we can't use these functions to "ensureActivityObjectProfile" of a local user, // who might be the creator of the shared activity in question. $sharedNotice = Notice::getKV('uri', $sharedId); - if (!($sharedNotice instanceof Notice)) { - // If no local notice is found, process it! + if (!$sharedNotice instanceof Notice) { + // If no locally stored notice is found, process it! // TODO: Remember to check Deleted_notice! - $other = Ostatus_profile::ensureActivityObjectProfile($shared->actor); - $sharedNotice = $other->processActivity($shared, $method); - } - - if (!($sharedNotice instanceof Notice)) { - // And if we apparently can't get the shared notice, we'll abort the whole thing. - // TRANS: Client exception thrown when saving an activity share fails. - // TRANS: %s is a share ID. - throw new ClientException(sprintf(_m('Failed to save activity %s.'), $sharedId)); + // TODO: If a post is shared that we can't retrieve - what to do? + try { + $other = self::ensureActivityObjectProfile($shared->actor); + $sharedNotice = $other->processActivity($shared, $method); + if (!$sharedNotice instanceof Notice) { + // And if we apparently can't get the shared notice, we'll abort the whole thing. + // TRANS: Client exception thrown when saving an activity share fails. + // TRANS: %s is a share ID. + throw new ClientException(sprintf(_m('Failed to save activity %s.'), $sharedId)); + } + } catch (FeedSubException $e) { + // Remote feed could not be found or verified, should we + // transform this into an "RT @user Blah, blah, blah..."? + common_log(LOG_INFO, __METHOD__ . ' got a ' . get_class($e) . ': ' . $e->getMessage()); + return null; + } } // We'll want to save a web link to the original notice, if provided. @@ -658,14 +671,14 @@ class Ostatus_profile extends Managed_DataObject if ($activity->context) { // TODO: context->attention list($options['groups'], $options['replies']) - = $this->filterReplies($oprofile, $activity->context->attention); + = $this->filterAttention($oprofile, $activity->context->attention); // Maintain direct reply associations // @todo FIXME: What about conversation ID? if (!empty($activity->context->replyToID)) { $orig = Notice::getKV('uri', $activity->context->replyToID); - if (!empty($orig)) { + if ($orig instanceof Notice) { $options['reply_to'] = $orig->id; } } @@ -722,7 +735,7 @@ class Ostatus_profile extends Managed_DataObject $oprofile = $this->checkAuthorship($activity); - if (empty($oprofile)) { + if (!$oprofile instanceof Ostatus_profile) { return null; } @@ -730,12 +743,12 @@ class Ostatus_profile extends Managed_DataObject $note = $activity->objects[0]; - // The id URI will be used as a unique identifier for for the notice, + // The id URI will be used as a unique identifier for the notice, // protecting against duplicate saves. It isn't required to be a URL; // tag: URIs for instance are found in Google Buzz feeds. $sourceUri = $note->id; $dupe = Notice::getKV('uri', $sourceUri); - if ($dupe) { + if ($dupe instanceof Notice) { common_log(LOG_INFO, "OStatus: ignoring duplicate post: $sourceUri"); return $dupe; } @@ -827,14 +840,13 @@ class Ostatus_profile extends Managed_DataObject if ($activity->context) { // TODO: context->attention list($options['groups'], $options['replies']) - = $this->filterReplies($oprofile, $activity->context->attention); + = $this->filterAttention($oprofile, $activity->context->attention); // Maintain direct reply associations // @todo FIXME: What about conversation ID? if (!empty($activity->context->replyToID)) { - $orig = Notice::getKV('uri', - $activity->context->replyToID); - if (!empty($orig)) { + $orig = Notice::getKV('uri', $activity->context->replyToID); + if ($orig instanceof Notice) { $options['reply_to'] = $orig->id; } } @@ -875,7 +887,7 @@ class Ostatus_profile extends Managed_DataObject $content, 'ostatus', $options); - if ($saved) { + if ($saved instanceof Notice) { Ostatus_source::saveNew($saved, $this, $method); if (!empty($attachment)) { File_to_post::processNew($attachment->id, $saved->id); @@ -906,9 +918,9 @@ class Ostatus_profile extends Managed_DataObject * @param array in/out &$attention_uris set of URIs, will be pruned on output * @return array of group IDs */ - protected function filterReplies($sender, array $attention) + protected function filterAttention($sender, array $attention) { - common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', $attention)); + common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', array_keys($attention))); $groups = array(); $replies = array(); foreach ($attention as $recipient=>$type) { @@ -941,14 +953,14 @@ class Ostatus_profile extends Managed_DataObject // Is the recipient a remote user or group? try { - $oprofile = Ostatus_profile::ensureProfileURI($recipient); + $oprofile = self::ensureProfileURI($recipient); if ($oprofile->isGroup()) { // Deliver to local members of this remote group. // @todo FIXME: Sender verification? $groups[] = $oprofile->group_id; } else { // may be canonicalized or something - $replies[] = $oprofile->uri; + $replies[] = $oprofile->getUri(); } continue; } catch (Exception $e) { @@ -976,7 +988,7 @@ class Ostatus_profile extends Managed_DataObject { $oprofile = self::getFromProfileURL($profile_url); - if (!empty($oprofile)) { + if ($oprofile instanceof Ostatus_profile) { return $oprofile; } @@ -1004,7 +1016,7 @@ class Ostatus_profile extends Managed_DataObject $oprofile = self::getFromProfileURL($finalUrl); - if (!empty($oprofile)) { + if ($oprofile instanceof Ostatus_profile) { return $oprofile; } } @@ -1063,24 +1075,19 @@ class Ostatus_profile extends Managed_DataObject static function getFromProfileURL($profile_url) { $profile = Profile::getKV('profileurl', $profile_url); - - if (empty($profile)) { + if (!$profile instanceof Profile) { return null; } // Is it a known Ostatus profile? - $oprofile = Ostatus_profile::getKV('profile_id', $profile->id); - - if (!empty($oprofile)) { + if ($oprofile instanceof Ostatus_profile) { return $oprofile; } // Is it a local user? - $user = User::getKV('id', $profile->id); - - if (!empty($user)) { + if ($user instanceof User) { // @todo i18n FIXME: use sprintf and add i18n (?) throw new OStatusShadowException($profile, "'$profile_url' is the profile for local user '{$user->nickname}'."); } @@ -1109,7 +1116,10 @@ class Ostatus_profile extends Managed_DataObject $huburi = $discover->getHubLink(); $hints['hub'] = $huburi; - $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); + + // XXX: NS_REPLIES is deprecated anyway, so let's remove it in the future. + $salmonuri = $discover->getAtomLink(Salmon::REL_SALMON) + ?: $discover->getAtomLink(Salmon::NS_REPLIES); $hints['salmon'] = $salmonuri; if (!$huburi && !common_config('feedsub', 'fallback_hub')) { @@ -1223,7 +1233,7 @@ class Ostatus_profile extends Managed_DataObject throw new ServerException(sprintf( // TRANS: Server exception. %s is a URI. _m('Tried to update avatar for unsaved remote profile %s.'), - $this->uri)); + $this->getUri())); } // @todo FIXME: This should be better encapsulated @@ -1455,7 +1465,7 @@ class Ostatus_profile extends Managed_DataObject } $user = User::getKV('uri', $homeuri); - if ($user) { + if ($user instanceof User) { // TRANS: Exception. throw new Exception(_m('Local user cannot be referenced as remote.')); } @@ -1466,9 +1476,9 @@ class Ostatus_profile extends Managed_DataObject } $ptag = Profile_list::getKV('uri', $homeuri); - if ($ptag) { + if ($ptag instanceof Profile_list) { $local_user = User::getKV('id', $ptag->tagger); - if (!empty($local_user)) { + if ($local_user instanceof User) { // TRANS: Exception. throw new Exception(_m('Local list cannot be referenced as remote.')); } @@ -1488,7 +1498,9 @@ class Ostatus_profile extends Managed_DataObject $discover = new FeedDiscovery(); $discover->discoverFromFeedURL($hints['feedurl']); } - $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); + // XXX: NS_REPLIES is deprecated anyway, so let's remove it in the future. + $salmonuri = $discover->getAtomLink(Salmon::REL_SALMON) + ?: $discover->getAtomLink(Salmon::NS_REPLIES); } if (array_key_exists('hub', $hints)) { @@ -1899,7 +1911,7 @@ class Ostatus_profile extends Managed_DataObject throw new Exception(_m('Not a valid webfinger address.')); } $oprofile = Ostatus_profile::getKV('uri', $uri); - if (!empty($oprofile)) { + if ($oprofile instanceof Ostatus_profile) { return $oprofile; } } @@ -1907,8 +1919,8 @@ class Ostatus_profile extends Managed_DataObject // Try looking it up $oprofile = Ostatus_profile::getKV('uri', 'acct:'.$addr); - if (!empty($oprofile)) { - self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); + if ($oprofile instanceof Ostatus_profile) { + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->getUri()); return $oprofile; } @@ -1946,7 +1958,7 @@ class Ostatus_profile extends Managed_DataObject try { common_log(LOG_INFO, "Discovery on acct:$addr with feed URL " . $hints['feedurl']); $oprofile = self::ensureFeedURL($hints['feedurl'], $hints); - self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->getUri()); return $oprofile; } catch (Exception $e) { common_log(LOG_WARNING, "Failed creating profile from feed URL '$feedUrl': " . $e->getMessage()); @@ -1959,7 +1971,7 @@ class Ostatus_profile extends Managed_DataObject try { common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl"); $oprofile = self::ensureProfileURL($hints['profileurl'], $hints); - self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->getUri()); return $oprofile; } catch (OStatusShadowException $e) { // We've ended up with a remote reference to a local user or group. @@ -1998,7 +2010,7 @@ class Ostatus_profile extends Managed_DataObject $profile_id = $profile->insert(); - if (!$profile_id) { + if ($profile_id === false) { common_log_db_error($profile, 'INSERT', __FILE__); // TRANS: Exception. %s is a webfinger address. throw new Exception(sprintf(_m('Could not save profile for "%s".'),$addr)); @@ -2017,13 +2029,13 @@ class Ostatus_profile extends Managed_DataObject $result = $oprofile->insert(); - if (!$result) { + if ($result === false) { common_log_db_error($oprofile, 'INSERT', __FILE__); // TRANS: Exception. %s is a webfinger address. throw new Exception(sprintf(_m('Could not save OStatus profile for "%s".'),$addr)); } - self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->getUri()); return $oprofile; } @@ -2085,33 +2097,34 @@ class Ostatus_profile extends Managed_DataObject $oprofile = Ostatus_profile::getKV('uri', $uri); - // If unfound, do discovery stuff + if ($oprofile instanceof Ostatus_profile) { + return $oprofile; + } - if (empty($oprofile)) { - if (preg_match("/^(\w+)\:(.*)/", $uri, $match)) { - $protocol = $match[1]; - switch ($protocol) { - case 'http': - case 'https': - $oprofile = Ostatus_profile::ensureProfileURL($uri); - break; - case 'acct': - case 'mailto': - $rest = $match[2]; - $oprofile = Ostatus_profile::ensureWebfinger($rest); - break; - default: - // TRANS: Server exception. - // TRANS: %1$s is a protocol, %2$s is a URI. - throw new ServerException(sprintf(_m('Unrecognized URI protocol for profile: %1$s (%2$s).'), - $protocol, - $uri)); - break; - } - } else { - // TRANS: Server exception. %s is a URI. - throw new ServerException(sprintf(_m('No URI protocol for profile: %s.'),$uri)); + // If unfound, do discovery stuff + if (preg_match("/^(\w+)\:(.*)/", $uri, $match)) { + $protocol = $match[1]; + switch ($protocol) { + case 'http': + case 'https': + $oprofile = self::ensureProfileURL($uri); + break; + case 'acct': + case 'mailto': + $rest = $match[2]; + $oprofile = self::ensureWebfinger($rest); + break; + default: + // TRANS: Server exception. + // TRANS: %1$s is a protocol, %2$s is a URI. + throw new ServerException(sprintf(_m('Unrecognized URI protocol for profile: %1$s (%2$s).'), + $protocol, + $uri)); + break; } + } else { + // TRANS: Server exception. %s is a URI. + throw new ServerException(sprintf(_m('No URI protocol for profile: %s.'),$uri)); } return $oprofile; @@ -2126,7 +2139,7 @@ class Ostatus_profile extends Managed_DataObject // Groups can't post notices in StatusNet. common_log(LOG_WARNING, "OStatus: skipping post with group listed ". - "as author: $oprofile->uri in feed from $this->uri"); + "as author: " . $oprofile->getUri() . " in feed from " . $this->getUri()); return false; } } else { @@ -2134,7 +2147,7 @@ class Ostatus_profile extends Managed_DataObject if (empty($actor)) { // OK here! assume the default - } else if ($actor->id == $this->uri || $actor->link == $this->uri) { + } else if ($actor->id == $this->getUri() || $actor->link == $this->getUri()) { $this->updateFromActivityObject($actor); } else if ($actor->id) { // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner. @@ -2143,7 +2156,7 @@ class Ostatus_profile extends Managed_DataObject // Most likely this is a plain ol' blog feed of some kind which // doesn't match our expectations. We'll take the entry, but ignore // the info. - common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}"); + common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for " . $this->getUri()); } else { // Plain without ActivityStreams actor info. // We'll just ignore this info for now and save the update under the feed's identity.