Update AP Helpers, fixes #3287

This commit is contained in:
Daniel Supernault 2022-03-03 21:55:15 -07:00
parent 3e670774c0
commit b78bff72db
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7

View file

@ -71,11 +71,25 @@ class Helpers {
$mimeTypes = explode(',', config_cache('pixelfed.media_types')); $mimeTypes = explode(',', config_cache('pixelfed.media_types'));
$mediaTypes = in_array('video/mp4', $mimeTypes) ? ['Document', 'Image', 'Video'] : ['Document', 'Image']; $mediaTypes = in_array('video/mp4', $mimeTypes) ? ['Document', 'Image', 'Video'] : ['Document', 'Image'];
// Peertube
// $mediaTypes = in_array('video/mp4', $mimeTypes) ? ['Document', 'Image', 'Video', 'Link'] : ['Document', 'Image'];
if(!isset($activity['attachment']) || empty($activity['attachment'])) { if(!isset($activity['attachment']) || empty($activity['attachment'])) {
return false; return false;
} }
// peertube
// $attachment = is_array($activity['url']) ?
// collect($activity['url'])
// ->filter(function($media) {
// return $media['type'] == 'Link' && $media['mediaType'] == 'video/mp4';
// })
// ->take(1)
// ->values()
// ->toArray()[0] : $activity['attachment'];
$attachment = $activity['attachment']; $attachment = $activity['attachment'];
$valid = Validator::make($attachment, [ $valid = Validator::make($attachment, [
'*.type' => [ '*.type' => [
'required', 'required',
@ -88,7 +102,7 @@ class Helpers {
'string', 'string',
Rule::in($mimeTypes) Rule::in($mimeTypes)
], ],
'*.name' => 'nullable|string|max:255' '*.name' => 'sometimes|nullable|string|max:255'
])->passes(); ])->passes();
return $valid; return $valid;
@ -247,6 +261,19 @@ class Helpers {
return self::fetchFromUrl($url); return self::fetchFromUrl($url);
} }
public static function pluckval($val)
{
if(is_string($val)) {
return $val;
}
if(is_array($val)) {
return !empty($val) ? $val[0] : null;
}
return null;
}
public static function statusFirstOrFetch($url, $replyTo = false) public static function statusFirstOrFetch($url, $replyTo = false)
{ {
$url = self::validateUrl($url); $url = self::validateUrl($url);
@ -330,7 +357,7 @@ class Helpers {
} }
} }
$id = isset($res['id']) ? $res['id'] : $url; $id = isset($res['id']) ? self::pluckval($res['id']) : self::pluckval($url);
$idDomain = parse_url($id, PHP_URL_HOST); $idDomain = parse_url($id, PHP_URL_HOST);
$urlDomain = parse_url($url, PHP_URL_HOST); $urlDomain = parse_url($url, PHP_URL_HOST);
@ -338,9 +365,20 @@ class Helpers {
return; return;
} }
if(isset($activity['object']['attributedTo'])) { $attributedTo = is_string($activity['object']['attributedTo']) ?
$actorDomain = parse_url($activity['object']['attributedTo'], PHP_URL_HOST); $activity['object']['attributedTo'] :
if(!self::validateUrl($activity['object']['attributedTo']) || (is_array($activity['object']['attributedTo']) ?
collect($activity['object']['attributedTo'])
->filter(function($o) {
return $o && isset($o['type']) && $o['type'] == 'Person';
})
->pluck('id')
->first() : null
);
if($attributedTo) {
$actorDomain = parse_url($attributedTo, PHP_URL_HOST);
if(!self::validateUrl($attributedTo) ||
$idDomain !== $actorDomain || $idDomain !== $actorDomain ||
$actorDomain !== $urlDomain $actorDomain !== $urlDomain
) )
@ -353,14 +391,14 @@ class Helpers {
return; return;
} }
$profile = self::profileFirstOrNew($activity['object']['attributedTo']); $profile = self::profileFirstOrNew($attributedTo);
if(isset($activity['object']['inReplyTo']) && !empty($activity['object']['inReplyTo']) || $replyTo == true) { if(isset($activity['object']['inReplyTo']) && !empty($activity['object']['inReplyTo']) || $replyTo == true) {
$reply_to = self::statusFirstOrFetch($activity['object']['inReplyTo'], false); $reply_to = self::statusFirstOrFetch(self::pluckval($activity['object']['inReplyTo']), false);
$reply_to = optional($reply_to)->id; $reply_to = optional($reply_to)->id;
} else { } else {
$reply_to = null; $reply_to = null;
} }
$ts = is_array($res['published']) ? $res['published'][0] : $res['published']; $ts = self::pluckval($res['published']);
if($scope == 'public' && in_array($urlDomain, InstanceService::getUnlistedDomains())) { if($scope == 'public' && in_array($urlDomain, InstanceService::getUnlistedDomains())) {
$scope = 'unlisted'; $scope = 'unlisted';
@ -399,8 +437,8 @@ class Helpers {
return DB::transaction(function() use($profile, $res, $url, $ts, $reply_to, $cw, $scope, $id) { return DB::transaction(function() use($profile, $res, $url, $ts, $reply_to, $cw, $scope, $id) {
$status = new Status; $status = new Status;
$status->profile_id = $profile->id; $status->profile_id = $profile->id;
$status->url = isset($res['url']) ? $res['url'] : $url; $status->url = isset($res['url']) && is_string($res['url']) ? $res['url'] : $url;
$status->uri = isset($res['url']) ? $res['url'] : $url; $status->uri = isset($res['url']) && is_string($res['url']) ? $res['url'] : $url;
$status->object_url = $id; $status->object_url = $id;
$status->caption = strip_tags($res['content']); $status->caption = strip_tags($res['content']);
$status->rendered = Purify::clean($res['content']); $status->rendered = Purify::clean($res['content']);
@ -486,10 +524,16 @@ class Helpers {
public static function importNoteAttachment($data, Status $status) public static function importNoteAttachment($data, Status $status)
{ {
if(self::verifyAttachments($data) == false) { if(self::verifyAttachments($data) == false) {
// \Log::info('importNoteAttachment::failedVerification.', [$data['id']]);
$status->viewType(); $status->viewType();
return; return;
} }
$attachments = isset($data['object']) ? $data['object']['attachment'] : $data['attachment']; $attachments = isset($data['object']) ? $data['object']['attachment'] : $data['attachment'];
// peertube
// if(!$attachments) {
// $obj = isset($data['object']) ? $data['object'] : $data;
// $attachments = is_array($obj['url']) ? $obj['url'] : null;
// }
$user = $status->profile; $user = $status->profile;
$storagePath = MediaPathService::get($user, 2); $storagePath = MediaPathService::get($user, 2);
$allowed = explode(',', config_cache('pixelfed.media_types')); $allowed = explode(',', config_cache('pixelfed.media_types'));