From 650076702f89aa48878df7fb2ecc5bd36a84c6fe Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 21 Sep 2023 20:09:39 +0200 Subject: [PATCH] wip #6186 @0.5 --- .../ELearningMedia/DownloadOperation.php | 36 +++++++++++++++++-- .../ELearningPackage/DownloadOperation.php | 34 ++++++++++++++++-- .../CheckPublicationsHashAndCid.php | 29 ++++++++++----- app/Models/ELearningMedia.php | 10 ++++++ app/Models/ELearningPackage.php | 13 ++++++- app/Models/FluidbookPublication.php | 2 +- app/Models/Quiz.php | 2 +- app/Models/Traits/CheckHash.php | 6 ++++ 8 files changed, 114 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/Admin/Operations/ELearningMedia/DownloadOperation.php b/app/Http/Controllers/Admin/Operations/ELearningMedia/DownloadOperation.php index 6105a4cd7..296d2f425 100644 --- a/app/Http/Controllers/Admin/Operations/ELearningMedia/DownloadOperation.php +++ b/app/Http/Controllers/Admin/Operations/ELearningMedia/DownloadOperation.php @@ -4,8 +4,12 @@ namespace App\Http\Controllers\Admin\Operations\ELearningMedia; // __('!! e-Learning') +use App\Http\Middleware\CheckIfAdmin; use App\Jobs\ElearningMediaDownload; +use App\Jobs\QuizDownload; use App\Models\ELearningMedia; +use App\Models\Quiz; +use Cubist\Backpack\Http\Controllers\Base\XSendFileController; use Illuminate\Support\Facades\Route; use Prologue\Alerts\Facades\Alert; @@ -13,7 +17,8 @@ trait DownloadOperation { protected function setupDownloadRoutes($segment, $routeName, $controller) { - Route::match(['get'], $segment . '/{id}/download/{action}', $controller . '@download'); + Route::match(['get'], $segment . '/{id}/package/{action}/{version?}', $controller . '@package'); + Route::match(['get'], $segment . '/{id}_{hash}/download/{file}', $controller . '@download')->withoutMiddleware([CheckIfAdmin::class]);; } protected function setupDownloadDefaults() @@ -22,10 +27,35 @@ trait DownloadOperation $this->crud->addButtonFromView('line', 'download', 'elearningmedia.download', 'end'); } - protected function download($id, $action) + protected function package($id, $action, $version = null) { - ElearningMediaDownload::dispatch(ELearningMedia::find($id), $action, backpack_user())->onQueue('download');; + if (!ElearningMedia::hasPermission($id, 'read')) { + abort(401); + } + $media = ElearningMedia::withoutGlobalScopes()->find($id); + $version = $version ?? $media->scorm_version; + ElearningMediaDownload::dispatch($media, $action, $version, backpack_user())->onQueue('download');; Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash(); return redirect(backpack_url('elearning-media')); } + + protected function download($id, $hash, $file) + { + $media = ElearningMedia::withoutGlobalScopes()->where('id', $id)->where('hash', $hash)->first(); + if (null === $media) { + abort(404, __('Ce fichier est indisponible')); + } + $path = protected_path('elearning-media/download/' . $id . '/' . $file); + if (!file_exists($path)) { + abort(404, __('Le fichier n\'existe pas')); + } + return XSendFileController::sendfile($path); + } + +// protected function download($id, $action) +// { +// ElearningMediaDownload::dispatch(ELearningMedia::find($id), $action, backpack_user())->onQueue('download');; +// Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash(); +// return redirect(backpack_url('elearning-media')); +// } } diff --git a/app/Http/Controllers/Admin/Operations/ELearningPackage/DownloadOperation.php b/app/Http/Controllers/Admin/Operations/ELearningPackage/DownloadOperation.php index 34bc450d5..ab4dca292 100644 --- a/app/Http/Controllers/Admin/Operations/ELearningPackage/DownloadOperation.php +++ b/app/Http/Controllers/Admin/Operations/ELearningPackage/DownloadOperation.php @@ -2,8 +2,10 @@ namespace App\Http\Controllers\Admin\Operations\ELearningPackage; +use App\Http\Middleware\CheckIfAdmin; use App\Jobs\ElearningPackageDownload; use App\Models\ELearningPackage; +use Cubist\Backpack\Http\Controllers\Base\XSendFileController; use Illuminate\Support\Facades\Route; use Prologue\Alerts\Facades\Alert; @@ -13,7 +15,8 @@ trait DownloadOperation { protected function setupDownloadRoutes($segment, $routeName, $controller) { - Route::match(['get'], $segment . '/{id}/download/{action}', $controller . '@download'); + Route::match(['get'], $segment . '/{id}/package/{action}/{version?}', $controller . '@package'); + Route::match(['get'], $segment . '/{id}_{hash}/download/{file}', $controller . '@download')->withoutMiddleware([CheckIfAdmin::class]);; } protected function setupDownloadDefaults() @@ -21,10 +24,35 @@ trait DownloadOperation $this->crud->addButtonFromView('line', 'download', 'elearningpackage.download', 'end'); } - protected function download($id, $action) + protected function package($id, $action, $version = null) { - ElearningPackageDownload::dispatch(ELearningPackage::find($id), $action, backpack_user())->onQueue('download'); + if (!ElearningPackage::hasPermission($id, 'read')) { + abort(401); + } + $media = ElearningPackage::withoutGlobalScopes()->find($id); + $version = $version ?? $media->scorm_version; + ElearningPackageDownload::dispatch($media, $action, $version, backpack_user())->onQueue('download');; Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash(); return redirect(backpack_url('elearning-package')); } + + protected function download($id, $hash, $file) + { + $media = ElearningPackage::withoutGlobalScopes()->where('id', $id)->where('hash', $hash)->first(); + if (null === $media) { + abort(404, __('Ce fichier est indisponible')); + } + $path = protected_path('elearningmedia/download/' . $id . '/' . $file); + if (!file_exists($path)) { + abort(404, __('Le fichier n\'existe pas')); + } + return XSendFileController::sendfile($path); + } + +// protected function download($id, $action) +// { +// ElearningPackageDownload::dispatch(ELearningPackage::find($id), $action, backpack_user())->onQueue('download'); +// Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash(); +// return redirect(backpack_url('elearning-package')); +// } } diff --git a/app/Jobs/Maintenance/CheckPublicationsHashAndCid.php b/app/Jobs/Maintenance/CheckPublicationsHashAndCid.php index a3ed706cd..9c038c77c 100644 --- a/app/Jobs/Maintenance/CheckPublicationsHashAndCid.php +++ b/app/Jobs/Maintenance/CheckPublicationsHashAndCid.php @@ -3,6 +3,8 @@ namespace App\Jobs\Maintenance; use App\Jobs\Base; +use App\Models\ELearningMedia; +use App\Models\ELearningPackage; use App\Models\FluidbookPublication; use App\Models\Quiz; use Illuminate\Support\Facades\Log; @@ -11,20 +13,29 @@ class CheckPublicationsHashAndCid extends Base { public function handle() { + $classes = ['Quiz' => Quiz::class, 'Elearning Media' => ELearningMedia::class, 'Elearning Package' => ELearningPackage::class]; + + foreach ($classes as $name => $class) { + $class::withoutGlobalScopes()->where('created_ok', '0')->forceDelete(); + foreach ($class::withoutGlobalScopes()->where(function ($query) { + $query->whereNull('hash')->orWhere('hash', ''); + })->get() as $instance) { + //Log::warning($name . ' #' . $instance->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $instance->hash]); + $instance->save(); + }; + + + } + /** @var FluidbookPublication $fluidbook */ - foreach (FluidbookPublication::withoutGlobalScopes()->where('created_ok', '1')->where(function ($query) { + FluidbookPublication::withoutGlobalScopes()->where('created_ok', '0')->forceDelete(); + foreach (FluidbookPublication::withoutGlobalScopes()->where(function ($query) { $query->whereNull('hash')->orWhere('hash', '')->orWhereNull('cid')->orWhere('cid', ''); })->get() as $fluidbook) { - Log::warning('Fluidbook #' . $fluidbook->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $fluidbook->hash, 'cid' => $fluidbook->cid]); + //Log::warning('Fluidbook #' . $fluidbook->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $fluidbook->hash, 'cid' => $fluidbook->cid]); $fluidbook->save(); } - /** @var Quiz $fluidbook */ - foreach (Quiz::withoutGlobalScopes()->where('created_ok', '1')->where(function ($query) { - $query->whereNull('hash')->orWhere('hash', ''); - })->get() as $quiz) { - Log::warning('Quiz #' . $quiz->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $quiz->hash]); - $quiz->save(); - } + } } diff --git a/app/Models/ELearningMedia.php b/app/Models/ELearningMedia.php index ba5cfc7a0..9b7815593 100644 --- a/app/Models/ELearningMedia.php +++ b/app/Models/ELearningMedia.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Admin\Operations\ELearningMedia\ImportOperation; use App\Http\Controllers\Admin\Operations\ELearningMedia\PreviewOperation; use App\Http\Controllers\Admin\Operations\ELearningMedia\DownloadOperation; use App\Models\Base\ToolboxModel; +use App\Models\Traits\CheckHash; use App\Models\Traits\SCORMVersionTrait; use Cubist\Backpack\Magic\Fields\Files; use Cubist\Backpack\Magic\Fields\Hidden; @@ -22,6 +23,7 @@ use Spatie\MediaLibrary\MediaCollections\Models\Media; class ELearningMedia extends ToolboxModel { use SCORMVersionTrait; + use CheckHash; protected $table = 'elearning_media'; @@ -39,6 +41,8 @@ class ELearningMedia extends ToolboxModel { parent::setFields(); + $this->addHashField(); + $this->addField(['name' => 'client', 'label' => __('Nom du client'), 'type' => 'Text', @@ -150,6 +154,12 @@ class ELearningMedia extends ToolboxModel return $title; } + public function onSaving(): bool + { + $this->checkHash(); + return parent::onSaving(); + } + public function getIdTitleAttribute() { return $this->id . ' - ' . $this->title; diff --git a/app/Models/ELearningPackage.php b/app/Models/ELearningPackage.php index 803e39fda..b5d2ae68e 100644 --- a/app/Models/ELearningPackage.php +++ b/app/Models/ELearningPackage.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Admin\Operations\ELearningPackage\ImportOperation; use App\Http\Controllers\Admin\Operations\ELearningPackage\PreviewOperation; use App\Http\Controllers\Admin\Operations\ELearningPackage\DownloadOperation; use App\Models\Base\ToolboxModel; +use App\Models\Traits\CheckHash; use App\Models\Traits\SCORMVersionTrait; use App\Services\WorkshopV2; use App\SubForms\ElearningPackageContent; @@ -20,10 +21,12 @@ use Cubist\Util\Files\Files; use Cubist\Util\Files\VirtualDirectory; use Cubist\Util\Zip; use DirectoryIterator; + // __('!! e-Learning') class ELearningPackage extends ToolboxModel { use SCORMVersionTrait; + use CheckHash; protected $table = 'elearning_package'; @@ -33,12 +36,14 @@ class ELearningPackage extends ToolboxModel protected static $_permissionBase = 'elearning-package'; - protected $_operations = [ImportOperation::class, PreviewOperation::class, DownloadOperation::class,ChangeownerOperation::class]; + protected $_operations = [ImportOperation::class, PreviewOperation::class, DownloadOperation::class, ChangeownerOperation::class]; public function setFields() { parent::setFields(); + $this->addHashField(); + $this->addField(['name' => 'client', 'label' => __('Nom du client'), 'type' => 'Text', @@ -158,6 +163,12 @@ class ELearningPackage extends ToolboxModel return $res; } + public function onSaving(): bool + { + $this->checkHash(); + return parent::onSaving(); + } + /** * @param $id int * @param $vdir VirtualDirectory diff --git a/app/Models/FluidbookPublication.php b/app/Models/FluidbookPublication.php index 3da16f38d..f251e3924 100644 --- a/app/Models/FluidbookPublication.php +++ b/app/Models/FluidbookPublication.php @@ -137,7 +137,7 @@ class FluidbookPublication extends ToolboxSettingsModel $this->_main(); - $this->addField('hash', Hidden::class); + $this->addHashField(); $this->addField('cid', Hidden::class); diff --git a/app/Models/Quiz.php b/app/Models/Quiz.php index cde87f9c5..10db43249 100644 --- a/app/Models/Quiz.php +++ b/app/Models/Quiz.php @@ -93,7 +93,7 @@ class Quiz extends ToolboxModel { parent::setFields(); - $this->addField('hash', Hidden::class); + $this->addHashField(); $this->addField(['name' => 'client', 'label' => __('Nom du client'), diff --git a/app/Models/Traits/CheckHash.php b/app/Models/Traits/CheckHash.php index b9ffa79e3..98487fbc6 100644 --- a/app/Models/Traits/CheckHash.php +++ b/app/Models/Traits/CheckHash.php @@ -2,6 +2,8 @@ namespace App\Models\Traits; +use Cubist\Backpack\Magic\Fields\Hidden; + trait CheckHash { protected function checkHash() @@ -10,4 +12,8 @@ trait CheckHash $this->hash = md5(uniqid('fluidbook_hash'), false); } } + + protected function addHashField(){ + $this->addField('hash', Hidden::class); + } } -- 2.39.5