327 lines
12 KiB
PHP
327 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Fo;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Mail\PasswordReset;
|
|
use App\Mail\VerifyEmail;
|
|
use App\Models\Customer;
|
|
use App\Models\Settings;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
class LoginController extends Controller
|
|
{
|
|
/** @var \LDCCRM\ApiV1 $apiCrm */
|
|
private $apiCrm;
|
|
|
|
/**
|
|
* Create a new controller instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->middleware('guest')->except('logout');
|
|
// $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token'));
|
|
}
|
|
|
|
/**
|
|
* Get the view of the index.
|
|
*
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function index()
|
|
{
|
|
return view('theme::fo.login');
|
|
}
|
|
|
|
/**
|
|
* Authenticate the user.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function authenticate(Request $request)
|
|
{
|
|
$request->validate([
|
|
'email' => 'required|email',
|
|
'password' => 'required',
|
|
]);
|
|
|
|
$email = filter_var($request->email, FILTER_SANITIZE_EMAIL);
|
|
$password = $request->password;
|
|
|
|
/** @var \App\Models\Customer $userLocal */
|
|
$userLocal = Customer::where('email', $email)->first();
|
|
if ($userLocal) {
|
|
if ($userLocal->email_verified === 1) {
|
|
$connect = $this->apiCrm->loginCustomer($email, $password);
|
|
|
|
if ($connect->status === 'KO') {
|
|
if ($connect->code === 500) {
|
|
return redirect()->back()
|
|
->withInput($request->except("password"))
|
|
->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.");
|
|
} else {
|
|
return redirect()->back()
|
|
->withInput($request->except("password"))
|
|
->withErrors("Email ou mot de passe incorrect.");
|
|
}
|
|
}
|
|
} else {
|
|
$userLocal->email_verify_token = Str::uuid();
|
|
$userLocal->save();
|
|
Mail::to($email)->send(new VerifyEmail($userLocal));
|
|
return redirect()->back()
|
|
->withInput($request->except("password"))
|
|
->withErrors("Votre compte existe mais votre email n'est pas confirmé,
|
|
merci de vérifier vos emails.");
|
|
} //end if
|
|
} else {
|
|
$connect = $this->apiCrm->loginCustomer($email, $password);
|
|
|
|
if ($connect->status === 'OK') {
|
|
/** @var \App\Models\Customer $userLocal */
|
|
$userLocal = Customer::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($password),
|
|
'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 {
|
|
// Compte existant mais non activé.
|
|
if ($connect->code === 116) {
|
|
/** @var \App\Models\Customer $userLocal */
|
|
$userLocal = Customer::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($password),
|
|
'address' => $connect->user->address,
|
|
'address2' => $connect->user->address2,
|
|
'town' => $connect->user->city,
|
|
'postal_code' => $connect->user->postcode,
|
|
'country' => $connect->user->country
|
|
]);
|
|
|
|
$userLocal->email_verify_token = Str::uuid();
|
|
$userLocal->save();
|
|
Mail::to($email)->send(new VerifyEmail($userLocal));
|
|
return redirect()->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 redirect()->back()
|
|
->withInput($request->except("password"))
|
|
->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.");
|
|
} else {
|
|
return redirect()->back()
|
|
->withInput($request->except("password"))
|
|
->withErrors("Email ou mot de passe incorrect.");
|
|
} //end if
|
|
} //end if
|
|
} //end if
|
|
|
|
Auth::login($userLocal);
|
|
return redirect()->route('fo.saisir-code');
|
|
}
|
|
|
|
/**
|
|
* Logout.
|
|
*
|
|
* @return Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function logout()
|
|
{
|
|
Auth::logout();
|
|
return redirect()->route('fo.home');
|
|
}
|
|
|
|
/**
|
|
* Confirm email.
|
|
*
|
|
* @param string $verifyToken
|
|
* @return \Illuminate\View\View|Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function confirmEmail(string $verifyToken)
|
|
{
|
|
$result = false;
|
|
$user = Customer::where('email_verify_token', $verifyToken)->first();
|
|
if (!$user) {
|
|
return view('theme::fo.confirm-email', compact('result'));
|
|
}
|
|
|
|
$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 {
|
|
// User already active.
|
|
if ($activation->code === 110) {
|
|
$user->email_verified = 1;
|
|
$user->email_verify_token = null;
|
|
$user->save();
|
|
$result = true;
|
|
}
|
|
}
|
|
|
|
return view('theme::fo.confirm-email', compact('result'));
|
|
}
|
|
|
|
/**
|
|
* Display the view to request a password reset link
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
|
*/
|
|
public function forgotPassword(Request $request)
|
|
{
|
|
if ($request->tokenValid && $request->token) {
|
|
$tokenValid = $request->tokenValid;
|
|
$token = $request->token;
|
|
return view('theme::fo.forgot-password', compact('tokenValid', 'token'));
|
|
}
|
|
return view('theme::fo.forgot-password');
|
|
}
|
|
|
|
/**
|
|
* Display the view to reset a password
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @param string $token
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
|
*/
|
|
public function forgotPasswordReset(Request $request, string $token)
|
|
{
|
|
if (!$request->hasValidSignature(false)) {
|
|
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('fo.forgot-password', compact('tokenValid'))
|
|
->withErrors('Le lien de changement du mot de passe est incorrect.');
|
|
}
|
|
$tokenValid = true;
|
|
return redirect()->route('fo.forgot-password', compact('tokenValid', 'token'));
|
|
}
|
|
|
|
/**
|
|
* Send the reset password mail
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function mailPassword(Request $request)
|
|
{
|
|
$email = filter_var($request->email, FILTER_SANITIZE_STRING);
|
|
$user = Customer::where('email', $email)->first();
|
|
|
|
if (!$user) {
|
|
$userCrm = $this->apiCrm->getCustomerByEmail($email);
|
|
if ($userCrm->status === 'OK') {
|
|
$user = Customer::create([
|
|
'crm_id' => $userCrm->user->crm_id,
|
|
'firstname' => $userCrm->user->firstname,
|
|
'lastname' => $userCrm->user->lastname,
|
|
'birth_date' => $userCrm->user->birth_date,
|
|
'email' => $email,
|
|
// TODO : MOTDEPASSE ???
|
|
'password' => Hash::make("MOTDEPASSE"),
|
|
'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) {
|
|
return redirect()->back()
|
|
->withInput($request->only('email'))
|
|
->withErrors("Le mail que vous avez entré n'est pas enregistré dans nos services.");
|
|
} else {
|
|
return redirect()->back()
|
|
->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
|
|
}
|
|
} //end if
|
|
} //end if
|
|
|
|
$user->password_token = Str::uuid();
|
|
$user->save();
|
|
/** @var \App\Models\Settings $settings */
|
|
$settings = app(Settings::class);
|
|
Mail::to($email)->send(new PasswordReset($user, $settings));
|
|
return redirect()->route('fo.login')
|
|
->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).');
|
|
}
|
|
|
|
/**
|
|
* Change the password
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function changePassword(Request $request)
|
|
{
|
|
$request->validate([
|
|
'password' => 'required|min:8|confirmed',
|
|
]);
|
|
|
|
$user = Customer::where('password_token', filter_var($request->token, FILTER_SANITIZE_STRING))->first();
|
|
if (!$user) {
|
|
return redirect()->back()
|
|
->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.');
|
|
}
|
|
|
|
// TODO : Ajouter controle du contenu du mot de passe.
|
|
$newPassword = $request->password;
|
|
|
|
$update = $this->apiCrm->changePwdCustomer($user->crm_id, $newPassword);
|
|
|
|
if ($update->status === 'OK') {
|
|
$user->password_token = null;
|
|
$user->save();
|
|
return redirect()->route('fo.login')
|
|
->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.');
|
|
} else {
|
|
if ($update->code === 123) {
|
|
return redirect()->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 redirect()->back()
|
|
->withErrors("Une erreur est survenue, veuillez réessayer plus tard.");
|
|
}
|
|
}
|
|
}
|
|
}
|