diff --git a/actions/inbox/Create.php b/actions/inbox/Create.php index 8af2755..d3a5310 100755 --- a/actions/inbox/Create.php +++ b/actions/inbox/Create.php @@ -84,7 +84,7 @@ if (isset($data->object->cc) && is_array($data->object->cc)) { try { $to_profiles = array_merge($to_profiles, $discovery->lookup($cc_url)); } catch (Exception $e) { - // Invalid actor found, just let it go. + // Invalid actor found, just let it go. // TODO: Fallback to OStatus } } } elseif (empty($data->object->cc) || in_array($data->object->cc, $public_to)) { @@ -93,7 +93,7 @@ if (isset($data->object->cc) && is_array($data->object->cc)) { try { $to_profiles = array_merge($to_profiles, $discovery->lookup($data->object->cc)); } catch (Exception $e) { - // Invalid actor found, just let it go. + // Invalid actor found, just let it go. // TODO: Fallback to OStatus } } diff --git a/classes/Activitypub_attachment.php b/classes/Activitypub_attachment.php index 0357d1b..f053f0e 100755 --- a/classes/Activitypub_attachment.php +++ b/classes/Activitypub_attachment.php @@ -50,26 +50,19 @@ class Activitypub_attachment extends Managed_DataObject public static function attachment_to_array($attachment) { $res = [ - '@context' => [ - "https://www.w3.org/ns/activitystreams", - [ - "@language" => "en" - ] - ], - 'id' => $attachment->getID(), - 'mimetype' => $attachment->mimetype, - 'url' => $attachment->getUrl(), - 'size' => intval($attachment->size), // $attachment->getSize () - 'title' => $attachment->getTitle(), - 'meta' => null - ]; + 'type' => 'Document', + 'mediaType' => $attachment->mimetype, + 'url' => $attachment->getUrl(), + 'size' => intval($attachment->size), // $attachment->getSize () + 'name' => $attachment->getTitle(), + ]; // Image - if (substr($res["mimetype"], 0, 5) == "image") { + if (substr($res["mediaType"], 0, 5) == "image") { $res["meta"]= [ - 'width' => $attachment->width, - 'height' => $attachment->height - ]; + 'width' => $attachment->width, + 'height' => $attachment->height + ]; } return $res; diff --git a/classes/Activitypub_profile.php b/classes/Activitypub_profile.php index b3f8d37..b628562 100755 --- a/classes/Activitypub_profile.php +++ b/classes/Activitypub_profile.php @@ -120,8 +120,10 @@ class Activitypub_profile extends Managed_DataObject 'attachment' => [], 'icon' => [ 'type' => 'Image', - 'mediaType' => 'image/jpeg', - 'url' => $profile->avatarUrl() + 'mediaType' => 'image/png', + 'height' => AVATAR_PROFILE_SIZE, + 'width' => AVATAR_PROFILE_SIZE, + 'url' => $profile->avatarUrl(AVATAR_PROFILE_SIZE) ] ]; diff --git a/utils/explorer.php b/utils/explorer.php index f010878..829a2c6 100755 --- a/utils/explorer.php +++ b/utils/explorer.php @@ -241,9 +241,70 @@ class Activitypub_explorer $apRSA->public_key = $res['publicKey']['publicKeyPem']; $apRSA->store_keys(); + // Avatar + if (isset($res['icon']['url'])) { + $this->_store_avatar($profile, $res['icon']['url']); + } + return $profile; } + /** + * Download and update given avatar image + * + * @author GNU Social + * @param string $url + * @return Avatar The Avatar we have on disk. (seldom used) + * @throws Exception in various failure cases + */ + private function _store_avatar($profile, $url) + { + if (!common_valid_http_url($url)) { + // TRANS: Server exception. %s is a URL. + throw new ServerException(sprintf('Invalid avatar URL %s.'), $url); + } + + // @todo FIXME: This should be better encapsulated + // ripped from oauthstore.php (for old OMB client) + $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); + try { + $imgData = HTTPClient::quickGet($url); + // Make sure it's at least an image file. ImageFile can do the rest. + if (false === getimagesizefromstring($imgData)) { + throw new UnsupportedMediaException('Downloaded group avatar was not an image.'); + } + file_put_contents($temp_filename, $imgData); + unset($imgData); // No need to carry this in memory. + + $id = $profile->getID(); + + $imagefile = new ImageFile(null, $temp_filename); + $filename = Avatar::filename($id, + image_type_to_extension($imagefile->type), + null, + common_timestamp()); + rename($temp_filename, Avatar::path($filename)); + } catch (Exception $e) { + unlink($temp_filename); + throw $e; + } + // @todo FIXME: Hardcoded chmod is lame, but seems to be necessary to + // keep from accidentally saving images from command-line (queues) + // that can't be read from web server, which causes hard-to-notice + // problems later on: + // + // http://status.net/open-source/issues/2663 + chmod(Avatar::path($filename), 0644); + + $profile->setOriginal($filename); + + $orig = clone($profile); + $profile->avatar = $url; + $profile->update($orig); + + return Avatar::getUploaded($profile); + } + /** * Validates a remote response in order to determine whether this * response is a valid profile or not