diff --git a/.gitignore b/.gitignore index 30d15b1..b507967 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,16 @@ yarn-error.log public/fichiers storage resources/theme + +# Ignore public favicon +/public/android-chrome-192x192.png +/public/android-chrome-512x512.png +/public/apple-touch-icon.png +/public/browserconfig.xml +/public/browserconfig.xml +/public/favicon-16x16.png +/public/favicon-32x32.png +/public/favicon.ico +/public/mstile-150x150.png +/public/safari-pinned-tab.svg +/public/site.webmanifest diff --git a/app/Http/Controllers/EndPageController.php b/app/Http/Controllers/Fo/EndPageController.php similarity index 84% rename from app/Http/Controllers/EndPageController.php rename to app/Http/Controllers/Fo/EndPageController.php index 797d3cd..28a5ce6 100644 --- a/app/Http/Controllers/EndPageController.php +++ b/app/Http/Controllers/Fo/EndPageController.php @@ -1,7 +1,8 @@ route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/EnterCodeController.php b/app/Http/Controllers/Fo/EnterCodeController.php similarity index 98% rename from app/Http/Controllers/EnterCodeController.php rename to app/Http/Controllers/Fo/EnterCodeController.php index 57b5504..e8bf721 100644 --- a/app/Http/Controllers/EnterCodeController.php +++ b/app/Http/Controllers/Fo/EnterCodeController.php @@ -1,7 +1,8 @@ apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -286,6 +287,6 @@ class EnterCodeController extends Controller if ($participation) { return view('theme::fo.winning-proof', compact('participation')); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/FAQController.php b/app/Http/Controllers/Fo/FAQController.php similarity index 78% rename from app/Http/Controllers/FAQController.php rename to app/Http/Controllers/Fo/FAQController.php index 2adba55..35d1e27 100644 --- a/app/Http/Controllers/FAQController.php +++ b/app/Http/Controllers/Fo/FAQController.php @@ -1,7 +1,8 @@ route('home'); + return redirect()->route('fo.home'); } return view('theme::fo.faq', compact('questions', 'themes')); } diff --git a/app/Http/Controllers/GainsController.php b/app/Http/Controllers/Fo/GainsController.php similarity index 69% rename from app/Http/Controllers/GainsController.php rename to app/Http/Controllers/Fo/GainsController.php index 699a38a..8b8ddac 100644 --- a/app/Http/Controllers/GainsController.php +++ b/app/Http/Controllers/Fo/GainsController.php @@ -1,6 +1,8 @@ exists('theme::fo.gains')) { return view('theme::fo.gains'); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/Fo/HomeController.php similarity index 58% rename from app/Http/Controllers/HomeController.php rename to app/Http/Controllers/Fo/HomeController.php index ce5fd2d..1cc0843 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/Fo/HomeController.php @@ -1,6 +1,8 @@ exists('theme::fo.basic.how-to-play')) { return view('theme::fo.basic.how-to-play'); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/Fo/LoginController.php similarity index 95% rename from app/Http/Controllers/LoginController.php rename to app/Http/Controllers/Fo/LoginController.php index 6168213..37b0f05 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/Fo/LoginController.php @@ -1,7 +1,8 @@ middleware('guest')->except('logout'); - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -137,7 +138,7 @@ class LoginController extends Controller } //end if Auth::login($userLocal); - return redirect()->route('saisir-code'); + return redirect()->route('fo.saisir-code'); } /** @@ -148,7 +149,7 @@ class LoginController extends Controller public function logout() { Auth::logout(); - return redirect()->route('home'); + return redirect()->route('fo.home'); } /** @@ -211,17 +212,17 @@ class LoginController extends Controller public function forgotPasswordReset(Request $request, string $token) { if (!$request->hasValidSignature(false)) { - return redirect()->route('login') + return redirect()->route('fo.login') ->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer."); } $tokenValid = false; $user = Customer::where('password_token', $token)->first(); if (!$user) { - return redirect()->route('forgot-password', compact('tokenValid')) + return redirect()->route('fo.forgot-password', compact('tokenValid')) ->withErrors('Le lien de changement du mot de passe est incorrect.'); } $tokenValid = true; - return redirect()->route('forgot-password', compact('tokenValid', 'token')); + return redirect()->route('fo.forgot-password', compact('tokenValid', 'token')); } /** @@ -280,7 +281,7 @@ class LoginController extends Controller /** @var \App\Models\Settings $settings */ $settings = app(Settings::class); Mail::to($email)->send(new PasswordReset($user, $settings)); - return redirect()->route('login') + return redirect()->route('fo.login') ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); } @@ -310,7 +311,7 @@ class LoginController extends Controller if ($update->status === 'OK') { $user->password_token = null; $user->save(); - return redirect()->route('login') + return redirect()->route('fo.login') ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); } else { if ($update->code === 123) { diff --git a/app/Http/Controllers/ProduitsController.php b/app/Http/Controllers/Fo/ProduitsController.php similarity index 86% rename from app/Http/Controllers/ProduitsController.php rename to app/Http/Controllers/Fo/ProduitsController.php index b70a715..f88d58c 100644 --- a/app/Http/Controllers/ProduitsController.php +++ b/app/Http/Controllers/Fo/ProduitsController.php @@ -1,7 +1,8 @@ middleware('guest'); - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -132,7 +133,7 @@ class RegisterController extends Controller Mail::to($email)->send(new VerifyEmail($user)); - return redirect()->route('login') + return redirect()->route('fo.login') ->with( 'success', "Pour finaliser votre inscription, diff --git a/app/Http/Controllers/TeaserController.php b/app/Http/Controllers/Fo/TeaserController.php similarity index 83% rename from app/Http/Controllers/TeaserController.php rename to app/Http/Controllers/Fo/TeaserController.php index ace5639..523cb02 100644 --- a/app/Http/Controllers/TeaserController.php +++ b/app/Http/Controllers/Fo/TeaserController.php @@ -1,7 +1,8 @@ activated_teaser === 1 && $settings->teaser_end_activity > now()) { return view('theme::fo.teaser', compact('settings')); } - return redirect()->route('home'); + return redirect()->route('fo.home'); } } diff --git a/app/Http/Controllers/ViewContentController.php b/app/Http/Controllers/Fo/ViewContentController.php similarity index 92% rename from app/Http/Controllers/ViewContentController.php rename to app/Http/Controllers/Fo/ViewContentController.php index 978fb5b..b574dfe 100644 --- a/app/Http/Controllers/ViewContentController.php +++ b/app/Http/Controllers/Fo/ViewContentController.php @@ -1,7 +1,8 @@ apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); + // $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); } /** @@ -43,7 +44,7 @@ class WinningProofController extends Controller ['barcode', null] ])->has('instantWin')->first(); if (!$participation) { - return redirect()->route('home'); + return redirect()->route('fo.home'); } $request->validate([ diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index cc5ba2f..a332aa5 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -31,9 +31,8 @@ class Authenticate extends Middleware } } } - return route('login'); + return route('fo.login'); } - abort(401); return null; } diff --git a/app/Http/Middleware/GameCheckDate.php b/app/Http/Middleware/GameCheckDate.php index 38b4a99..bc7babf 100644 --- a/app/Http/Middleware/GameCheckDate.php +++ b/app/Http/Middleware/GameCheckDate.php @@ -23,7 +23,7 @@ class GameCheckDate // Check si le teaser est actif. if ($settings->start_date > now()) { if ($settings->activated_teaser === 1 && $settings->teaser_end_activity > now()) { - return redirect()->route('teaser'); + return redirect()->route('fo.teaser'); } return redirect($settings->redirect_close); } @@ -31,7 +31,7 @@ class GameCheckDate // Check si le jeu est terminé. if ($settings->end_date < now()) { if ($settings->activated_close_page === 1 && $settings->close_page_active_date > now()) { - return redirect()->route('end'); + return redirect()->route('fo.end'); } return redirect($settings->redirect_close); } diff --git a/app/Http/Middleware/Re7Middleware.php b/app/Http/Middleware/Re7Middleware.php index 67a8999..8b67215 100644 --- a/app/Http/Middleware/Re7Middleware.php +++ b/app/Http/Middleware/Re7Middleware.php @@ -17,7 +17,7 @@ class Re7Middleware public function handle(Request $request, Closure $next) { if (config('app.env') === 'production') { - return redirect()->route('home'); + return redirect()->route('fo.home'); } return $next($request); } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 51604d6..393cabe 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -27,7 +27,7 @@ class RedirectIfAuthenticated if (Auth::guard($guard)->check()) { switch ($guard) { case 'frontend': - return \redirect()->route('home'); + return \redirect()->route('fo.home'); case 'backend': if (!$request->routeIs('bo.*')) { continue; diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index 8d77e62..c5e47cf 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -34,6 +34,8 @@ class SecureHeaders public function handle(Request $request, Closure $next): Response { // phpcs:enable + // * For Vite DEV + $host = \parse_url(\config('app.url'), \PHP_URL_HOST); View::share('nonce', $nonce = Vite::useCspNonce()); // * For VueJS dev tool to execute $jsDev = config('app.debug') ? "'unsafe-eval' 'unsafe-inline'" : "'nonce-{$nonce}' 'strict-dynamic'"; @@ -51,14 +53,23 @@ class SecureHeaders "default-src 'none';", "manifest-src 'self';", // * CKEDITOR Specific https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/csp.html - "connect-src 'self' blob:;", + "connect-src 'self' " . implode(' ', [ + // * VITE DEV + config('app.debug') ? "wss://{$host}:4443" : '', + config('app.debug') ? "https://{$host}:4443" : '', + 'https://yl.s-web.fr' + ]) . ';', "img-src * data: blob:;", 'frame-src ' . implode(' ', [ 'https://www.google.com/recaptcha/', 'https://recaptcha.google.com/recaptcha/', 'https://www.google.com/maps/' ]) . ';', - "font-src 'self' data: https://fonts.gstatic.com;", + "font-src 'self' data: " . \implode(' ', [ + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', + 'https://fonts.gstatic.com;' + ]) . ';', // ! Using CKEditor will must have unsafe-inline style // phpcs:ignore Generic.Files.LineLength.TooLong "style-src 'self' 'unsafe-inline' " . \implode(' ', [ @@ -67,7 +78,9 @@ class SecureHeaders 'https://fonts.googleapis.com', 'https://cdn.jsdelivr.net', 'https://use.fontawesome.com', - 'https://fonts.googleapis.com' + 'https://fonts.googleapis.com', + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', ]) . ';', // ! If you dont use ckeditor use this // "style-src 'self' 'nonce-$nonce';", @@ -77,6 +90,8 @@ class SecureHeaders 'https://www.googletagmanager.com', 'https://cdnjs.cloudflare.com', "$scheme://www.google-analytics.com", + // * VITE DEV + config('app.debug') ? "https://{$host}:4443" : '', ]) . ';' ]; @@ -94,7 +109,7 @@ class SecureHeaders * @param array $headerList * @return void */ - private function removeUnwantedHeaders(array $headerList) + private function removeUnwantedHeaders(array $headerList): void { foreach ($headerList as $header) { header_remove($header); diff --git a/config/purifier.php b/config/purifier.php index d74b7a6..59cb78b 100644 --- a/config/purifier.php +++ b/config/purifier.php @@ -27,7 +27,7 @@ return [ 'default' => [ 'HTML.SafeIframe' => true, // * For iframes - 'URI.SafeIframeRegexp' => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + 'URI.SafeIframeRegexp' => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/|www.dailymotion.com/video/)%", 'HTML.Doctype' => 'HTML 4.01 Transitional', // * Legacy filter en full avec safe legacy. // 'HTML.Allowed' => 'h1[style|id],h2[style|id],h3[style|id],h4[style|id],h5[style|id],h6[style|id],figure[class|style],oembed[url],div[style],b,strong,i,em,u,s,pre,code[class],a[href|title|target|rel|id],ul[style],ol[style],dl[style],li,p[style],br,span[style|class],img[width|height|alt|src|style|class|title],iframe[src|width|height|class|frameborder|style],table[style|align|border|cellspacing|cellpadding|width],thead,tbody,th[colspan|align|valign|style],tr[align|valign|style],td[style|colspan|rowspan|scope|align|valign],hr,dl,dt,mark[class]', @@ -43,7 +43,7 @@ return [ ], "youtube" => [ "HTML.SafeIframe" => 'true', - "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/)%", + "URI.SafeIframeRegexp" => "%^(http://|https://|//)(www.youtube.com/embed/|player.vimeo.com/video/|vimeo.com/|www.dailymotion.com/video/)%", ], 'custom_definition' => [ 'id' => 'html5-definitions', diff --git a/package-lock.json b/package-lock.json index d7393c1..a4ec7fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", "stylelint": "latest", @@ -2530,6 +2531,25 @@ "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.14", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", @@ -2543,6 +2563,12 @@ "dev": true, "peer": true }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", @@ -4157,6 +4183,12 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -7486,6 +7518,82 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-copy": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup-plugin-copy/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/rollup-plugin-copy/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", diff --git a/package.json b/package.json index 8fc5a8b..633e7dc 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "prettier": "latest", "print-js": "^1.6.0", "resolve-url-loader": "^5.0.0", + "rollup-plugin-copy": "^3.5.0", "sass": "latest", "slugify": "^1.6.6", "stylelint": "latest", diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..572f192 Binary files /dev/null and b/public/logo.png differ diff --git a/resources/assets/images/engine/logo.png b/resources/assets/images/engine/logo.png new file mode 100644 index 0000000..572f192 Binary files /dev/null and b/resources/assets/images/engine/logo.png differ diff --git a/resources/assets/images/engine/logo.svg b/resources/assets/images/engine/logo.svg new file mode 100644 index 0000000..3f52d65 --- /dev/null +++ b/resources/assets/images/engine/logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/favicon/android-chrome-192x192.png b/resources/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..e84712f Binary files /dev/null and b/resources/favicon/android-chrome-192x192.png differ diff --git a/resources/favicon/android-chrome-512x512.png b/resources/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..12f369a Binary files /dev/null and b/resources/favicon/android-chrome-512x512.png differ diff --git a/resources/favicon/apple-touch-icon.png b/resources/favicon/apple-touch-icon.png new file mode 100644 index 0000000..c2f7301 Binary files /dev/null and b/resources/favicon/apple-touch-icon.png differ diff --git a/resources/favicon/browserconfig.xml b/resources/favicon/browserconfig.xml new file mode 100644 index 0000000..f9c2e67 --- /dev/null +++ b/resources/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #2b5797 + + + diff --git a/resources/favicon/favicon-16x16.png b/resources/favicon/favicon-16x16.png new file mode 100644 index 0000000..cb0de06 Binary files /dev/null and b/resources/favicon/favicon-16x16.png differ diff --git a/resources/favicon/favicon-32x32.png b/resources/favicon/favicon-32x32.png new file mode 100644 index 0000000..586b050 Binary files /dev/null and b/resources/favicon/favicon-32x32.png differ diff --git a/resources/favicon/favicon.ico b/resources/favicon/favicon.ico new file mode 100644 index 0000000..1650a77 Binary files /dev/null and b/resources/favicon/favicon.ico differ diff --git a/resources/favicon/mstile-150x150.png b/resources/favicon/mstile-150x150.png new file mode 100644 index 0000000..e897e87 Binary files /dev/null and b/resources/favicon/mstile-150x150.png differ diff --git a/resources/favicon/safari-pinned-tab.svg b/resources/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..f61f502 --- /dev/null +++ b/resources/favicon/safari-pinned-tab.svg @@ -0,0 +1,109 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + diff --git a/resources/favicon/site.webmanifest b/resources/favicon/site.webmanifest new file mode 100644 index 0000000..b20abb7 --- /dev/null +++ b/resources/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/resources/lang/en/cookie-notice.php b/resources/lang/en/cookie-notice.php new file mode 100644 index 0000000..0b116b2 --- /dev/null +++ b/resources/lang/en/cookie-notice.php @@ -0,0 +1,43 @@ + 'Customize cookies', + 'button_forbid' => 'Prohibit', + 'button_allow' => 'Allow', + 'button_forbid_all' => 'Reject all', + 'button_allow_all' => 'Accept all', + 'button_customize' => 'Customize', + 'button_back' => 'Back', + 'banner_title' => 'The :site_name website uses cookies!', + 'banner_text_open' => 'This website stores cookies on your computer. :site_name uses this information to improve and personalize your browsing experience, as well as for analysis and indicators concerning our visitors both on this website and on other media. You can click on "Accept" if you consent to the use of these cookies.', + 'banner_text' => 'We use cookies to ensure the smooth operation of our site and for analytical purposes. By continuing to browse this site or by closing this banner, you consent to the use of these cookies.', + 'banner_details' => 'If you refuse the use of cookies, your information will not be tracked during your visit to this site. A cookie will be used in your browser to remember not to track your preferences. Some features will not be accessible. You can change your mind and modify your consent at any time by returning to this site.', + 'banner_details_link' => 'To find out more about the cookies we use, please consult our privacy policy.', + 'banner_details_link_title' => 'Privacy policy', + 'banner_more_details' => 'More details...', + 'banner_less_details' => 'Fewer details...', + 'Panel_title' => 'Cookie management panel', + 'Panel_subtitle' => 'Your privacy is our priority', + 'Panel_details' => 'The functionalities of this site are based on services provided by third parties. If you accept, these third parties will deposit cookies that will enable you to view content on the site hosted by these third parties. Through these cookies, these third parties will collect and use your browsing data for their own purposes, in accordance with their privacy policy (link below). This page allows you to give or withdraw your consent, either globally or service by service.', + 'custom' => [ + 'youtube' => [ + 'name' => 'Youtube', + 'description' => 'Cookies placed via video sharing services are intended to allow the user to view multimedia content directly on the site.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to view this video', + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Audience measurement services are used to generate traffic statistics, which are useful for improving the site.', + 'labelLink' => 'Learn more', + ], + 'recaptcha' => [ + 'title' => 'reCAPTACHA', + 'description' => 'The purpose of the cookies placed on forms via the recaptcha is to prevent them from being submitted by robots.', + 'labelLink' => 'Learn more', + 'warning' => 'You must accept cookies to send the form', + ] + ] +]; diff --git a/resources/lang/fr/cookie-notice.php b/resources/lang/fr/cookie-notice.php new file mode 100644 index 0000000..b569e81 --- /dev/null +++ b/resources/lang/fr/cookie-notice.php @@ -0,0 +1,43 @@ + 'Personnaliser les cookies', + 'button_forbid' => 'Interdire', + 'button_allow' => 'Autoriser', + 'button_forbid_all' => 'Tout refuser', + 'button_allow_all' => 'Tout accepter', + 'button_customize' => 'Personnaliser', + 'button_back' => 'Retour', + 'banner_title' => 'Le site internet :site_name utilise des cookies !', + 'banner_text_open' => 'Ce site web stocke les cookies sur votre ordinateur. :site_name utilise ces informations afin d’améliorer et de personnaliser votre expérience de navigation, ainsi que pour l’analyse et les indicateurs concernant nos visiteurs à la fois sur ce site web et sur d’autres supports. Vous pouvez cliquer sur « Accepter » si vous consentez à l’utilisation de ces cookies.', + 'banner_text' => 'Nous utilisons des cookies pour nous assurer du bon fonctionnement de notre site et à des fins analytiques. En poursuivant votre navigation sur ce site ou en fermant ce bandeau, vous consentez à l’utilisationde ces cookies.', + 'banner_details' => 'Si vous refusez l’utilisation des cookies, vos informations ne seront pas suivies lors de votre visite sur ce site. Un cookie sera utilisé dans votre navigateur afin de se souvenir de ne pas suivre vos préférences. Certaines fonctionnalités ne seront pas accessibles. Vous pouvez changer d’avis et modifier votre consentement à tout moment en revenant sur ce site.', + 'banner_details_link' => 'Pour en savoir plus sur les cookies que nous utilisons, consultez notre charte de confidentialité.', + 'banner_details_link_title' => 'Charte de confidentialité', + 'banner_more_details' => 'Plus de détails...', + 'banner_less_details' => 'Moins de détails...', + 'Panel_title' => 'Panneau de gestion des cookies', + 'Panel_subtitle' => 'Le respect de votre vie privée est notre priorité', + 'Panel_details' => 'Les fonctionnalités de ce site s’appuient sur des services proposés par des tiers. Si vous acceptez, ces tiers déposeront des cookies qui vous permettront de visualiser sur le site du contenu hébergé par ces tiers. Via ces cookies, ces tiers collecteront et utiliseront vos données de navigation pour des finalités qui leur sont propres, conformément à leur politique de confidentialité (lien ci-dessous). Cette page vous permet de donner ou de retirer votre consentement, soit globalement soit service par service.', + 'custom' => [ + 'youtube' => [ + 'name' => 'Youtube', + 'description' => 'Les cookies placés via les services de partage de vidéos sont destinés à permettre à l\'utilisateur de visionner des contenus multimédias directement sur le site.', + 'labelLink' => 'En apprendre plus', + 'warning' => 'Vous devez accepter les cookies pour visionner cette vidéo', + ], + 'matomo' => [ + 'title' => 'Matomo', + 'description' => 'Les services de mesure d\'audience permettent de générer des statistiques de fréquentation utiles à l\'amélioration du site.', + 'labelLink' => 'En apprendre plus', + ], + 'recaptcha' => [ + 'title' => 'reCAPTACHA', + 'description' => 'Les cookies qui sont déposés via le recaptcha sur les formulaires ont pour finalité d\'empêcher que ceux-ci ne soient soumis par des robots.', + 'labelLink' => 'En apprendre plus', + 'warning' => 'Vous devez accepter les cookies pour envoyer le formulaire', + ] + ] +]; diff --git a/resources/views/pages/dashboard/index.blade.php b/resources/views/pages/dashboard/index.blade.php index fb78e68..8af4ebf 100644 --- a/resources/views/pages/dashboard/index.blade.php +++ b/resources/views/pages/dashboard/index.blade.php @@ -3,7 +3,7 @@ @section('content')

{{ __('Dashboard') }}

- + {{ __('Accéder au jeu') }}
diff --git a/resources/views/vendor/errors/403.blade.php b/resources/views/vendor/errors/403.blade.php index 6bfeea2..de31d5c 100644 --- a/resources/views/vendor/errors/403.blade.php +++ b/resources/views/vendor/errors/403.blade.php @@ -8,6 +8,5 @@ @section('button', true) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/404.blade.php b/resources/views/vendor/errors/404.blade.php index 4477635..02b2b13 100644 --- a/resources/views/vendor/errors/404.blade.php +++ b/resources/views/vendor/errors/404.blade.php @@ -8,6 +8,5 @@ @section('button', true) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/503.blade.php b/resources/views/vendor/errors/503.blade.php index db3d417..edf601f 100644 --- a/resources/views/vendor/errors/503.blade.php +++ b/resources/views/vendor/errors/503.blade.php @@ -6,6 +6,5 @@ @section('submessage', __('Le site est en maintenance, nous reviendrons...')) @section('image') -{{-- FIXME: Personaliser ca --}} - + @endsection diff --git a/resources/views/vendor/errors/illustrated-layout.blade.php b/resources/views/vendor/errors/illustrated-layout.blade.php index 8d7e262..a277a37 100644 --- a/resources/views/vendor/errors/illustrated-layout.blade.php +++ b/resources/views/vendor/errors/illustrated-layout.blade.php @@ -1,48 +1,52 @@ - - - - @yield('title') + + + + @yield('title') - @vite(['resources/sass/fo/fo.scss']) - @stack('scripts') - - -
-
-
-
- @yield('code', __('Oh no')) -
+ @vite(['resources/sass/bo/bo.scss']) + @stack('scripts') + -
+ +
+
+
+
+ @yield('code', __('Oh no')) +
-

- @yield('message') -

+
-

- @yield('submessage') -

+

+ @yield('message') +

- @hasSection('button') - +

+ @yield('submessage') +

+ + @hasSection('button') +
{{ __('Go to page :page', [ - 'page' => __('home') + 'page' => __('home'), ]) }} - @endif -
-
- -
-
- @yield('image') -
+ @endif
- + +
+
+ @yield('image') +
+
+
+ + diff --git a/resources/views/vendor/errors/minimal.blade.php b/resources/views/vendor/errors/minimal.blade.php index 4c7ce34..f20ce4d 100644 --- a/resources/views/vendor/errors/minimal.blade.php +++ b/resources/views/vendor/errors/minimal.blade.php @@ -1,29 +1,37 @@ - - - - @yield('title') + + + - + @yield('title') - @vite(['resources/sass/fo/fo.scss']) - @stack('scripts') - - -
-
-
-
- @yield('code') -
+ -
- @yield('message') -
+ @vite(['resources/sass/bo/bo.scss']) + @stack('scripts') + + + +
+
+
+
+ @yield('code') +
+ +
+ @yield('message')
- +
+ + diff --git a/routes/web-bo.php b/routes/web-bo.php index 3e9d752..5270490 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -17,64 +17,60 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; // * BO -Route::prefix('bo') - ->name('bo.') - ->group(function () { - Route::namespace('\App\Http\Controllers\Bo') - ->group(function () { - Auth::routes( - [ - 'confirm' => false, - 'login' => true, - 'logout' => true, - 'register' => false, - 'reset' => false, - 'verify' => false, - ] - ); - }); - Route::middleware(['auth:backend', 'is-admin', 'is-super-admin']) - ->group(function () { - Route::get('/', [DashboardController::class, 'index']) - ->name('dashboard')->withoutMiddleware('is-super-admin'); - // * BANNED IPS - Route::resource('/bannedips', BannedIpController::class)->except('show'); - // * CONTENTS - Route::resource('/contents', ContentController::class) - ->only(['index', 'edit', 'update']) - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:value']); - // * FAQ - THEMES - Route::resource('/faq-themes', FaqThemesController::class)->except('show'); - // * FAQ - QUESTIONS - Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); - // * GAIN VIEWS - Route::resource('/gain-views', GainViewController::class)->except('show'); - // * PRIZES - Route::resource('/prizes', PrizesController::class) - ->except('show') - ->withoutMiddleware('htmlsanitize') - ->middleware(['htmlsanitize:arg_content']); - // * RANGES - Route::resource('ranges', RangeController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * PRODUCTS - Route::resource('products', ProductsController::class) - ->except('show') - ->withoutMiddleware('is-super-admin'); - // * SETTINGS. - Route::resource('/settings', SettingsController::class) - ->only(['edit', 'update']); - // * WINNERS LIST - Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); - // * INSTANT WIN - Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); - Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); - // * UNIQUES CODES. - Route::get('/codes', [CodesController::class, 'index'])->name('codes'); - Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); - Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); - Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); - }); +Route::prefix('bo')->name('bo.')->group(function () { + Route::namespace('\App\Http\Controllers\Bo')->group(function () { + Auth::routes( + [ + 'confirm' => false, + 'login' => true, + 'logout' => true, + 'register' => false, + 'reset' => false, + 'verify' => false, + ] + ); }); + Route::middleware(['auth:backend', 'is-admin', 'is-super-admin'])->group(function () { + Route::get('/', [DashboardController::class, 'index']) + ->name('dashboard')->withoutMiddleware('is-super-admin'); + // * BANNED IPS + Route::resource('/bannedips', BannedIpController::class)->except('show'); + // * CONTENTS + Route::resource('/contents', ContentController::class) + ->only(['index', 'edit', 'update']) + ->withoutMiddleware('htmlsanitize') + ->middleware(['htmlsanitize:value']); + // * FAQ - THEMES + Route::resource('/faq-themes', FaqThemesController::class)->except('show'); + // * FAQ - QUESTIONS + Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); + // * GAIN VIEWS + Route::resource('/gain-views', GainViewController::class)->except('show'); + // * PRIZES + Route::resource('/prizes', PrizesController::class) + ->except('show') + ->withoutMiddleware('htmlsanitize') + ->middleware(['htmlsanitize:arg_content']); + // * RANGES + Route::resource('ranges', RangeController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * PRODUCTS + Route::resource('products', ProductsController::class) + ->except('show') + ->withoutMiddleware('is-super-admin'); + // * SETTINGS. + Route::resource('/settings', SettingsController::class) + ->only(['edit', 'update']); + // * WINNERS LIST + Route::get('/winners-list', [WinnersListController::class, 'index'])->name('winners-list'); + // * INSTANT WIN + Route::get('/instant-win', [InstantWinController::class, 'index'])->name('instant-win'); + Route::get('/ajax/instant-win-generate', [InstantWinController::class, 'instantWinGenerate']); + // * UNIQUES CODES. + Route::get('/codes', [CodesController::class, 'index'])->name('codes'); + Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes'); + Route::get('/codes/search', [CodesController::class, 'search'])->name('codes.search'); + Route::post('/codes/export', [CodesController::class, 'export'])->name('export-codes'); + }); +}); diff --git a/routes/web-fo.php b/routes/web-fo.php index ae10084..c0fb325 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -1,20 +1,20 @@ middleware(['throttle:credentials'])->group(function () { +Route::middleware(['throttle:credentials'])->name('fo.')->group(function () { Route::middleware('game-date')->group(function () { // Routes nécessitant d'être connecté. Route::middleware('auth:frontend')->group(function () { diff --git a/routes/web-re7.php b/routes/web-re7.php index 63e3298..a9cbe0d 100644 --- a/routes/web-re7.php +++ b/routes/web-re7.php @@ -1,18 +1,16 @@ middleware(['re7']) - ->group(function () { - Route::get('/', [Re7Controller::class, 'index']); - Route::get('/teaser', [Re7Controller::class, 'teaser']); - Route::get('/mail-gain', [Re7Controller::class, 'prizeMail']); - Route::get('/mail-reduction', [Re7Controller::class, 'reductionMail']); - Route::get('/br', [Re7Controller::class, 'br']); - // phpcs:ignore - // TODO : Rendre dynamique la partie gain par rapport au BO. - Route::get('/gain1', [Re7Controller::class, 'gain1']); - Route::get('/gain2', [Re7Controller::class, 'gain2']); - }); +Route::prefix('re7')->name('re7.')->middleware(['re7'])->group(function () { + Route::get('/', [Re7Controller::class, 'index'])->name('index'); + Route::get('/teaser', [Re7Controller::class, 'teaser'])->name('teaser'); + Route::get('/mail-gain', [Re7Controller::class, 'prizeMail'])->name('mail-gain'); + Route::get('/mail-reduction', [Re7Controller::class, 'reductionMail'])->name('mail-reduction'); + Route::get('/br', [Re7Controller::class, 'br'])->name('br'); + // phpcs:ignore + // TODO : Rendre dynamique la partie gain par rapport au BO. + Route::get('/gain1', [Re7Controller::class, 'gain1'])->name('gain1'); + Route::get('/gain2', [Re7Controller::class, 'gain2'])->name('gain2'); +}); diff --git a/vite.config.ts b/vite.config.ts index a35e78d..fed29d1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import vue from "@vitejs/plugin-vue"; import laravel from "laravel-vite-plugin"; import path from "path"; import postcssDiscard from "postcss-discard-comments"; +import copy from "rollup-plugin-copy"; import { defineConfig, loadEnv } from "vite"; import babel from "vite-plugin-babel"; import checker from "vite-plugin-checker"; @@ -77,6 +78,43 @@ export default defineConfig({ ], refresh: true, }), + copy({ + targets: [ + { + src: [ + // * Logo for Bo error pages + path.normalize("resources/assets/images/engine/logo.png"), + // * Engine copy (Default favicon) + path.normalize("resources/favicon/android-chrome-192x192.png"), + path.normalize("resources/favicon/android-chrome-512x512.png"), + path.normalize("resources/favicon/apple-touch-icon.png"), + path.normalize("resources/favicon/browserconfig.xml"), + path.normalize("resources/favicon/browserconfig.xml"), + path.normalize("resources/favicon/favicon-16x16.png"), + path.normalize("resources/favicon/favicon-32x32.png"), + path.normalize("resources/favicon/favicon.ico"), + path.normalize("resources/favicon/mstile-150x150.png"), + path.normalize("resources/favicon/safari-pinned-tab.svg"), + path.normalize("resources/favicon/site.webmanifest"), + // * Theme Copy (override if present) favicon + path.normalize("resources/theme/mounted/favicon/android-chrome-192x192.png"), + path.normalize("resources/theme/mounted/favicon/android-chrome-512x512.png"), + path.normalize("resources/theme/mounted/favicon/apple-touch-icon.png"), + path.normalize("resources/theme/mounted/favicon/browserconfig.xml"), + path.normalize("resources/theme/mounted/favicon/browserconfig.xml"), + path.normalize("resources/theme/mounted/favicon/favicon-16x16.png"), + path.normalize("resources/theme/mounted/favicon/favicon-32x32.png"), + path.normalize("resources/theme/mounted/favicon/favicon.ico"), + path.normalize("resources/theme/mounted/favicon/mstile-150x150.png"), + path.normalize("resources/theme/mounted/favicon/safari-pinned-tab.svg"), + path.normalize("resources/theme/mounted/favicon/site.webmanifest"), + ], + dest: path.normalize("public") + }, + ], + copyOnce: true, + verbose: true + }), stylelint({ dev: false, build: true,