X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2FOStatus%2FOStatusPlugin.php;h=630031fdde06916a44d0238a6d71e2be61c7db2b;hb=fde3b99e8ec1a95b787ac0003bec4ce5c24ad0ea;hp=b80f965d81d84576d033e65a3b55db980e08a0fc;hpb=f7479e3f57f19715098e961403a941a3b4418216;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index b80f965d81..630031fdde 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -30,28 +30,15 @@ if (!defined('GNUSOCIAL')) { exit(1); } set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/phpseclib'); -class FeedSubException extends Exception -{ - function __construct($msg=null) - { - $type = get_class($this); - if ($msg) { - parent::__construct("$type: $msg"); - } else { - parent::__construct($type); - } - } -} - class OStatusPlugin extends Plugin { /** * Hook for RouterInitialized event. * - * @param Net_URL_Mapper $m path-to-action mapper + * @param URLMapper $m path-to-action mapper * @return boolean hook return */ - function onRouterInitialized($m) + public function onRouterInitialized(URLMapper $m) { // Discovery actions $m->connect('main/ostatustag', @@ -233,67 +220,6 @@ class OStatusPlugin extends Plugin return true; } - function onStartShowTagProfileForm($action, $profile) - { - $action->elementStart('form', array('method' => 'post', - 'id' => 'form_tag_user', - 'class' => 'form_settings', - 'name' => 'tagprofile', - 'action' => common_local_url('tagprofile', array('id' => @$profile->id)))); - - $action->elementStart('fieldset'); - // TRANS: Fieldset legend. - $action->element('legend', null, _m('List remote profile')); - $action->hidden('token', common_session_token()); - - $user = common_current_user(); - - $action->elementStart('ul', 'form_data'); - $action->elementStart('li'); - - // TRANS: Field label. - $action->input('uri', _m('LABEL','Remote profile'), $action->trimmed('uri'), - // TRANS: Field title. - _m('OStatus user\'s address, like nickname@example.com or http://example.net/nickname.')); - $action->elementEnd('li'); - $action->elementEnd('ul'); - // TRANS: Button text to fetch remote profile. - $action->submit('fetch', _m('BUTTON','Fetch')); - $action->elementEnd('fieldset'); - $action->elementEnd('form'); - } - - function onStartTagProfileAction($action, $profile) - { - $err = null; - $uri = $action->trimmed('uri'); - - if (!$profile && $uri) { - try { - if (Validate::email($uri)) { - $oprofile = Ostatus_profile::ensureWebfinger($uri); - } else if (Validate::uri($uri)) { - $oprofile = Ostatus_profile::ensureProfileURL($uri); - } else { - // TRANS: Exception in OStatus when invalid URI was entered. - throw new Exception(_m('Invalid URI.')); - } - - // redirect to the new profile. - common_redirect(common_local_url('tagprofile', array('id' => $oprofile->profile_id)), 303); - - } catch (Exception $e) { - // TRANS: Error message in OStatus plugin. Do not translate the domain names example.com - // TRANS: and example.net, as these are official standard domain names for use in examples. - $err = _m("Sorry, we could not reach that address. Please make sure that the OStatus address is like nickname@example.com or http://example.net/nickname."); - } - - $action->showForm($err); - return false; - } - return true; - } - /* * If the field being looked for is URI look for the profile */ @@ -356,7 +282,7 @@ class OStatusPlugin extends Plugin 'type' => 'mention', 'text' => $target, 'position' => $pos, - 'url' => $profile->profileurl); + 'url' => $profile->getUrl()); } } catch (Exception $e) { $this->log(LOG_ERR, "Webfinger check failed: " . $e->getMessage()); @@ -383,7 +309,7 @@ class OStatusPlugin extends Plugin 'type' => 'mention', 'text' => $target, 'position' => $pos, - 'url' => $profile->profileurl); + 'url' => $profile->getUrl()); break; } } catch (Exception $e) { @@ -691,8 +617,8 @@ class OStatusPlugin extends Plugin $profile->getBestName(), $other->getBestName()); - $act->actor = ActivityObject::fromProfile($profile); - $act->object = ActivityObject::fromProfile($other); + $act->actor = $profile->asActivityObject(); + $act->object = $other->asActivityObject(); $oprofile->notifyActivity($act, $profile); @@ -728,7 +654,7 @@ class OStatusPlugin extends Plugin $group->id, common_date_iso8601(time())); - $act->actor = ActivityObject::fromProfile($profile); + $act->actor = $profile->asActivityObject(); $act->verb = ActivityVerb::JOIN; $act->object = $oprofile->asActivityObject(); @@ -782,7 +708,7 @@ class OStatusPlugin extends Plugin $group->id, common_date_iso8601(time())); - $act->actor = ActivityObject::fromProfile($member); + $act->actor = $member->asActivityObject(); $act->verb = ActivityVerb::LEAVE; $act->object = $oprofile->asActivityObject(); @@ -828,7 +754,7 @@ class OStatusPlugin extends Plugin $peopletag->id, common_date_iso8601(time())); - $act->actor = ActivityObject::fromProfile($sub); + $act->actor = $sub->asActivityObject(); $act->verb = ActivityVerb::FOLLOW; $act->object = $oprofile->asActivityObject(); @@ -880,7 +806,7 @@ class OStatusPlugin extends Plugin $peopletag->id, common_date_iso8601(time())); - $act->actor = ActivityObject::fromProfile($member); + $act->actor = $member->asActivityObject(); $act->verb = ActivityVerb::UNFOLLOW; $act->object = $oprofile->asActivityObject(); @@ -973,8 +899,8 @@ class OStatusPlugin extends Plugin $tagged->getBestName(), $plist->getBestName()); - $act->actor = ActivityObject::fromProfile($tagger); - $act->objects = array(ActivityObject::fromProfile($tagged)); + $act->actor = $tagger->asActivityObject(); + $act->objects = array($tagged->asActivityObject()); $act->target = ActivityObject::fromPeopletag($plist); $oprofile->notifyDeferred($act, $tagger); @@ -1024,8 +950,8 @@ class OStatusPlugin extends Plugin $tagged->getBestName(), $plist->getBestName()); - $act->actor = ActivityObject::fromProfile($tagger); - $act->objects = array(ActivityObject::fromProfile($tagged)); + $act->actor = $tagger->asActivityObject(); + $act->objects = array($tagged->asActivityObject()); $act->target = ActivityObject::fromPeopletag($plist); $oprofile->notifyDeferred($act, $tagger); @@ -1073,8 +999,8 @@ class OStatusPlugin extends Plugin $profile->getBestName(), $notice->getUrl()); - $act->actor = ActivityObject::fromProfile($profile); - $act->object = ActivityObject::fromNotice($notice); + $act->actor = $profile->asActivityObject(); + $act->object = $notice->asActivityObject(); $oprofile->notifyActivity($act, $profile); @@ -1191,7 +1117,7 @@ class OStatusPlugin extends Plugin $act->content = sprintf(_m('%s has updated their profile page.'), $profile->getBestName()); - $act->actor = ActivityObject::fromProfile($profile); + $act->actor = $profile->asActivityObject(); $act->object = $act->actor; while ($oprofile->fetch()) { @@ -1240,7 +1166,7 @@ class OStatusPlugin extends Plugin return true; } - function onPluginVersion(&$versions) + function onPluginVersion(array &$versions) { $versions[] = array('name' => 'OStatus', 'version' => GNUSOCIAL_VERSION, @@ -1319,21 +1245,21 @@ class OStatusPlugin extends Plugin function onEndWebFingerNoticeLinks(XML_XRD $xrd, Notice $target) { $author = $target->getProfile(); - $salmon_url = common_local_url('usersalmon', array('id' => $author->id)); + $profiletype = $this->profileTypeString($author); + $salmon_url = common_local_url("{$profiletype}salmon", array('id' => $author->id)); $xrd->links[] = new XML_XRD_Element_Link(Salmon::REL_SALMON, $salmon_url); return true; } function onEndWebFingerProfileLinks(XML_XRD $xrd, Profile $target) { - $xrd->links[] = new XML_XRD_Element_Link(Discovery::UPDATESFROM, - common_local_url('ApiTimelineUser', - array('id' => $target->id, 'format' => 'atom')), - 'application/atom+xml'); + if ($target->getObjectType() === ActivityObject::PERSON) { + $this->addWebFingerPersonLinks($xrd, $target); + } - // Salmon - $salmon_url = common_local_url('usersalmon', - array('id' => $target->id)); + // Salmon + $profiletype = $this->profileTypeString($target); + $salmon_url = common_local_url("{$profiletype}salmon", array('id' => $target->id)); $xrd->links[] = new XML_XRD_Element_Link(Salmon::REL_SALMON, $salmon_url); @@ -1341,25 +1267,81 @@ class OStatusPlugin extends Plugin $xrd->links[] = new XML_XRD_Element_Link(Salmon::NS_REPLIES, $salmon_url); $xrd->links[] = new XML_XRD_Element_Link(Salmon::NS_MENTIONS, $salmon_url); + // TODO - finalize where the redirect should go on the publisher + $xrd->links[] = new XML_XRD_Element_Link('http://ostatus.org/schema/1.0/subscribe', + common_local_url('ostatussub') . '?profile={uri}', + null, // type not set + true); // isTemplate + + return true; + } + + protected function profileTypeString(Profile $target) + { + // This is just used to have a definitive string response to "USERsalmon" or "GROUPsalmon" + switch ($target->getObjectType()) { + case ActivityObject::PERSON: + return 'user'; + case ActivityObject::GROUP: + return 'group'; + default: + throw new ServerException('Unknown profile type for WebFinger profile links'); + } + } + + protected function addWebFingerPersonLinks(XML_XRD $xrd, Profile $target) + { + $xrd->links[] = new XML_XRD_Element_Link(Discovery::UPDATESFROM, + common_local_url('ApiTimelineUser', + array('id' => $target->id, 'format' => 'atom')), + 'application/atom+xml'); + // Get this profile's keypair $magicsig = Magicsig::getKV('user_id', $target->id); if (!$magicsig instanceof Magicsig && $target->isLocal()) { - // No keypair yet, let's generate one. Only for local users. - $magicsig = new Magicsig(); - $magicsig->generate($target->getUser()); + $magicsig = Magicsig::generate($target->getUser()); } - if ($magicsig instanceof Magicsig) { + if (!$magicsig instanceof Magicsig) { + return false; // value doesn't mean anything, just figured I'd indicate this function didn't do anything + } + if (Event::handle('StartAttachPubkeyToUserXRD', array($magicsig, $xrd, $target))) { $xrd->links[] = new XML_XRD_Element_Link(Magicsig::PUBLICKEYREL, - 'data:application/magic-public-key,'. $magicsig->toString(false)); + 'data:application/magic-public-key,'. $magicsig->toString()); + // The following event handles plugins like Diaspora which add their own version of the Magicsig pubkey + Event::handle('EndAttachPubkeyToUserXRD', array($magicsig, $xrd, $target)); + } + } + + public function onGetLocalAttentions(Profile $actor, array $attention_uris, array &$mentions, array &$groups) + { + list($mentions, $groups) = Ostatus_profile::filterAttention($actor, $attention_uris); + } + + // FIXME: Maybe this shouldn't be so authoritative that it breaks other remote profile lookups? + static public function onCheckActivityAuthorship(Activity $activity, Profile &$profile) + { + try { + $oprofile = Ostatus_profile::ensureProfileURL($profile->getUrl()); + $profile = $oprofile->checkAuthorship($activity); + } catch (Exception $e) { + common_log(LOG_ERR, 'Could not get a profile or check authorship ('.get_class($e).': "'.$e->getMessage().'") for activity ID: '.$activity->id); + $profile = null; + return false; } + return true; + } - // TODO - finalize where the redirect should go on the publisher - $xrd->links[] = new XML_XRD_Element_Link('http://ostatus.org/schema/1.0/subscribe', - common_local_url('ostatussub') . '?profile={uri}', - null, // type not set - true); // isTemplate + public function onProfileDeleteRelated($profile, &$related) + { + // Ostatus_profile has a 'profile_id' property, which will be used to find the object + $related[] = 'Ostatus_profile'; + // Magicsig has a "user_id" column instead, so we have to delete it more manually: + $magicsig = Magicsig::getKV('user_id', $profile->id); + if ($magicsig instanceof Magicsig) { + $magicsig->delete(); + } return true; } }