Fixed fetching private local images

This commit is contained in:
Michael 2021-07-03 15:29:27 +00:00
parent a0772c91d0
commit c72abe48a8
3 changed files with 62 additions and 7 deletions

View file

@ -28,8 +28,10 @@ use Friendica\Database\Database;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Item; use Friendica\Model\Item;
use Friendica\Model\Photo;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Util\Images; use Friendica\Util\Images;
use Friendica\Util\Network;
use Friendica\Util\ParseUrl; use Friendica\Util\ParseUrl;
use Friendica\Util\Proxy; use Friendica\Util\Proxy;
use Friendica\Util\Strings; use Friendica\Util\Strings;
@ -158,6 +160,10 @@ class Media
*/ */
public static function fetchAdditionalData(array $media) public static function fetchAdditionalData(array $media)
{ {
if (Network::isLocalLink($media['url'])) {
$media = self::fetchLocalData($media);
}
// Fetch the mimetype or size if missing. // Fetch the mimetype or size if missing.
if (empty($media['mimetype']) || empty($media['size'])) { if (empty($media['mimetype']) || empty($media['size'])) {
$timeout = DI::config()->get('system', 'xrd_timeout'); $timeout = DI::config()->get('system', 'xrd_timeout');
@ -216,6 +222,36 @@ class Media
return $media; return $media;
} }
/**
* Fetch media data from local resources
* @param array $media
* @return array media with added data
*/
private static function fetchLocalData(array $media)
{
if (!preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $media['url'], $matches)) {
return $media;
}
$photo = Photo::selectFirst([], ['resource-id' => $matches[1], 'scale' => $matches[2]]);
if (!empty($photo)) {
$media['mimetype'] = $photo['type'];
$media['size'] = $photo['datasize'];
$media['width'] = $photo['width'];
$media['height'] = $photo['height'];
}
if (!preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $media['preview'], $matches)) {
return $media;
}
$photo = Photo::selectFirst([], ['resource-id' => $matches[1], 'scale' => $matches[2]]);
if (!empty($photo)) {
$media['preview-width'] = $photo['width'];
$media['preview-height'] = $photo['height'];
}
return $media;
}
/** /**
* Add the detected type to the media array * Add the detected type to the media array
* *

View file

@ -38,6 +38,7 @@ use Friendica\DI;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
use Friendica\Protocol\Diaspora; use Friendica\Protocol\Diaspora;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPSignature;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Strings; use Friendica\Util\Strings;
@ -828,11 +829,11 @@ class Profile
// Try to find the public contact entry of the visitor. // Try to find the public contact entry of the visitor.
$cid = Contact::getIdForURL($handle); $cid = Contact::getIdForURL($handle);
if (!$cid) { if (!$cid) {
Logger::log('unable to finger ' . $handle, Logger::DEBUG); Logger::info('Handle not found', ['handle' => $handle]);
return []; return [];
} }
$visitor = DBA::selectFirst('contact', [], ['id' => $cid]); $visitor = Contact::getById($cid);
// Authenticate the visitor. // Authenticate the visitor.
$_SESSION['authenticated'] = 1; $_SESSION['authenticated'] = 1;
@ -851,6 +852,19 @@ class Profile
return $visitor; return $visitor;
} }
/**
* Set the visitor cookies (see remote_user()) for signed HTTP requests
* @return array Visitor contact array
*/
public static function addVisitorCookieForHTTPSigner()
{
$requester = HTTPSignature::getSigner('', $_SERVER);
if (empty($requester)) {
return [];
}
return Profile::addVisitorCookieForHandle($requester);
}
/** /**
* OpenWebAuth authentication. * OpenWebAuth authentication.
* *

View file

@ -33,8 +33,8 @@ use Friendica\Model\Storage\ExternalResource;
use Friendica\Model\Storage\SystemResource; use Friendica\Model\Storage\SystemResource;
use Friendica\Util\Proxy; use Friendica\Util\Proxy;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Util\HTTPSignature;
use Friendica\Util\Images; use Friendica\Util\Images;
use Friendica\Util\Network;
/** /**
* Photo Module * Photo Module
@ -67,10 +67,7 @@ class Photo extends BaseModule
exit; exit;
} }
$requester = HTTPSignature::getSigner('', $_SERVER); Profile::addVisitorCookieForHTTPSigner();
if (!empty($requester)) {
Profile::addVisitorCookieForHandle($requester);
}
$customsize = 0; $customsize = 0;
$square_resize = true; $square_resize = true;
@ -193,6 +190,10 @@ class Photo extends BaseModule
return false; return false;
} }
if (Network::isLocalLink($url) && preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $url, $matches)) {
return MPhoto::getPhoto($matches[1], $matches[2]);
}
return MPhoto::createPhotoForExternalResource($url, (int)local_user()); return MPhoto::createPhotoForExternalResource($url, (int)local_user());
case "media": case "media":
$media = DBA::selectFirst('post-media', ['url', 'uri-id'], ['id' => $uid, 'type' => Post\Media::IMAGE]); $media = DBA::selectFirst('post-media', ['url', 'uri-id'], ['id' => $uid, 'type' => Post\Media::IMAGE]);
@ -200,6 +201,10 @@ class Photo extends BaseModule
return false; return false;
} }
if (Network::isLocalLink($media['url']) && preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $media['url'], $matches)) {
return MPhoto::getPhoto($matches[1], $matches[2]);
}
return MPhoto::createPhotoForExternalResource($media['url'], (int)local_user()); return MPhoto::createPhotoForExternalResource($media['url'], (int)local_user());
case "contact": case "contact":
$contact = Contact::getById($uid, ['uid', 'url', 'avatar', 'photo', 'xmpp', 'addr']); $contact = Contact::getById($uid, ['uid', 'url', 'avatar', 'photo', 'xmpp', 'addr']);