misuzu/public/user-assets.php

135 lines
4.6 KiB
PHP
Raw Normal View History

<?php
namespace Misuzu;
2019-10-02 19:02:22 +00:00
use Imagick;
2019-03-18 22:02:30 +00:00
$userAssetsMode = !empty($_GET['m']) && is_string($_GET['m']) ? (string)$_GET['m'] : '';
$misuzuBypassLockdown = $userAssetsMode === 'avatar';
require_once '../misuzu.php';
2019-03-18 22:03:40 +00:00
$userId = !empty($_GET['u']) && is_string($_GET['u']) ? (int)$_GET['u'] : 0;
$userExists = user_exists($userId);
$canViewImages = !$userExists
|| !user_warning_check_expiration($userId, MSZ_WARN_BAN)
|| (
parse_url($_SERVER['HTTP_REFERER'] ?? '', PHP_URL_PATH) === url('user-profile')
&& perms_check_user(MSZ_PERMS_USER, user_session_current('user_id', 0), MSZ_PERM_USER_MANAGE_USERS)
);
2019-06-10 17:04:53 +00:00
switch($userAssetsMode) {
case 'avatar':
2019-06-10 17:04:53 +00:00
if(!$canViewImages) {
$filename = Config::get('avatar.banned', Config::TYPE_STR, MSZ_ROOT . '/public/images/banned-avatar.png');
break;
}
$filename = Config::get('avatar.default', Config::TYPE_STR, MSZ_ROOT . '/public/images/no-avatar.png');
2019-06-10 17:04:53 +00:00
if(!$userExists) {
break;
}
2019-03-25 20:11:31 +00:00
$dimensions = MSZ_USER_AVATAR_RESOLUTION_DEFAULT;
// todo: find closest dimensions
2019-06-10 17:04:53 +00:00
if(isset($_GET['r']) && is_string($_GET['r']) && ctype_digit($_GET['r'])) {
2019-03-25 20:11:31 +00:00
$dimensions = user_avatar_resolution_closest((int)$_GET['r']);
}
$avatarFilename = sprintf('%d.msz', $userId);
2019-03-25 20:11:31 +00:00
$avatarOriginal = sprintf('%s/avatars/original/%s', MSZ_STORAGE, $avatarFilename);
2019-06-10 17:04:53 +00:00
if($dimensions === MSZ_USER_AVATAR_RESOLUTION_ORIGINAL) {
2019-03-25 20:11:31 +00:00
$filename = $avatarOriginal;
break;
}
$avatarStorage = sprintf('%1$s/avatars/%2$dx%2$d', MSZ_STORAGE, $dimensions);
$avatarCropped = sprintf('%s/%s', $avatarStorage, $avatarFilename);
2019-06-10 17:04:53 +00:00
if(is_file($avatarCropped)) {
$filename = $avatarCropped;
} else {
2019-06-10 17:04:53 +00:00
if(is_file($avatarOriginal)) {
try {
mkdirs($avatarStorage, true);
$avatarImage = new Imagick($avatarOriginal);
$avatarImage->setImageFormat($avatarImage->getNumberImages() > 1 ? 'gif' : 'png');
$avatarImage = $avatarImage->coalesceImages();
$avatarOriginalWidth = $avatarImage->getImageWidth();
$avatarOriginalHeight = $avatarImage->getImageHeight();
2019-06-10 17:04:53 +00:00
if($avatarOriginalWidth > $avatarOriginalHeight) {
$avatarWidth = $avatarOriginalWidth * $dimensions / $avatarOriginalHeight;
$avatarHeight = $dimensions;
} else {
$avatarWidth = $dimensions;
$avatarHeight = $avatarOriginalHeight * $dimensions / $avatarOriginalWidth;
}
do {
$avatarImage->resizeImage(
$avatarWidth,
$avatarHeight,
Imagick::FILTER_LANCZOS,
0.9
);
$avatarImage->cropImage(
$dimensions,
$dimensions,
($avatarWidth - $dimensions) / 2,
($avatarHeight - $dimensions) / 2
);
$avatarImage->setImagePage(
$dimensions,
$dimensions,
0,
0
);
2019-06-10 17:04:53 +00:00
} while($avatarImage->nextImage());
$avatarImage->deconstructImages()->writeImages($filename = $avatarCropped, true);
2019-06-10 17:04:53 +00:00
} catch(Exception $ex) {}
}
}
break;
case 'background':
2019-06-10 17:04:53 +00:00
if(!$canViewImages && !$userExists) {
break;
}
$backgroundStorage = sprintf('%s/backgrounds/original', MSZ_STORAGE);
$filename = sprintf('%s/%d.msz', $backgroundStorage, $userId);
mkdirs($backgroundStorage, true);
break;
}
2019-06-10 17:04:53 +00:00
if(empty($filename) || !is_file($filename)) {
http_response_code(404);
return;
}
2019-03-25 20:20:35 +00:00
$fileContents = file_get_contents($filename);
$entityTag = sprintf('W/"{%s}"', hash('sha256', $fileContents));
2019-06-10 17:04:53 +00:00
if(!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] === $entityTag) {
http_response_code(304);
return;
}
2019-03-25 20:20:35 +00:00
$finfo = finfo_open(FILEINFO_MIME);
$fmime = finfo_buffer($finfo, $fileContents);
finfo_close($finfo);
http_response_code(200);
2019-03-25 20:20:35 +00:00
header(sprintf('Content-Type: %s', $fmime));
header(sprintf('ETag: %s', $entityTag));
2019-03-25 20:20:35 +00:00
echo $fileContents;