ldc-gen-game-web/app/Http/Controllers/LoginController.php

254 lines
10 KiB
PHP
Raw Normal View History

2020-10-29 15:40:23 +01:00
<?php
namespace App\Http\Controllers;
use App\Mail\PasswordReset;
use App\Mail\VerifyEmail;
2020-11-12 17:22:54 +01:00
use App\Models\Settings;
2020-10-29 15:40:23 +01:00
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
2020-10-29 15:40:23 +01:00
use App\User;
use Exception;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
2020-10-29 15:40:23 +01:00
class LoginController extends Controller
{
2021-02-23 18:27:03 +01:00
private $apiCrm;
2020-10-29 15:40:23 +01:00
public function __construct() {
$this->middleware('guest')->except('logout');
2021-02-23 18:27:03 +01:00
$this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token'));
2020-10-29 15:40:23 +01:00
}
public function index() {
return view('front.basic.login');
}
public function authenticate(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
2020-10-29 15:40:23 +01:00
$password = $request->password;
$remember = $request->remember !== null ? true : false;
$userLocal = User::where('email', $email)->first();
if ($userLocal) {
if ($userLocal->email_verified === 1) {
if ($userLocal->role > 2) {
2021-02-23 18:27:03 +01:00
$connect = $this->apiCrm->loginCustomer($email, $password);
2021-06-17 09:14:56 +02:00
if ($connect->status === 'KO'){
2021-02-23 18:27:03 +01:00
if ($connect->code === 500) {
return back()->withInput($request->except("password"))->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.");
}else{
return back()->withInput($request->except("password"))->withErrors("Email ou mot de passe incorrect.");
}
2020-10-29 15:40:23 +01:00
}
}
} else {
$userLocal->email_verify_token = Str::uuid();
$userLocal->save();
Mail::to($email)->send(new VerifyEmail($userLocal));
2020-11-20 17:47:05 +01:00
return back()->withInput($request->except( "password"))->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails.");
2020-10-29 15:40:23 +01:00
}
2020-11-20 17:47:05 +01:00
} else {
2021-02-23 18:27:03 +01:00
$connect = $this->apiCrm->loginCustomer($email, $password);
if ($connect->status === 'OK'){
$userLocal = User::create([
'crm_id' => $connect->user->crm_id,
'firstname' => $connect->user->firstname,
'lastname' => $connect->user->lastname,
'birth_date' => $connect->user->birth_date,
'email' => $email,
'password' => Hash::make("MOTDEPASSE"), // TODO : ???
'address' => $connect->user->address,
'address2' => $connect->user->address2,
'town' => $connect->user->city,
'postal_code' => $connect->user->postcode,
'country' => $connect->user->country,
'email_verified' => 1
]);
}else{
if ($connect->code === 116) { // Compte existant mais non activé
2020-11-20 17:47:05 +01:00
$userLocal = User::create([
2021-02-23 18:27:03 +01:00
'crm_id' => $connect->user->crm_id,
'firstname' => $connect->user->firstname,
'lastname' => $connect->user->lastname,
'birth_date' => $connect->user->birth_date,
'email' => $email,
'password' => Hash::make("MOTDEPASSE"), // TODO : ???
'address' => $connect->user->address,
'address2' => $connect->user->address2,
'town' => $connect->user->city,
'postal_code' => $connect->user->postcode,
'country' => $connect->user->country
2020-11-20 17:47:05 +01:00
]);
2021-02-23 18:27:03 +01:00
$userLocal->email_verify_token = Str::uuid();
$userLocal->save();
Mail::to($email)->send(new VerifyEmail($userLocal));
return back()->withInput($request->except( "password"))->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails.");
}elseif ($connect->code === 500){
return back()->withInput($request->except("password"))->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.");
}else{
2020-11-20 17:47:05 +01:00
return back()->withInput($request->except("password"))->withErrors("Email ou mot de passe incorrect.");
}
2020-10-29 15:40:23 +01:00
}
2020-11-20 17:47:05 +01:00
}
2021-02-23 18:27:03 +01:00
// TODO : Modifier avec separation guard
2020-11-20 17:47:05 +01:00
$tmpPwd = "MOTDEPASSE";
if ($userLocal->role <= 2)
2020-11-20 17:47:05 +01:00
$tmpPwd = $password;
if (Auth::attempt(["email" => $email, "password" => $tmpPwd], $remember)) {
if ($userLocal->role <= 2)
2020-11-20 17:47:05 +01:00
return redirect()->route('bo.dashboard');
return redirect()->route('saisir-code');
2020-10-29 15:40:23 +01:00
} else {
2020-11-20 17:47:05 +01:00
return back()->withInput($request->except('password'))->withErrors('Les identifiants entrés sont incorrects.');
2020-10-29 15:40:23 +01:00
}
}
public function logout() {
Auth::logout();
return redirect()->route('home');
}
public function confirmEmail($verifyToken) {
$result = false;
$user = User::where('email_verify_token', $verifyToken)->first();
if (!$user)
return view('front.basic.confirm-email', compact('result'));
2020-11-13 17:42:59 +01:00
2021-02-23 18:27:03 +01:00
$activation = $this->apiCrm->activateCustomer($user->crm_id);
if ($activation->status === 'OK'){
$user->email_verified = 1;
$user->email_verify_token = NULL;
$user->save();
$result = true;
}else{
if ($activation->code === 110){ // User already active
2020-11-13 17:42:59 +01:00
$user->email_verified = 1;
$user->email_verify_token = NULL;
2020-11-13 17:42:59 +01:00
$user->save();
$result = true;
}
}
return view('front.basic.confirm-email', compact('result'));
}
2020-11-12 17:22:54 +01:00
public function forgotPassword(Request $request) {
if ($request->tokenValid && $request->token) {
$tokenValid = $request->tokenValid;
$token = $request->token;
return view('front.basic.forgot-password', compact('tokenValid', 'token'));
}
return view('front.basic.forgot-password');
}
public function forgotPasswordReset(Request $request, $token) {
2020-11-16 10:55:42 +01:00
if (!$request->hasValidSignature(false))
return redirect()->route('login')->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer.");
$tokenValid = false;
$user = User::where('password_token', $token)->first();
if (!$user)
return redirect()->route('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'));
}
public function mailPassword(Request $request) {
$email = filter_var($request->email, FILTER_SANITIZE_STRING);
$user = User::where('email', $email)->first();
2021-02-23 18:27:03 +01:00
2020-12-09 17:36:54 +01:00
if (!$user) {
2021-02-23 18:27:03 +01:00
$userCrm = $this->apiCrm->getCustomerByEmail($email);
if ($userCrm->status === 'OK'){
$user = User::create([
'crm_id' => $userCrm->user->crm_id,
'firstname' => $userCrm->user->firstname,
'lastname' => $userCrm->user->lastname,
'birth_date' => $userCrm->user->birth_date,
'email' => $email,
'password' => Hash::make("MOTDEPASSE"), // TODO : ???
'address' => $userCrm->user->address,
'address2' => $userCrm->user->address2,
'town' => $userCrm->user->city,
'postal_code' => $userCrm->user->postcode,
'country' => $userCrm->user->country,
'email_verified' => 1
]);
if ($userCrm->user->status === 0){
$user->email_verified = 0;
$user->email_verify_token = Str::uuid();
$user->save();
Mail::to($email)->send(new VerifyEmail($user));
return back()->withInput($request->except( "password"))->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails.");
}
}else{
if ($userCrm->code === 101) {
2020-12-09 17:36:54 +01:00
return back()->withInput($request->only('email'))->withErrors("Le mail que vous avez entré n'est pas enregistré dans nos services.");
2021-02-23 18:27:03 +01:00
}else{
return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
2020-12-09 17:36:54 +01:00
}
}
}
2020-12-09 17:36:54 +01:00
$user->password_token = Str::uuid();
$user->save();
$settings = Settings::find(1);
Mail::to($email)->send(new PasswordReset($user, $settings));
return redirect()->route('login')->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).');
}
public function changePassword(Request $request) {
$request->validate([
'password' => 'required|min:8|confirmed',
]);
$user = User::where('password_token', filter_var($request->token, FILTER_SANITIZE_STRING))->first();
if (!$user)
return back()->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.');
2020-11-20 17:47:05 +01:00
// TODO : Ajouter controle du contenu du mot de passe
$newPassword = $request->password;
2020-11-20 17:47:05 +01:00
2021-02-23 18:27:03 +01:00
$update = $this->apiCrm->changePwdCustomer($user->crm_id, $newPassword);
if ($update->status === 'OK'){
$user->password_token = NULL;
$user->save();
2021-02-23 18:27:03 +01:00
return redirect()->route('login')->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.');
}else{
if ($update->code === 123){
return back()->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte. Veuillez réessayer en changeant de mot de passe.");
}else{
return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
}
2020-11-20 17:47:05 +01:00
}
}
2020-10-29 15:40:23 +01:00
}