]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/OStatus/classes/Ostatus_profile.php
Added some (good known) type-hints.
[quix0rs-gnu-social.git] / plugins / OStatus / classes / Ostatus_profile.php
index 2bcb9b4071495e5d4e95b82bcccce4836b141aa4..42b883361e5bcdd26850a8dca993bec1a96e9ac7 100644 (file)
@@ -132,7 +132,7 @@ class Ostatus_profile extends Managed_DataObject
         } else if ($this->isPeopletag()) {
             return ActivityObject::fromPeopletag($this->localPeopletag());
         } else {
-            return ActivityObject::fromProfile($this->localProfile());
+            return $this->localProfile()->asActivityObject();
         }
     }
 
@@ -156,7 +156,7 @@ class Ostatus_profile extends Managed_DataObject
             $noun = ActivityObject::fromPeopletag($this->localPeopletag());
             return $noun->asString('activity:' . $element);
         } else {
-            $noun = ActivityObject::fromProfile($this->localProfile());
+            $noun = $this->localProfile()->asActivityObject();
             return $noun->asString('activity:' . $element);
         }
     }
@@ -357,9 +357,10 @@ class Ostatus_profile extends Managed_DataObject
      * send immediately but won't get the return value.
      *
      * @param mixed $entry XML string, Notice, or Activity
+     * @param Profile $actor Acting profile
      * @return boolean success
      */
-    public function notifyDeferred($entry, $actor)
+    public function notifyDeferred($entry, Profile $actor)
     {
         if ($this->salmonuri) {
             $data = array('salmonuri' => $this->salmonuri,
@@ -465,20 +466,20 @@ class Ostatus_profile extends Managed_DataObject
      *
      * @return Notice Notice representing the new (or existing) activity
      */
-    public function processEntry($entry, $feed, $source)
+    public function processEntry(DOMElement $entry, DOMElement $feed, $source)
     {
         $activity = new Activity($entry, $feed);
         return $this->processActivity($activity, $source);
     }
 
     // TODO: Make this throw an exception
-    public function processActivity($activity, $source)
+    public function processActivity(Activity $activity, $source)
     {
         $notice = null;
 
         // The "WithProfile" events were added later.
 
-        if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this, &$notice)) &&
+        if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this->localProfile(), &$notice)) &&
             Event::handle('StartHandleFeedEntry', array($activity))) {
 
             switch ($activity->verb) {
@@ -512,14 +513,13 @@ class Ostatus_profile extends Managed_DataObject
         return $notice;
     }
 
-    public function processShare($activity, $method)
+    public function processShare(Activity $activity, $method)
     {
         $notice = null;
 
-        $oprofile = $this->checkAuthorship($activity);
-
-        if (!$oprofile instanceof Ostatus_profile) {
-            common_log(LOG_INFO, "No author matched share activity");
+        try {
+            $profile = ActivityUtils::checkAuthorship($activity, $this->localProfile());
+        } catch (ServerException $e) {
             return null;
         }
 
@@ -608,7 +608,7 @@ class Ostatus_profile extends Managed_DataObject
         // Get (safe!) HTML and text versions of the content
 
         $rendered = $this->purify($sourceContent);
-        $content = html_entity_decode(strip_tags($rendered), ENT_QUOTES, 'UTF-8');
+        $content = common_strip_html($rendered);
 
         $shortened = common_shorten_links($content);
 
@@ -619,7 +619,7 @@ class Ostatus_profile extends Managed_DataObject
 
         if (Notice::contentTooLong($shortened)) {
             $attachment = $this->saveHTMLFile($activity->title, $rendered);
-            $summary = html_entity_decode(strip_tags($activity->summary), ENT_QUOTES, 'UTF-8');
+            $summary = common_strip_html($activity->summary);
             if (empty($summary)) {
                 $summary = $content;
             }
@@ -670,7 +670,7 @@ class Ostatus_profile extends Managed_DataObject
         if ($activity->context) {
             // TODO: context->attention
             list($options['groups'], $options['replies'])
-                = $this->filterAttention($oprofile, $activity->context->attention);
+                = self::filterAttention($profile, $activity->context->attention);
 
             // Maintain direct reply associations
             // @todo FIXME: What about conversation ID?
@@ -713,7 +713,7 @@ class Ostatus_profile extends Managed_DataObject
             $options['urls'][] = $href;
         }
 
-        $notice = Notice::saveNew($oprofile->profile_id,
+        $notice = Notice::saveNew($profile->id,
                                   $content,
                                   'ostatus',
                                   $options);
@@ -728,15 +728,11 @@ class Ostatus_profile extends Managed_DataObject
      * @return mixed saved Notice or false
      * @todo FIXME: Break up this function, it's getting nasty long
      */
-    public function processPost($activity, $method)
+    public function processPost(Activity $activity, $method)
     {
         $notice = null;
 
-        $oprofile = $this->checkAuthorship($activity);
-
-        if (!$oprofile instanceof Ostatus_profile) {
-            return null;
-        }
+        $profile = $this->checkAuthorship($activity, $this->localProfile());
 
         // It's not always an ActivityObject::NOTE, but... let's just say it is.
 
@@ -779,7 +775,7 @@ class Ostatus_profile extends Managed_DataObject
         // Get (safe!) HTML and text versions of the content
 
         $rendered = $this->purify($sourceContent);
-        $content = html_entity_decode(strip_tags($rendered), ENT_QUOTES, 'UTF-8');
+        $content = common_strip_html($rendered);
 
         $shortened = common_shorten_links($content);
 
@@ -790,7 +786,7 @@ class Ostatus_profile extends Managed_DataObject
 
         if (Notice::contentTooLong($shortened)) {
             $attachment = $this->saveHTMLFile($note->title, $rendered);
-            $summary = html_entity_decode(strip_tags($note->summary), ENT_QUOTES, 'UTF-8');
+            $summary = common_strip_html($note->summary);
             if (empty($summary)) {
                 $summary = $content;
             }
@@ -839,7 +835,7 @@ class Ostatus_profile extends Managed_DataObject
         if ($activity->context) {
             // TODO: context->attention
             list($options['groups'], $options['replies'])
-                = $this->filterAttention($oprofile, $activity->context->attention);
+                = self::filterAttention($profile, $activity->context->attention);
 
             // Maintain direct reply associations
             // @todo FIXME: What about conversation ID?
@@ -882,7 +878,7 @@ class Ostatus_profile extends Managed_DataObject
         }
 
         try {
-            $saved = Notice::saveNew($oprofile->profile_id,
+            $saved = Notice::saveNew($profile->id,
                                      $content,
                                      'ostatus',
                                      $options);
@@ -913,11 +909,11 @@ class Ostatus_profile extends Managed_DataObject
 
     /**
      * Filters a list of recipient ID URIs to just those for local delivery.
-     * @param Ostatus_profile local profile of sender
+     * @param Profile local profile of sender
      * @param array in/out &$attention_uris set of URIs, will be pruned on output
      * @return array of group IDs
      */
-    protected function filterAttention($sender, array $attention)
+    static public function filterAttention(Profile $sender, array $attention)
     {
         common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', array_keys($attention)));
         $groups = array();
@@ -937,16 +933,11 @@ class Ostatus_profile extends Managed_DataObject
             if ($id) {
                 $group = User_group::getKV('id', $id);
                 if ($group instanceof User_group) {
-                    try {
-                        // Deliver to all members of this local group if allowed.
-                        $profile = $sender->localProfile();
-                        if ($profile->isMember($group)) {
-                            $groups[] = $group->id;
-                        } else {
-                            common_log(LOG_DEBUG, "Skipping reply to local group $group->nickname as sender $profile->id is not a member");
-                        }
-                    } catch (NoProfileException $e) {
-                        // Sender has no profile! Do some garbage collection, please.
+                    // Deliver to all members of this local group if allowed.
+                    if ($sender->isMember($group)) {
+                        $groups[] = $group->id;
+                    } else {
+                        common_log(LOG_DEBUG, sprintf('Skipping reply to local group %s as sender %d is not a member', $group->getNickname(), $sender->id));
                     }
                     continue;
                 } else {
@@ -987,7 +978,7 @@ class Ostatus_profile extends Managed_DataObject
      * @throws Exception on various error conditions
      * @throws OStatusShadowException if this reference would obscure a local user/group
      */
-    public static function ensureProfileURL($profile_url, $hints=array())
+    public static function ensureProfileURL($profile_url, array $hints=array())
     {
         $oprofile = self::getFromProfileURL($profile_url);
 
@@ -1082,17 +1073,17 @@ class Ostatus_profile extends Managed_DataObject
             return null;
         }
 
-        // Is it a known Ostatus profile?
-        $oprofile = Ostatus_profile::getKV('profile_id', $profile->id);
-        if ($oprofile instanceof Ostatus_profile) {
+        try {
+            $oprofile = self::getFromProfile($profile);
+            // We found the profile, return it!
             return $oprofile;
-        }
-
-        // Is it a local user?
-        $user = User::getKV('id', $profile->id);
-        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}'.");
+        } catch (NoResultException $e) {
+            // Could not find an OStatus profile, is it instead a local user?
+            $user = User::getKV('id', $profile->id);
+            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}'.");
+            }
         }
 
         // Continue discovery; it's a remote profile
@@ -1102,6 +1093,16 @@ class Ostatus_profile extends Managed_DataObject
         return null;
     }
 
+    static function getFromProfile(Profile $profile)
+    {
+        $oprofile = new Ostatus_profile();
+        $oprofile->profile_id = $profile->id;
+        if (!$oprofile->find(true)) {
+            throw new NoResultException($oprofile);
+        }
+        return $oprofile;
+    }
+
     /**
      * Look up and if necessary create an Ostatus_profile for remote entity
      * with the given update feed. This should never return null -- you will
@@ -1153,7 +1154,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return Ostatus_profile
      * @throws Exception
      */
-    public static function ensureAtomFeed($feedEl, $hints)
+    public static function ensureAtomFeed(DOMElement $feedEl, array $hints)
     {
         $author = ActivityUtils::getFeedAuthor($feedEl);
 
@@ -1243,11 +1244,11 @@ class Ostatus_profile extends Managed_DataObject
 
         // @todo FIXME: This should be better encapsulated
         // ripped from oauthstore.php (for old OMB client)
-        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
+        $temp_filename = tempnam(common_get_temp_dir(), 'listener_avatar');
         try {
             if (!copy($url, $temp_filename)) {
                 // TRANS: Server exception. %s is a URL.
-                throw new ServerException(sprintf(_m('Unable to fetch avatar from %s.'), $url));
+                throw new ServerException(sprintf(_m('Unable to fetch avatar from %s to %s.'), $url, $temp_filename));
             }
 
             if ($this->isGroup()) {
@@ -1288,7 +1289,7 @@ class Ostatus_profile extends Managed_DataObject
      * @param array $hints
      * @return mixed URL string or false
      */
-    public static function getActivityObjectAvatar($object, $hints=array())
+    public static function getActivityObjectAvatar(ActivityObject $object, array $hints=array())
     {
         if ($object->avatarLinks) {
             $best = false;
@@ -1317,7 +1318,7 @@ class Ostatus_profile extends Managed_DataObject
      * @param DOMElement $feed
      * @return string
      */
-    protected static function getAvatar($actor, $feed)
+    protected static function getAvatar(ActivityObject $actor, DOMElement $feed)
     {
         $url = '';
         $icon = '';
@@ -1368,7 +1369,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return Ostatus_profile
      * @throws Exception
      */
-    public static function ensureActorProfile($activity, $hints=array())
+    public static function ensureActorProfile(Activity $activity, array $hints=array())
     {
         return self::ensureActivityObjectProfile($activity->actor, $hints);
     }
@@ -1384,7 +1385,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return Ostatus_profile
      * @throws Exception
      */
-    public static function ensureActivityObjectProfile($object, $hints=array())
+    public static function ensureActivityObjectProfile(ActivityObject $object, array $hints=array())
     {
         $profile = self::getActivityObjectProfile($object);
         if ($profile instanceof Ostatus_profile) {
@@ -1400,7 +1401,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return mixed matching Ostatus_profile or false if none known
      * @throws ServerException if feed info invalid
      */
-    public static function getActorProfile($activity)
+    public static function getActorProfile(Activity $activity)
     {
         return self::getActivityObjectProfile($activity->actor);
     }
@@ -1410,7 +1411,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return mixed matching Ostatus_profile or false if none known
      * @throws ServerException if feed info invalid
      */
-    protected static function getActivityObjectProfile($object)
+    protected static function getActivityObjectProfile(ActivityObject $object)
     {
         $uri = self::getActivityObjectProfileURI($object);
         return Ostatus_profile::getKV('uri', $uri);
@@ -1425,7 +1426,7 @@ class Ostatus_profile extends Managed_DataObject
      * @return string
      * @throws ServerException if feed info invalid
      */
-    protected static function getActivityObjectProfileURI($object)
+    protected static function getActivityObjectProfileURI(ActivityObject $object)
     {
         if ($object->id) {
             if (ActivityUtils::validateUri($object->id)) {
@@ -1458,7 +1459,7 @@ class Ostatus_profile extends Managed_DataObject
      *
      * @return Ostatus_profile
      */
-    protected static function createActivityObjectProfile($object, $hints=array())
+    protected static function createActivityObjectProfile(ActivityObject $object, array $hints=array())
     {
         $homeuri = $object->id;
         $discover = false;
@@ -1623,7 +1624,7 @@ class Ostatus_profile extends Managed_DataObject
      * @param ActivityObject $object
      * @param array $hints
      */
-    public function updateFromActivityObject($object, $hints=array())
+    public function updateFromActivityObject(ActivityObject $object, array $hints=array())
     {
         if ($this->isGroup()) {
             $group = $this->localGroup();
@@ -1646,7 +1647,7 @@ class Ostatus_profile extends Managed_DataObject
         }
     }
 
-    public static function updateProfile($profile, $object, $hints=array())
+    public static function updateProfile(Profile $profile, ActivityObject $object, array $hints=array())
     {
         $orig = clone($profile);
 
@@ -1711,7 +1712,7 @@ class Ostatus_profile extends Managed_DataObject
         }
     }
 
-    protected static function updateGroup(User_group $group, $object, $hints=array())
+    protected static function updateGroup(User_group $group, ActivityObject $object, array $hints=array())
     {
         $orig = clone($group);
 
@@ -1735,7 +1736,7 @@ class Ostatus_profile extends Managed_DataObject
         }
     }
 
-    protected static function updatePeopletag($tag, $object, $hints=array()) {
+    protected static function updatePeopletag(Peopletag $tag, ActivityObject $object, array $hints=array()) {
         $orig = clone($tag);
 
         $tag->tag = $object->title;
@@ -1959,7 +1960,9 @@ class Ostatus_profile extends Managed_DataObject
         }
 
         // If we got a feed URL, try that
+        $feedUrl = null;
         if (array_key_exists('feedurl', $hints)) {
+            $feedUrl = $hints['feedurl'];
             try {
                 common_log(LOG_INFO, "Discovery on acct:$addr with feed URL " . $hints['feedurl']);
                 $oprofile = self::ensureFeedURL($hints['feedurl'], $hints);
@@ -1972,7 +1975,9 @@ class Ostatus_profile extends Managed_DataObject
         }
 
         // If we got a profile page, try that!
+        $profileUrl = null;
         if (array_key_exists('profileurl', $hints)) {
+            $profileUrl = $hints['profileurl'];
             try {
                 common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl");
                 $oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
@@ -2009,7 +2014,7 @@ class Ostatus_profile extends Managed_DataObject
             $profile->nickname = self::nicknameFromUri($uri);
             $profile->created  = common_sql_now();
 
-            if (isset($profileUrl)) {
+            if (!is_null($profileUrl)) {
                 $profile->profileurl = $profileUrl;
             }
 
@@ -2028,13 +2033,14 @@ class Ostatus_profile extends Managed_DataObject
             $oprofile->profile_id = $profile_id;
             $oprofile->created    = common_sql_now();
 
-            if (isset($feedUrl)) {
-                $profile->feeduri = $feedUrl;
+            if (!is_null($feedUrl)) {
+                $oprofile->feeduri = $feedUrl;
             }
 
             $result = $oprofile->insert();
 
             if ($result === false) {
+                $profile->delete();
                 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));
@@ -2135,7 +2141,7 @@ class Ostatus_profile extends Managed_DataObject
         return $oprofile;
     }
 
-    function checkAuthorship($activity)
+    public function checkAuthorship(Activity $activity)
     {
         if ($this->isGroup() || $this->isPeopletag()) {
             // A group or propletag feed will contain posts from multiple authors.
@@ -2150,7 +2156,7 @@ class Ostatus_profile extends Managed_DataObject
         } else {
             $actor = $activity->actor;
 
-            if (empty($actor)) {
+            if (!$actor instanceof Profile) {
                 // OK here! assume the default
             } else if ($actor->id == $this->getUri() || $actor->link == $this->getUri()) {
                 $this->updateFromActivityObject($actor);
@@ -2170,7 +2176,7 @@ class Ostatus_profile extends Managed_DataObject
             $oprofile = $this;
         }
 
-        return $oprofile;
+        return $oprofile->localProfile();
     }
 }