1
0

Use checksums provided by attachments themselves

This commit is contained in:
Richard Dern 2024-05-05 15:12:12 +02:00
parent 51ae375ada
commit 81398f65a7
4 changed files with 58 additions and 11 deletions

View File

@ -5,6 +5,7 @@
use App\Classes\AttachmentsManager;
use App\Exceptions\AttachmentNotFound;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Intervention\Image\Exceptions\DecoderException;
use Intervention\Image\Laravel\Facades\Image;
@ -115,6 +116,18 @@ private function repairKnownImage(string $ref, array $data)
}
}
$checksum = $this->disk->checksum($expectedFullPath);
if (!empty($data['checksum']) && $data['checksum'] !== $checksum) {
Log::warning('File checksum has changed', [
'file' => $expectedFullPath,
'oldChecsum' => $data['checksum'],
'newChecksum' => $checksum,
]);
}
$data['checksum'] = $checksum;
$this->manager->set(sprintf('files.%s', $ref), $data);
$this->syncImageVariants($ref);
@ -159,9 +172,14 @@ private function syncImageVariant(string $ref, string $filter)
}
$variantData = $this->getVariantData($ref, $filter);
$variantFilepath = $this->getVariantFullPath($ref, $filter);
if (empty($variantData['checksum'])) {
$variantData['checksum'] = $this->disk->checksum($variantFilepath);
$this->manager->set(sprintf('variants.%s.%s', $ref, $filter), $variantData);
}
if (!$this->disk->exists($variantFilepath)) {
$this->createImageVariant($ref, $filter);
} else {
@ -214,6 +232,7 @@ private function createImageVariant(string $ref, string $filter)
$variantData['filename'] = $this->getVariantRelativePath($ref, $filter);
$variantData['last_modified'] = now();
$variantData['checksum'] = $this->disk->checksum($target);
$this->manager->set(sprintf('variants.%s.%s', $ref, $filter), $variantData);
}

View File

@ -3,6 +3,7 @@
namespace App\Classes\Traits\Repairs;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
/**
* Trait for AttachmentsManager
@ -76,6 +77,18 @@ private function repairKnownSound(string $ref, array $data)
}
}
$checksum = $this->disk->checksum($expectedFullPath);
if (!empty($data['checksum']) && $data['checksum'] !== $checksum) {
Log::warning('File checksum has changed', [
'file' => $expectedFullPath,
'oldChecsum' => $data['checksum'],
'newChecksum' => $checksum,
]);
}
$data['checksum'] = $checksum;
$this->manager->set(sprintf('files.%s', $ref), $data);
}
}

View File

@ -3,6 +3,7 @@
namespace App\Classes\Traits\Repairs;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
/**
* Trait for AttachmentsManager
@ -76,6 +77,18 @@ private function repairKnownVideo(string $ref, array $data)
}
}
$checksum = $this->disk->checksum($expectedFullPath);
if (!empty($data['checksum']) && $data['checksum'] !== $checksum) {
Log::warning('File checksum has changed', [
'file' => $expectedFullPath,
'oldChecsum' => $data['checksum'],
'newChecksum' => $checksum,
]);
}
$data['checksum'] = $checksum;
$this->manager->set(sprintf('files.%s', $ref), $data);
}
}

View File

@ -24,8 +24,8 @@ public function __construct(protected array $data, protected ?array $variant = [
*/
public function render(): View|Closure|string
{
$originalUrl = $this->copyFile($this->data['filename']);
$variantUrl = $this->variant ? $this->copyFile($this->variant['filename']) : null;
$originalUrl = $this->copyFile($this->data);
$variantUrl = $this->variant ? $this->copyFile($this->variant) : null;
return view($this->view, [
'originalUrl' => $originalUrl,
@ -39,13 +39,15 @@ public function render(): View|Closure|string
/**
* Copy a file to public disk and return relative url to use
*/
protected function copyFile(string $path)
protected function copyFile(array $data)
{
$content = Storage::disk(env('CONTENT_DISK'))->get($path);
$md5 = md5($content);
$targetPath = $this->buildTargetFilePath($path, $md5);
$path = $data['filename'];
$checksum = $data['checksum'];
$targetPath = $this->buildTargetFilePath($path, $checksum);
if (!Storage::disk('public')->exists($targetPath)) {
$content = Storage::disk(env('CONTENT_DISK'))->get($path);
Storage::disk('public')->put($targetPath, $content);
}
@ -55,11 +57,11 @@ protected function copyFile(string $path)
/**
* Return a path for the target file
*/
protected function buildTargetFilePath(string $originalPath, string $md5)
protected function buildTargetFilePath(string $originalPath, string $checksum)
{
$extension = pathinfo($originalPath, PATHINFO_EXTENSION);
$pathParts = str_split($md5, 4);
$pathParts[] = sprintf('%s.%s', $md5, $extension);
$pathParts = str_split($checksum, 4);
$pathParts[] = sprintf('%s.%s', $checksum, $extension);
$targetPath = implode('/', $pathParts);
return $targetPath;