From 434956fc75d8b9dc4e8ae6547adea5f65796dae4 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sat, 6 May 2017 12:15:54 +0200 Subject: [PATCH] Notices start saving selfLink from activities/objects --- classes/Notice.php | 16 ++++++++++++++++ lib/activity.php | 2 +- lib/activityhandlerplugin.php | 3 +++ lib/activityutils.php | 10 ++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index a7effe4d5b..3d9968629a 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -59,6 +59,7 @@ class Notice extends Managed_DataObject public $content; // text public $rendered; // text public $url; // varchar(191) not 255 because utf8mb4 takes more space + public $self; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime multiple_key not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP public $reply_to; // int(4) @@ -83,6 +84,7 @@ class Notice extends Managed_DataObject 'content' => array('type' => 'text', 'description' => 'update content', 'collate' => 'utf8mb4_general_ci'), 'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'), 'url' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'), + 'self' => array('type' => 'varchar', 'length' => 191, 'description' => 'Resolvable URL to the (remote) Atom entry representation'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), 'reply_to' => array('type' => 'int', 'description' => 'notice replied to (usually a guess)'), @@ -445,6 +447,7 @@ class Notice extends Managed_DataObject static function saveNew($profile_id, $content, $source, array $options=null) { $defaults = array('uri' => null, 'url' => null, + 'self' => null, 'conversation' => null, // URI of conversation 'reply_to' => null, // This will override convo URI if the parent is known 'repeat_of' => null, // This will override convo URI if the repeated notice is known @@ -539,6 +542,9 @@ class Notice extends Managed_DataObject $notice->source = $source; $notice->uri = $uri; $notice->url = $url; + if ($self && common_valid_http_url($self)) { + $notice->self = $self; + } // Get the groups here so we can figure out replies and such if (!isset($groups)) { @@ -776,6 +782,9 @@ class Notice extends Managed_DataObject // implied object $options['uri'] = $act->id; $options['url'] = $act->link; + if ($act->selfLink) { + $options['self'] = $act->selfLink; + } } else { $actobj = count($act->objects)===1 ? $act->objects[0] : null; if (!is_null($actobj) && !empty($actobj->id)) { @@ -786,6 +795,9 @@ class Notice extends Managed_DataObject $options['url'] = $actobj->id; } } + if ($actobj->selfLink) { + $options['self'] = $actobj->selfLink; + } } $defaults = array( @@ -795,6 +807,7 @@ class Notice extends Managed_DataObject 'reply_to' => null, 'repeat_of' => null, 'scope' => null, + 'self' => null, 'source' => 'unknown', 'tags' => array(), 'uri' => null, @@ -847,6 +860,9 @@ class Notice extends Managed_DataObject $stored->source = $source; $stored->uri = $uri; $stored->url = $url; + if (common_valid_http_url($stored->self)) { + $stored->self = $self; + } $stored->verb = $act->verb; $content = $act->content ?: $act->summary; diff --git a/lib/activity.php b/lib/activity.php index b733ff97aa..49f7603d80 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -267,7 +267,7 @@ class Activity // From APP. Might be useful. - $this->selfLink = ActivityUtils::getLink($entry, 'self', 'application/atom+xml'); + $this->selfLink = ActivityUtils::getSelfLink($entry); $this->editLink = ActivityUtils::getLink($entry, 'edit', 'application/atom+xml'); } diff --git a/lib/activityhandlerplugin.php b/lib/activityhandlerplugin.php index 6e58a05b31..f97bb98aab 100644 --- a/lib/activityhandlerplugin.php +++ b/lib/activityhandlerplugin.php @@ -340,6 +340,7 @@ abstract class ActivityHandlerPlugin extends Plugin $options = array('uri' => $object->id, 'url' => $object->link, + 'self' => $object->selfLink, 'is_local' => Notice::REMOTE, 'source' => 'ostatus'); @@ -416,6 +417,7 @@ abstract class ActivityHandlerPlugin extends Plugin $options = array('uri' => $object->id, 'url' => $object->link, + 'self' => $object->selfLink, 'is_local' => Notice::REMOTE, 'source' => 'ostatus'); @@ -467,6 +469,7 @@ abstract class ActivityHandlerPlugin extends Plugin $options = array('uri' => $object->id, 'url' => $object->link, + 'self' => $object->selfLink, 'source' => 'restore'); // $user->getProfile() is a Profile diff --git a/lib/activityutils.php b/lib/activityutils.php index 0ddb15a749..ba23516ec2 100644 --- a/lib/activityutils.php +++ b/lib/activityutils.php @@ -65,11 +65,16 @@ class ActivityUtils * * @return string related link, if any */ - static function getPermalink($element) + static function getPermalink(DOMNode $element) { return self::getLink($element, 'alternate', 'text/html'); } + static function getSelfLink(DOMNode $element) + { + return self::getLink($element, 'self', 'application/atom+xml'); + } + /** * Get the permalink for an Activity object * @@ -90,8 +95,9 @@ class ActivityUtils $linkRel = $link->getAttribute(self::REL); $linkType = $link->getAttribute(self::TYPE); + // XXX: Am I allowed to do this according to specs? (matching using common_bare_mime) if ($linkRel == $rel && - (is_null($type) || $linkType == $type)) { + (is_null($type) || common_bare_mime($linkType) == common_bare_mime($type))) { return $link->getAttribute(self::HREF); } }