Add Attachments to remote notices
Fix Delete Notice
This commit is contained in:
		@@ -55,6 +55,8 @@ const ACTIVITYPUB_PUBLIC_TO = ['https://www.w3.org/ns/activitystreams#Public',
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
class ActivityPubPlugin extends Plugin
 | 
					class ActivityPubPlugin extends Plugin
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    public static $store_images_from_remote_notes_attachments = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Returns a Actor's URI from its local $profile
 | 
					     * Returns a Actor's URI from its local $profile
 | 
				
			||||||
     * Works both for local and remote users.
 | 
					     * Works both for local and remote users.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,6 +51,9 @@ if (isset($res['latitude'])) {
 | 
				
			|||||||
if (isset($res['longitude'])) {
 | 
					if (isset($res['longitude'])) {
 | 
				
			||||||
    $settings['longitude'] = $res['longitude'];
 | 
					    $settings['longitude'] = $res['longitude'];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					if (isset($res['attachment'])) {
 | 
				
			||||||
 | 
					    $settings['attachment'] = $res['attachment'];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try {
 | 
					try {
 | 
				
			||||||
    Activitypub_notice::create_notice(
 | 
					    Activitypub_notice::create_notice(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ if (!defined('GNUSOCIAL')) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try {
 | 
					try {
 | 
				
			||||||
    $notice = ActivityPubPlugin::grab_notice_from_url($data['object']['id']);
 | 
					    $notice = ActivityPubPlugin::grab_notice_from_url($data['object']);
 | 
				
			||||||
    $notice->deleteAs($actor_profile);
 | 
					    $notice->deleteAs($actor_profile);
 | 
				
			||||||
    ActivityPubReturn::answer();
 | 
					    ActivityPubReturn::answer();
 | 
				
			||||||
} catch (Exception $e) {
 | 
					} catch (Exception $e) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,13 +47,13 @@ class Activitypub_delete extends Managed_DataObject
 | 
				
			|||||||
     * @param array $object
 | 
					     * @param array $object
 | 
				
			||||||
     * @return pretty array to be used in a response
 | 
					     * @return pretty array to be used in a response
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static function delete_to_array($object)
 | 
					    public static function delete_to_array($actor, $object)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $res = [
 | 
					        $res = [
 | 
				
			||||||
            '@context' => 'https://www.w3.org/ns/activitystreams',
 | 
					            '@context' => 'https://www.w3.org/ns/activitystreams',
 | 
				
			||||||
            'id'     => $object['id'].'/delete',
 | 
					            'id'     => $object.'/delete',
 | 
				
			||||||
            'type'   => 'Delete',
 | 
					            'type'   => 'Delete',
 | 
				
			||||||
            'actor'  => $object['actor'],
 | 
					            'actor'  => $actor,
 | 
				
			||||||
            'object' => $object
 | 
					            'object' => $object
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        return $res;
 | 
					        return $res;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,7 +116,7 @@ class Activitypub_notice extends Managed_DataObject
 | 
				
			|||||||
     * @param string $url
 | 
					     * @param string $url
 | 
				
			||||||
     * @param string $content
 | 
					     * @param string $content
 | 
				
			||||||
     * @param array|string $cc
 | 
					     * @param array|string $cc
 | 
				
			||||||
     * @param array $settings possible keys: ['inReplyTo', 'latitude', 'longitude']
 | 
					     * @param array $settings possible keys: ['inReplyTo', 'latitude', 'longitude', 'attachment']
 | 
				
			||||||
     * @return Notice
 | 
					     * @return Notice
 | 
				
			||||||
     * @throws Exception
 | 
					     * @throws Exception
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -126,8 +126,44 @@ class Activitypub_notice extends Managed_DataObject
 | 
				
			|||||||
        $act->verb = ActivityVerb::POST;
 | 
					        $act->verb = ActivityVerb::POST;
 | 
				
			||||||
        $act->time = time();
 | 
					        $act->time = time();
 | 
				
			||||||
        $act->actor = $actor_profile->asActivityObject();
 | 
					        $act->actor = $actor_profile->asActivityObject();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        $act->context = new ActivityContext();
 | 
					        $act->context = new ActivityContext();
 | 
				
			||||||
 | 
					        $options = ['source' => 'ActivityPub', 'uri' => $id, 'url' => $url];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Do we have an attachment?
 | 
				
			||||||
 | 
					        if (isset($settings['attachment'][0])) {
 | 
				
			||||||
 | 
					            $attach = $settings['attachment'][0];
 | 
				
			||||||
 | 
					            $attach_url = $settings['attachment'][0]['url'];
 | 
				
			||||||
 | 
					            // Is it an image?
 | 
				
			||||||
 | 
					            if (ActivityPubPlugin::$store_images_from_remote_notes_attachments && substr($attach["mediaType"], 0, 5) == "image") {
 | 
				
			||||||
 | 
					                $temp_filename = tempnam(sys_get_temp_dir(), 'apCreateNoteAttach_');
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    $imgData = HTTPClient::quickGet($attach_url);
 | 
				
			||||||
 | 
					                    // Make sure it's at least an image file. ImageFile can do the rest.
 | 
				
			||||||
 | 
					                    if (false === getimagesizefromstring($imgData)) {
 | 
				
			||||||
 | 
					                        common_debug('ActivityPub Create Notice: Failed because the downloaded image: '.$attach_url. 'is not valid.');
 | 
				
			||||||
 | 
					                        throw new UnsupportedMediaException('Downloaded image was not an image.');
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    file_put_contents($temp_filename, $imgData);
 | 
				
			||||||
 | 
					                    unset($imgData);    // No need to carry this in memory.
 | 
				
			||||||
 | 
					                    common_debug('ActivityPub Create Notice: Stored dowloaded image in: '.$temp_filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $id = $actor_profile->getID();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $imagefile = new ImageFile(null, $temp_filename);
 | 
				
			||||||
 | 
					                    $filename = hash(File::FILEHASH_ALG, $imgData).image_type_to_extension($imagefile->type);
 | 
				
			||||||
 | 
					                    rename($temp_filename, File::path($filename));
 | 
				
			||||||
 | 
					                    common_debug('ActivityPub Create Notice: Moved image from: '.$temp_filename.' to '.$filename);
 | 
				
			||||||
 | 
					                    $mediaFile = new MediaFile($filename, $attach['mediaType']);
 | 
				
			||||||
 | 
					                    $act->enclosures[] = $mediaFile->getEnclosure();
 | 
				
			||||||
 | 
					                } catch (Exception $e) {
 | 
				
			||||||
 | 
					                    common_debug('ActivityPub Create Notice: Something went wrong while processing the image from: '.$attach_url.' details: '.$e->getMessage());
 | 
				
			||||||
 | 
					                    unlink($temp_filename);
 | 
				
			||||||
 | 
					                    $content .= ($content==='' ? '' : ' ') . $attach_url;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                $content .= ($content==='' ? '' : ' ') . $attach_url;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Is this a reply?
 | 
					        // Is this a reply?
 | 
				
			||||||
        if (isset($settings['inReplyTo'])) {
 | 
					        if (isset($settings['inReplyTo'])) {
 | 
				
			||||||
@@ -181,8 +217,6 @@ class Activitypub_notice extends Managed_DataObject
 | 
				
			|||||||
            //throw new Exception('That\'s too long. Maximum notice size is %d character.');
 | 
					            //throw new Exception('That\'s too long. Maximum notice size is %d character.');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $options = ['source' => 'ActivityPub', 'uri' => $id, 'url' => $url];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $actobj = new ActivityObject();
 | 
					        $actobj = new ActivityObject();
 | 
				
			||||||
        $actobj->type = ActivityObject::NOTE;
 | 
					        $actobj->type = ActivityObject::NOTE;
 | 
				
			||||||
        $actobj->content = strip_tags($content, '<p><b><i><u><a><ul><ol><li>');
 | 
					        $actobj->content = strip_tags($content, '<p><b><i><u><a><ul><ol><li>');
 | 
				
			||||||
@@ -191,7 +225,11 @@ class Activitypub_notice extends Managed_DataObject
 | 
				
			|||||||
        $act->objects[] = $actobj;
 | 
					        $act->objects[] = $actobj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            return Notice::saveActivity($act, $actor_profile, $options);
 | 
					            $note = Notice::saveActivity($act, $actor_profile, $options);
 | 
				
			||||||
 | 
					            if (ActivityPubPlugin::$store_images_from_remote_notes_attachments && isset($mediaFile)) {
 | 
				
			||||||
 | 
					                $mediaFile->attachToNotice($note);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return $note;
 | 
				
			||||||
        } catch (Exception $e) {
 | 
					        } catch (Exception $e) {
 | 
				
			||||||
            throw $e;
 | 
					            throw $e;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -294,7 +294,7 @@ class Activitypub_explorer
 | 
				
			|||||||
            $imgData = HTTPClient::quickGet($url);
 | 
					            $imgData = HTTPClient::quickGet($url);
 | 
				
			||||||
            // Make sure it's at least an image file. ImageFile can do the rest.
 | 
					            // Make sure it's at least an image file. ImageFile can do the rest.
 | 
				
			||||||
            if (false === getimagesizefromstring($imgData)) {
 | 
					            if (false === getimagesizefromstring($imgData)) {
 | 
				
			||||||
                common_debug('ActivityPub Explorer: Failed because the downloaded avatar: '.$url. 'is not a validad image.');
 | 
					                common_debug('ActivityPub Explorer: Failed because the downloaded avatar: '.$url. 'is not a valid image.');
 | 
				
			||||||
                throw new UnsupportedMediaException('Downloaded avatar was not an image.');
 | 
					                throw new UnsupportedMediaException('Downloaded avatar was not an image.');
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            file_put_contents($temp_filename, $imgData);
 | 
					            file_put_contents($temp_filename, $imgData);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -244,15 +244,18 @@ class Activitypub_postman
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function delete($notice)
 | 
					    public function delete($notice)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $data = Activitypub_delete::delete_to_array(Activitypub_notice::notice_to_array($notice));
 | 
					        $data = Activitypub_delete::delete_to_array(
 | 
				
			||||||
 | 
					                    ActivityPubPlugin::actor_uri($notice->getProfile()),
 | 
				
			||||||
 | 
					                    $notice->getUrl()
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
        $errors = [];
 | 
					        $errors = [];
 | 
				
			||||||
        $data = json_encode($data, JSON_UNESCAPED_SLASHES);
 | 
					        $data = json_encode($data, JSON_UNESCAPED_SLASHES);
 | 
				
			||||||
        foreach ($this->to_inbox() as $inbox) {
 | 
					        foreach ($this->to_inbox() as $inbox) {
 | 
				
			||||||
            $res = $this->send($data, $inbox);
 | 
					            $res = $this->send($data, $inbox);
 | 
				
			||||||
            if (!$res->getStatusCode() == 200) {
 | 
					            if (!$res->getStatusCode() == 200) {
 | 
				
			||||||
                $res_body = json_decode($res->getBody()->getContents());
 | 
					                $res_body = json_decode($res->getBody()->getContents(), true);
 | 
				
			||||||
                if (isset($res_body[0]->error)) {
 | 
					                if (isset($res_body[0]['error'])) {
 | 
				
			||||||
                    $errors[] = ($res_body[0]->error);
 | 
					                    $errors[] = ($res_body[0]['error']);
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                $errors[] = ("An unknown error occurred.");
 | 
					                $errors[] = ("An unknown error occurred.");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user