X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Factivityutils.php;h=d4c01232ec283e8e97ae5d54dcb96040de37df60;hb=refs%2Fheads%2Fsazius-nightly;hp=3aa09deb4e7761f7812a0007506726d3f26baf02;hpb=b7d07466943a73e1c009467c8daa6e499810080f;p=quix0rs-gnu-social.git diff --git a/lib/activityutils.php b/lib/activityutils.php index 3aa09deb4e..d4c01232ec 100644 --- a/lib/activityutils.php +++ b/lib/activityutils.php @@ -104,8 +104,9 @@ class ActivityUtils { $els = $element->childNodes; $out = array(); - - foreach ($els as $link) { + + for ($i = 0; $i < $els->length; $i++) { + $link = $els->item($i); if ($link->localName == self::LINK && $link->namespaceURI == self::ATOM) { $linkRel = $link->getAttribute(self::REL); $linkType = $link->getAttribute(self::TYPE); @@ -144,6 +145,34 @@ class ActivityUtils } } + /** + * Gets all immediate child elements with the given tag + * + * @param DOMElement $element element to pick at + * @param string $tag tag to look for + * @param string $namespace Namespace to look under + * + * @return array found element or null + */ + + static function children(DOMNode $element, $tag, $namespace=self::ATOM) + { + $results = array(); + + $els = $element->childNodes; + + if (!empty($els) && $els->length > 0) { + for ($i = 0; $i < $els->length; $i++) { + $el = $els->item($i); + if ($el->localName == $tag && $el->namespaceURI == $namespace) { + $results[] = $el; + } + } + } + + return $results; + } + /** * Grab the text content of a DOM element child of the current element * @@ -317,4 +346,101 @@ class ActivityUtils return null; } + + static function compareTypes($type, $objects) // this does verbs too! + { + $type = self::resolveUri($type); + foreach ((array)$objects as $object) { + if ($type === self::resolveUri($object)) { + return true; + } + } + return false; + } + + static function resolveUri($uri, $make_relative=false) + { + if (empty($uri)) { + throw new ServerException('No URI to resolve in ActivityUtils::resolveUri'); + } + + if (!$make_relative && parse_url($uri, PHP_URL_SCHEME) == '') { // relative -> absolute + $uri = Activity::SCHEMA . $uri; + } elseif ($make_relative) { // absolute -> relative + $uri = basename($uri); //preg_replace('/^http:\/\/activitystrea\.ms\/schema\/1\.0\//', '', $uri); + } // absolute schemas pass through unharmed + + return $uri; + } + + static function findLocalObject(array $uris, $type=ActivityObject::NOTE) { + $object = null; + // TODO: Extend this in plugins etc. + if (Event::handle('StartFindLocalActivityObject', array($uris, $type, &$object))) { + switch (self::resolveUri($type)) { + case ActivityObject::PERSON: + // GROUP will also be here in due time... + $object = new Profile(); + break; + default: + $object = new Notice(); + } + } + foreach (array_unique($uris) as $uri) { + try { + // the exception thrown will cancel before reaching $object + $object = call_user_func(array($object, 'fromUri'), $uri); + break; + } catch (Exception $e) { + common_debug('Could not find local activity object from uri: '.$uri); + } + } + if (!empty($object)) { + Event::handle('EndFindLocalActivityObject', array($object->getUri(), $type, $object)); + } else { + throw new ServerException('Could not find any activityobject stored locally with given URI'); + } + return $object; + } + + // Check authorship by supplying a Profile as a default and letting plugins + // set it to something else if the activity's author is actually someone + // else (like with a group or peopletag feed as handled in OStatus). + // + // NOTE: Returned is not necessarily the supplied profile! For example, + // the "feed author" may be a group, but the "activity author" is a person! + static function checkAuthorship(Activity $activity, Profile $profile) + { + if (Event::handle('CheckActivityAuthorship', array($activity, &$profile))) { + // if (empty($activity->actor)), then we generated this Activity ourselves and can trust $profile + + $actor_uri = $profile->getUri(); + + if (!in_array($actor_uri, array($activity->actor->id, $activity->actor->link))) { + // A mismatch between our locally stored URI and the supplied author? + // Probably not more than a blog feed or something (with multiple authors or so) + // but log it for future inspection. + common_log(LOG_WARNING, "Got an actor '{$activity->actor->title}' ({$activity->actor->id}) on single-user feed for " . $actor_uri); + } elseif (empty($activity->actor->id)) { + // Plain without ActivityStreams actor info. + // We'll just ignore this info for now and save the update under the feed's identity. + } + } + + if (!$profile instanceof Profile) { + throw new ServerException('Could not get an author Profile for activity'); + } + + return $profile; + } + + static public function typeToTitle($type) + { + return ucfirst(self::resolveUri($type, true)); + } + + static public function verbToTitle($verb) + { + return ucfirst(self::resolveUri($verb, true)); + } }