diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php new file mode 100644 index 0000000..d90f81e --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmPasswordController.php @@ -0,0 +1,39 @@ +middleware('auth'); + } +} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..19354dc --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,26 @@ +middleware('guest:web'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..018c583 --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,39 @@ +middleware('guest:web')->except('logout'); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..6195419 --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,51 @@ + 'required', + 'email' => 'required|email', + 'password' => [ + 'required', 'confirmed', Password::min(8) + ->mixedCase() + ->letters() + ->numbers() + ->symbols() + ->uncompromised() + ], + ]; + } +} diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php deleted file mode 100644 index 38af354..0000000 --- a/app/Http/Controllers/LoginController.php +++ /dev/null @@ -1,34 +0,0 @@ - $request->email, "password" => $request->password - ], $request->remember !== null ? true : false) - ) { - return redirect()->route('home'); - } else { - return back()->withInput($request->except("password")) - ->withErrors("Les identifiants entrés sont incorrects, veuillez réessayer."); - } - } - - public function logout() - { - Auth::logout(); - return redirect()->route('home'); - } -} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 0cafca9..1802678 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -2,8 +2,10 @@ namespace App\Http\Controllers; +use App\Http\Controllers\Auth\ForgotPasswordController; use App\Models\User; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; use Kwaadpepper\CrudPolicies\Traits\CrudController; class UserController extends Controller @@ -21,4 +23,12 @@ class UserController extends Controller $model = $model; $model->sendMailConfirm(); } + + public function passwordResetSubmit() + { + /** @var \App\Models\User */ + $user = auth()->user(); + $request = new Request(['email' => $user->email]); + return app(ForgotPasswordController::class)->sendResetLinkEmail($request); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 5ac6653..bcaff45 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Enums\Role; use App\Jobs\SendUserCreatedEmail; +use App\Notifications\ResetPassword; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; @@ -190,6 +191,11 @@ class User extends Authenticatable dispatch(new SendUserCreatedEmail($this)); } + public function sendPasswordResetNotification($token) + { + $this->notify(new ResetPassword($token)); + } + /** * Is the user an admin or a developper ? * diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php new file mode 100644 index 0000000..ecb89e6 --- /dev/null +++ b/app/Notifications/ResetPassword.php @@ -0,0 +1,30 @@ +subject(trans('Reinitialisation de mot de passe')) + ->line(trans('Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.')) + ->action(trans('Réinitialiser le mot de passe'), $url) + ->line(trans('Ce lien de réinitialisation de mot de passe expirera dans :count minutes. ', ['count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')])) + ->line(trans('Si vous n\'avez pas demandé de réinitialisation de mot de passe, aucune autre action n\'est requise.')); + $message->viewData['greeting'] = 'Bonjour,'; + return $message; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 565c5af..cb23efd 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,9 +2,6 @@ namespace App\Providers; -use App\Models\Ticket; -use App\Policies\SitePolicy; -use App\Policies\TicketPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index f37779f..ec628cf 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -61,6 +61,9 @@ class RouteServiceProvider extends ServiceProvider */ protected function configureRateLimiting() { + RateLimiter::for('credentials', function (Request $request) { + return Limit::perMinute(30)->by(optional($request->user())->id ?: $request->ip()); + }); RateLimiter::for('api', function (Request $request) { return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); }); diff --git a/composer.json b/composer.json index a7894c4..4d380ed 100644 --- a/composer.json +++ b/composer.json @@ -17,9 +17,10 @@ "guzzlehttp/guzzle": "^7.0.1", "kwaadpepper/crud-policies": "^0.1.9", "kwaadpepper/enum": "^0.1.4", + "laravel-lang/lang": "~8.0", "laravel/framework": "^8.12", "laravel/tinker": "^2.5", - "laravel/ui": "^3.1" + "laravel/ui": "^3.3" }, "require-dev": { "facade/ignition": "^2.5", diff --git a/composer.lock b/composer.lock index dd7f334..9207fc2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "03b4961bbf5b8266d0317365ce892a88", + "content-hash": "0da9cba25dcff87fac2343ef3effa795", "packages": [ { "name": "asm89/stack-cors", @@ -1569,6 +1569,59 @@ }, "time": "2021-04-06T14:35:59+00:00" }, + { + "name": "laravel-lang/lang", + "version": "8.1.3", + "source": { + "type": "git", + "url": "https://github.com/Laravel-Lang/lang.git", + "reference": "54048d1319b211daa8ab73655b698feb09588876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/54048d1319b211daa8ab73655b698feb09588876", + "reference": "54048d1319b211daa8ab73655b698feb09588876", + "shasum": "" + }, + "require": { + "ext-json": "*" + }, + "require-dev": { + "andrey-helldar/pretty-array": "^2.3", + "andrey-helldar/support": "^3.4", + "php": "^8.0", + "phpunit/phpunit": "^9.5", + "symfony/var-dumper": "^5.2" + }, + "suggest": { + "andrey-helldar/laravel-lang-publisher": "Easy installation and update of translation files for your project", + "arcanedev/laravel-lang": "Translations manager and checker for Laravel 5", + "overtrue/laravel-lang": "Command to add languages in your project" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laravel-Lang Team", + "homepage": "https://github.com/Laravel-Lang" + } + ], + "description": "Languages for Laravel", + "keywords": [ + "lang", + "languages", + "laravel", + "lpm" + ], + "support": { + "issues": "https://github.com/Laravel-Lang/lang/issues", + "source": "https://github.com/Laravel-Lang/lang" + }, + "time": "2021-04-14T17:41:45+00:00" + }, { "name": "laravel/framework", "version": "v8.52.0", diff --git a/database/migrations/2021_08_01_140823_create_password_resets_table.php b/database/migrations/2021_08_01_140823_create_password_resets_table.php new file mode 100644 index 0000000..0ee0a36 --- /dev/null +++ b/database/migrations/2021_08_01_140823_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +} diff --git a/resources/lang/fr.json b/resources/lang/fr.json new file mode 100644 index 0000000..26f4a4d --- /dev/null +++ b/resources/lang/fr.json @@ -0,0 +1,10 @@ +{ + "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si vous ne parvenez pas à cliquer sur le bouton \":actionText\", copiez et collez l'URL ci-dessous\ndans votre navigateur Web :", + "Regards": "Cordialement", + "All rights reserved.": "Tous droits réservés.", + "The :attribute must contain at least one uppercase and one lowercase letter.": ":attribute doit contenir au moins une lettre majuscule et une lettre minuscule.", + "The :attribute must contain at least one letter.": ":attribute doit contenir au moins une lettre.", + "The :attribute must contain at least one symbol.": ":attribute doit contenir au moins un caractère spécial.", + "The :attribute must contain at least one number.": ":attribute doit contenir au moins un nombre.", + "The given :attribute has appeared in a data leak. Please choose a different :attribute.": ":attribute apparait dans une fuite de données sur le web. Merci de choisir un :attribute différent." +} diff --git a/resources/lang/fr/validation-inline.php b/resources/lang/fr/validation-inline.php new file mode 100644 index 0000000..a06110a --- /dev/null +++ b/resources/lang/fr/validation-inline.php @@ -0,0 +1,131 @@ + 'Ce champ doit être accepté.', + 'active_url' => 'Ce n\'est pas une URL valide', + 'after' => 'La date doit être postérieure au :date.', + 'after_or_equal' => 'La date doit être postérieure ou égale au :date.', + 'alpha' => 'Ce champ doit contenir uniquement des lettres', + 'alpha_dash' => 'Ce champ doit contenir uniquement des lettres, des chiffres et des tirets.', + 'alpha_num' => 'Ce champ doit contenir uniquement des chiffres et des lettres.', + 'array' => 'Ce champ doit être un tableau.', + 'attached' => 'Ce champ est déjà attaché.', + 'before' => 'Ce champ doit être une date antérieure au :date.', + 'before_or_equal' => 'Ce champ doit être une date antérieure ou égale au :date.', + 'between' => [ + 'array' => 'Le tableau doit contenir entre :min et :max éléments.', + 'file' => 'La taille du fichier doit être comprise entre :min et :max kilo-octets.', + 'numeric' => 'La valeur doit être comprise entre :min et :max.', + 'string' => 'Le texte doit contenir entre :min et :max caractères.', + ], + 'boolean' => 'Ce champ doit être vrai ou faux.', + 'confirmed' => 'Le champ de confirmation ne correspond pas.', + 'date' => 'Ce n\'est pas une date valide.', + 'date_equals' => 'La date doit être égale à :date.', + 'date_format' => 'Ce champ ne correspond pas au format :format.', + 'different' => 'Cette valeur doit être différente de :other.', + 'digits' => 'Ce champ doit contenir :digits chiffres.', + 'digits_between' => 'Ce champ doit contenir entre :min et :max chiffres.', + 'dimensions' => 'La taille de l\'image n\'est pas conforme.', + 'distinct' => 'Ce champ a une valeur en double.', + 'email' => 'Ce champ doit être une adresse email valide.', + 'ends_with' => 'Ce champ doit se terminer par une des valeurs suivantes : :values', + 'exists' => 'Ce champ sélectionné est invalide.', + 'file' => 'Ce champ doit être un fichier.', + 'filled' => 'Ce champ doit avoir une valeur.', + 'gt' => [ + 'array' => 'Le tableau doit contenir plus de :value éléments.', + 'file' => 'La taille du fichier doit être supérieure à :value kilo-octets.', + 'numeric' => 'La valeur doit être supérieure à :value.', + 'string' => 'Le texte doit contenir plus de :value caractères.', + ], + 'gte' => [ + 'array' => 'Le tableau doit contenir au moins :value éléments.', + 'file' => 'La taille du fichier doit être supérieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur doit être supérieure ou égale à :value.', + 'string' => 'Le texte doit contenir au moins :value caractères.', + ], + 'image' => 'Ce champ doit être une image.', + 'in' => 'Ce champ est invalide.', + 'in_array' => 'Ce champ n\'existe pas dans :other.', + 'integer' => 'Ce champ doit être un entier.', + 'ip' => 'Ce champ doit être une adresse IP valide.', + 'ipv4' => 'Ce champ doit être une adresse IPv4 valide.', + 'ipv6' => 'Ce champ doit être une adresse IPv6 valide.', + 'json' => 'Ce champ doit être un document JSON valide.', + 'lt' => [ + 'array' => 'Le tableau doit contenir moins de :value éléments.', + 'file' => 'La taille du fichier doit être inférieure à :value kilo-octets.', + 'numeric' => 'La valeur doit être inférieure à :value.', + 'string' => 'Le texte doit contenir moins de :value caractères.', + ], + 'lte' => [ + 'array' => 'Le tableau doit contenir au plus :value éléments.', + 'file' => 'La taille du fichier doit être inférieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur doit être inférieure ou égale à :value.', + 'string' => 'Le texte doit contenir au plus :value caractères.', + ], + 'max' => [ + 'array' => 'Le tableau ne peut contenir plus de :max éléments.', + 'file' => 'La taille du fichier ne peut pas dépasser :max kilo-octets.', + 'numeric' => 'La valeur ne peut être supérieure à :max.', + 'string' => 'Le texte ne peut contenir plus de :max caractères.', + ], + 'mimes' => 'Le fichier doit être de type : :values.', + 'mimetypes' => 'Le fichier doit être de type : :values.', + 'min' => [ + 'array' => 'Le tableau doit contenir au moins :min éléments.', + 'file' => 'La taille du fichier doit être supérieure à :min kilo-octets.', + 'numeric' => 'La valeur doit être supérieure ou égale à :min.', + 'string' => 'Le texte doit contenir au moins :min caractères.', + ], + 'multiple_of' => 'La valeur doit être un multiple de :value', + 'not_in' => 'Le champ sélectionné n\'est pas valide.', + 'not_regex' => 'Le format du champ n\'est pas valide.', + 'numeric' => 'Ce champ doit contenir un nombre.', + 'password' => 'Le mot de passe est incorrect', + 'present' => 'Ce champ doit être présent.', + 'prohibited' => 'Ce champ est interdit', + 'prohibited_if' => 'Ce champ est interdit quand :other a la valeur :value.', + 'prohibited_unless' => 'Ce champ est interdit à moins que :other ait l\'une des valeurs :values.', + 'regex' => 'Le format du champ est invalide.', + 'relatable' => 'Ce champ n\'est sans doute pas associé avec cette donnée.', + 'required' => 'Ce champ est obligatoire.', + 'required_if' => 'Ce champ est obligatoire quand la valeur de :other est :value.', + 'required_unless' => 'Ce champ est obligatoire sauf si :other est :values.', + 'required_with' => 'Ce champ est obligatoire quand :values est présent.', + 'required_with_all' => 'Ce champ est obligatoire quand :values sont présents.', + 'required_without' => 'Ce champ est obligatoire quand :values n\'est pas présent.', + 'required_without_all' => 'Ce champ est requis quand aucun de :values n\'est présent.', + 'same' => 'Ce champ doit être identique à :other.', + 'size' => [ + 'array' => 'Le tableau doit contenir :size éléments.', + 'file' => 'La taille du fichier doit être de :size kilo-octets.', + 'numeric' => 'La valeur doit être :size.', + 'string' => 'Le texte doit contenir :size caractères.', + ], + 'starts_with' => 'Ce champ doit commencer avec une des valeurs suivantes : :values', + 'string' => 'Ce champ doit être une chaîne de caractères.', + 'timezone' => 'Ce champ doit être un fuseau horaire valide.', + 'unique' => 'La valeur est déjà utilisée.', + 'uploaded' => 'Le fichier n\'a pu être téléversé.', + 'url' => 'Le format de l\'URL n\'est pas valide.', + 'uuid' => 'Ce champ doit être un UUID valide', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + 'attributes' => [], +]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index b0f5da5..5940e43 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -1,42 +1,43 @@ 'Le champ :attribute doit être accepté.', - 'active_url' => "Le champ :attribute n'est pas une URL valide.", + 'active_url' => 'Le champ :attribute n\'est pas une URL valide.', 'after' => 'Le champ :attribute doit être une date postérieure au :date.', 'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale au :date.', 'alpha' => 'Le champ :attribute doit contenir uniquement des lettres.', 'alpha_dash' => 'Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets.', 'alpha_num' => 'Le champ :attribute doit contenir uniquement des chiffres et des lettres.', 'array' => 'Le champ :attribute doit être un tableau.', + 'attached' => ':attribute est déjà attaché(e).', 'before' => 'Le champ :attribute doit être une date antérieure au :date.', 'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale au :date.', 'between' => [ - 'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.', - 'file' => 'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.', - 'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.', 'array' => 'Le tableau :attribute doit contenir entre :min et :max éléments.', + 'file' => 'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.', + 'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.', ], 'boolean' => 'Le champ :attribute doit être vrai ou faux.', 'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.', - 'date' => "Le champ :attribute n'est pas une date valide.", + 'date' => 'Le champ :attribute n\'est pas une date valide.', 'date_equals' => 'Le champ :attribute doit être une date égale à :date.', 'date_format' => 'Le champ :attribute ne correspond pas au format :format.', 'different' => 'Les champs :attribute et :other doivent être différents.', 'digits' => 'Le champ :attribute doit contenir :digits chiffres.', 'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.', - 'dimensions' => "La taille de l'image :attribute n'est pas conforme.", + 'dimensions' => 'La taille de l\'image :attribute n\'est pas conforme.', 'distinct' => 'Le champ :attribute a une valeur en double.', 'email' => 'Le champ :attribute doit être une adresse email valide.', 'ends_with' => 'Le champ :attribute doit se terminer par une des valeurs suivantes : :values', @@ -44,137 +45,118 @@ return [ 'file' => 'Le champ :attribute doit être un fichier.', 'filled' => 'Le champ :attribute doit avoir une valeur.', 'gt' => [ - 'numeric' => 'La valeur de :attribute doit être supérieure à :value.', - 'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.', - 'string' => 'Le texte :attribute doit contenir plus de :value caractères.', 'array' => 'Le tableau :attribute doit contenir plus de :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure à :value.', + 'string' => 'Le texte :attribute doit contenir plus de :value caractères.', ], 'gte' => [ - 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.', - 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.', - 'string' => 'Le texte :attribute doit contenir au moins :value caractères.', 'array' => 'Le tableau :attribute doit contenir au moins :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.', + 'string' => 'Le texte :attribute doit contenir au moins :value caractères.', ], 'image' => 'Le champ :attribute doit être une image.', 'in' => 'Le champ :attribute est invalide.', - 'in_array' => "Le champ :attribute n'existe pas dans :other.", + 'in_array' => 'Le champ :attribute n\'existe pas dans :other.', 'integer' => 'Le champ :attribute doit être un entier.', 'ip' => 'Le champ :attribute doit être une adresse IP valide.', 'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.', 'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.', 'json' => 'Le champ :attribute doit être un document JSON valide.', 'lt' => [ - 'numeric' => 'La valeur de :attribute doit être inférieure à :value.', - 'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.', - 'string' => 'Le texte :attribute doit contenir moins de :value caractères.', 'array' => 'Le tableau :attribute doit contenir moins de :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être inférieure à :value.', + 'string' => 'Le texte :attribute doit contenir moins de :value caractères.', ], 'lte' => [ - 'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.', - 'file' => 'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.', - 'string' => 'Le texte :attribute doit contenir au plus :value caractères.', 'array' => 'Le tableau :attribute doit contenir au plus :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.', + 'string' => 'Le texte :attribute doit contenir au plus :value caractères.', ], 'max' => [ - 'numeric' => 'La valeur de :attribute ne peut être supérieure à :max.', - 'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.', - 'string' => 'Le texte de :attribute ne peut contenir plus de :max caractères.', 'array' => 'Le tableau :attribute ne peut contenir plus de :max éléments.', + 'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.', + 'numeric' => 'La valeur de :attribute ne peut être supérieure à :max.', + 'string' => 'Le texte de :attribute ne peut contenir plus de :max caractères.', ], 'mimes' => 'Le champ :attribute doit être un fichier de type : :values.', 'mimetypes' => 'Le champ :attribute doit être un fichier de type : :values.', 'min' => [ - 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.', - 'file' => 'La taille du fichier de :attribute doit être supérieure à :min kilo-octets.', - 'string' => 'Le texte :attribute doit contenir au moins :min caractères.', 'array' => 'Le tableau :attribute doit contenir au moins :min éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure à :min kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.', + 'string' => 'Le texte :attribute doit contenir au moins :min caractères.', ], 'multiple_of' => 'La valeur de :attribute doit être un multiple de :value', - 'not_in' => "Le champ :attribute sélectionné n'est pas valide.", - 'not_regex' => "Le format du champ :attribute n'est pas valide.", + 'not_in' => 'Le champ :attribute sélectionné n\'est pas valide.', + 'not_regex' => 'Le format du champ :attribute n\'est pas valide.', 'numeric' => 'Le champ :attribute doit contenir un nombre.', 'password' => 'Le mot de passe est incorrect', 'present' => 'Le champ :attribute doit être présent.', + 'prohibited' => 'Le champ :attribute est interdit.', + 'prohibited_if' => 'Le champ :attribute est interdit quand :other a la valeur :value.', + 'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other est l\'une des valeurs :values.', 'regex' => 'Le format du champ :attribute est invalide.', + 'relatable' => ':attribute n\'est sans doute pas associé(e) avec cette donnée.', 'required' => 'Le champ :attribute est obligatoire.', 'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.', 'required_unless' => 'Le champ :attribute est obligatoire sauf si :other est :values.', 'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.', 'required_with_all' => 'Le champ :attribute est obligatoire quand :values sont présents.', - 'required_without' => "Le champ :attribute est obligatoire quand :values n'est pas présent.", - 'required_without_all' => "Le champ :attribute est requis quand aucun de :values n'est présent.", + 'required_without' => 'Le champ :attribute est obligatoire quand :values n\'est pas présent.', + 'required_without_all' => 'Le champ :attribute est requis quand aucun de :values n\'est présent.', 'same' => 'Les champs :attribute et :other doivent être identiques.', 'size' => [ - 'numeric' => 'La valeur de :attribute doit être :size.', - 'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.', - 'string' => 'Le texte de :attribute doit contenir :size caractères.', 'array' => 'Le tableau :attribute doit contenir :size éléments.', + 'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être :size.', + 'string' => 'Le texte de :attribute doit contenir :size caractères.', ], 'starts_with' => 'Le champ :attribute doit commencer avec une des valeurs suivantes : :values', 'string' => 'Le champ :attribute doit être une chaîne de caractères.', 'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.', 'unique' => 'La valeur du champ :attribute est déjà utilisée.', - 'uploaded' => "Le fichier du champ :attribute n'a pu être téléversé.", - 'url' => "Le format de l'URL de :attribute n'est pas valide.", + 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.', + 'url' => 'Le format de l\'URL de :attribute n\'est pas valide.', 'uuid' => 'Le champ :attribute doit être un UUID valide', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ + 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [ - 'name' => 'nom', - 'username' => "nom d'utilisateur", + 'attributes' => [ + 'address' => 'adresse', + 'age' => 'âge', + 'available' => 'disponible', + 'city' => 'ville', + 'content' => 'contenu', + 'country' => 'pays', + 'current_password' => 'mot de passe actuel', + 'date' => 'date', + 'day' => 'jour', + 'description' => 'description', 'email' => 'adresse email', + 'excerpt' => 'extrait', 'first_name' => 'prénom', + 'gender' => 'genre', + 'hour' => 'heure', 'last_name' => 'nom', + 'minute' => 'minute', + 'mobile' => 'portable', + 'month' => 'mois', + 'name' => 'nom', 'password' => 'mot de passe', 'password_confirmation' => 'confirmation du mot de passe', - 'city' => 'ville', - 'country' => 'pays', - 'address' => 'adresse', 'phone' => 'téléphone', - 'mobile' => 'portable', - 'age' => 'âge', - 'sex' => 'sexe', - 'gender' => 'genre', - 'day' => 'jour', - 'month' => 'mois', - 'year' => 'année', - 'hour' => 'heure', - 'minute' => 'minute', 'second' => 'seconde', - 'title' => 'titre', - 'content' => 'contenu', - 'description' => 'description', - 'excerpt' => 'extrait', - 'date' => 'date', - 'time' => 'heure', - 'available' => 'disponible', + 'sex' => 'sexe', 'size' => 'taille', + 'time' => 'heure', + 'title' => 'titre', + 'username' => 'nom d\'utilisateur', + 'year' => 'année', ], ]; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..14ffd0c --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,73 @@ +@extends('layout.app') + +@section('content') +
+
+
+
+
{{ __('Connexion') }}
+ +
+
+ @csrf + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+
+
+ + + +
+
+
+ +
+
+ + + @if (Route::has('password.request')) + + {{ __('Mot de passe oublié ?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/confirm.blade.php b/resources/views/auth/passwords/confirm.blade.php new file mode 100644 index 0000000..74fc023 --- /dev/null +++ b/resources/views/auth/passwords/confirm.blade.php @@ -0,0 +1,49 @@ +@extends('layout.app') + +@section('content') +
+
+
+
+
{{ __('Confirmez votre mot de passe') }}
+ +
+ {{ __('Veuillez confirmer votre mot de passe pour continuer') }} + +
+ @csrf + +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+
+ + + @if (Route::has('password.request')) + + {{ __('Mot de passe oublié ?') }} + + @endif +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php new file mode 100644 index 0000000..29a4951 --- /dev/null +++ b/resources/views/auth/passwords/email.blade.php @@ -0,0 +1,47 @@ +@extends('layout.app') + +@section('content') +
+
+
+
+
{{ __('Réinitialisation de mot de passe') }}
+ +
+ @if (session('status')) + + @endif + +
+ @csrf + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php new file mode 100644 index 0000000..a738743 --- /dev/null +++ b/resources/views/auth/passwords/reset.blade.php @@ -0,0 +1,65 @@ +@extends('layout.app') + +@section('content') +
+
+
+
+
{{ __('Réinitialisation de mot de passe') }}
+ +
+
+ @csrf + + + +
+ + +
+ + + @error('email') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ + + @error('password') + + {{ $message }} + + @enderror +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/layout/nav.blade.php b/resources/views/layout/nav.blade.php index 799b266..76c0790 100644 --- a/resources/views/layout/nav.blade.php +++ b/resources/views/layout/nav.blade.php @@ -62,6 +62,9 @@