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\Classes\AttachmentsManager;
use App\Exceptions\AttachmentNotFound; use App\Exceptions\AttachmentNotFound;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Exceptions\DecoderException;
use Intervention\Image\Laravel\Facades\Image; 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->manager->set(sprintf('files.%s', $ref), $data);
$this->syncImageVariants($ref); $this->syncImageVariants($ref);
@ -159,9 +172,14 @@ private function syncImageVariant(string $ref, string $filter)
} }
$variantData = $this->getVariantData($ref, $filter); $variantData = $this->getVariantData($ref, $filter);
$variantFilepath = $this->getVariantFullPath($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)) { if (!$this->disk->exists($variantFilepath)) {
$this->createImageVariant($ref, $filter); $this->createImageVariant($ref, $filter);
} else { } else {
@ -214,6 +232,7 @@ private function createImageVariant(string $ref, string $filter)
$variantData['filename'] = $this->getVariantRelativePath($ref, $filter); $variantData['filename'] = $this->getVariantRelativePath($ref, $filter);
$variantData['last_modified'] = now(); $variantData['last_modified'] = now();
$variantData['checksum'] = $this->disk->checksum($target);
$this->manager->set(sprintf('variants.%s.%s', $ref, $filter), $variantData); $this->manager->set(sprintf('variants.%s.%s', $ref, $filter), $variantData);
} }

View File

@ -3,6 +3,7 @@
namespace App\Classes\Traits\Repairs; namespace App\Classes\Traits\Repairs;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
/** /**
* Trait for AttachmentsManager * 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); $this->manager->set(sprintf('files.%s', $ref), $data);
} }
} }

View File

@ -3,6 +3,7 @@
namespace App\Classes\Traits\Repairs; namespace App\Classes\Traits\Repairs;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
/** /**
* Trait for AttachmentsManager * 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); $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 public function render(): View|Closure|string
{ {
$originalUrl = $this->copyFile($this->data['filename']); $originalUrl = $this->copyFile($this->data);
$variantUrl = $this->variant ? $this->copyFile($this->variant['filename']) : null; $variantUrl = $this->variant ? $this->copyFile($this->variant) : null;
return view($this->view, [ return view($this->view, [
'originalUrl' => $originalUrl, 'originalUrl' => $originalUrl,
@ -39,13 +39,15 @@ public function render(): View|Closure|string
/** /**
* Copy a file to public disk and return relative url to use * 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); $path = $data['filename'];
$md5 = md5($content); $checksum = $data['checksum'];
$targetPath = $this->buildTargetFilePath($path, $md5); $targetPath = $this->buildTargetFilePath($path, $checksum);
if (!Storage::disk('public')->exists($targetPath)) { if (!Storage::disk('public')->exists($targetPath)) {
$content = Storage::disk(env('CONTENT_DISK'))->get($path);
Storage::disk('public')->put($targetPath, $content); Storage::disk('public')->put($targetPath, $content);
} }
@ -55,11 +57,11 @@ protected function copyFile(string $path)
/** /**
* Return a path for the target file * 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); $extension = pathinfo($originalPath, PATHINFO_EXTENSION);
$pathParts = str_split($md5, 4); $pathParts = str_split($checksum, 4);
$pathParts[] = sprintf('%s.%s', $md5, $extension); $pathParts[] = sprintf('%s.%s', $checksum, $extension);
$targetPath = implode('/', $pathParts); $targetPath = implode('/', $pathParts);
return $targetPath; return $targetPath;