2020-10-29 15:40:23 +01:00
< ? php
namespace App\Http\Controllers ;
2020-11-02 16:18:06 +01:00
use App\Mail\PasswordReset ;
2020-10-30 16:12:14 +01:00
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 ;
2020-10-30 16:12:14 +01:00
use Illuminate\Support\Str ;
2020-10-29 15:40:23 +01:00
use App\User ;
use CPCConnection ;
use Exception ;
2020-11-02 16:18:06 +01:00
use Illuminate\Support\Facades\Hash ;
2020-10-30 16:12:14 +01:00
use Illuminate\Support\Facades\Mail ;
2020-10-29 15:40:23 +01:00
class LoginController extends Controller
{
public function __construct () {
$this -> middleware ( 'guest' ) -> except ( 'logout' );
}
public function index () {
return view ( 'front.basic.login' );
}
public function authenticate ( Request $request )
{
2020-11-23 11:22:42 +01:00
$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 ) {
2020-10-30 16:12:14 +01:00
if ( $userLocal -> email_verified === 1 ) {
if ( $userLocal -> role !== 1 ) {
2020-10-29 15:40:23 +01:00
try {
2020-10-30 16:12:14 +01:00
$cpcConnect = new CPCConnection ( config ( 'crm.CRM_PLATOS_WSDL' ), config ( 'crm.WS_SERVCE_LOGIN' ), config ( 'crm.WS_SERVCE_PASSWORD' ));
$cpcConnect -> connect ();
try {
// ---- Authentification du user
2020-11-20 17:47:05 +01:00
$cpcConnect -> authenticateUser ( $email , $password );
2020-10-30 16:12:14 +01:00
} catch ( Exception $e ) {
2020-11-19 10:05:37 +01:00
return back () -> withInput ( $request -> except ( " password " )) -> withErrors ( " Email ou mot de passe incorrect. " );
2020-10-30 16:12:14 +01:00
}
2020-10-29 15:40:23 +01:00
} catch ( Exception $e ) {
2020-11-19 10:05:37 +01:00
return back () -> withInput ( $request -> except ( " password " )) -> withErrors ( " La connexion est impossible pour le moment, veuillez réessayer plus tard. " );
2020-10-29 15:40:23 +01:00
}
}
2020-10-30 16:12:14 +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 {
try {
$cpcConnect = new CPCConnection ( config ( 'crm.CRM_PLATOS_WSDL' ), config ( 'crm.WS_SERVCE_LOGIN' ), config ( 'crm.WS_SERVCE_PASSWORD' ));
$cpcConnect -> connect ();
try {
// ---- Authentification du user
$oCrmUser = $cpcConnect -> authenticateUser ( $email , $password );
$userLocal = User :: create ([
'crm_id' => $oCrmUser -> iId ,
'civility' => $oCrmUser -> zCivilite ,
'firstname' => $oCrmUser -> zPrenom ,
'lastname' => $oCrmUser -> zNom ,
'birth_date' => $oCrmUser -> zDateNaissance ,
'email' => $oCrmUser -> zEmail ,
'password' => Hash :: make ( " MOTDEPASSE " ),
'address' => $oCrmUser -> zAdresse1 ,
'address2' => $oCrmUser -> zAdresse2 ,
'town' => $oCrmUser -> zVille ,
'postal_code' => $oCrmUser -> zCodePostal ,
'country' => " France " ,
'email_verified' => 1
]);
} catch ( Exception $e ) {
return back () -> withInput ( $request -> except ( " password " )) -> withErrors ( " Email ou mot de passe incorrect. " );
}
} catch ( Exception $e ) {
return back () -> withInput ( $request -> except ( " password " )) -> withErrors ( " La connexion est impossible pour le moment, veuillez réessayer plus tard. " );
2020-10-29 15:40:23 +01:00
}
2020-11-20 17:47:05 +01:00
}
$tmpPwd = " MOTDEPASSE " ;
if ( $userLocal -> role === 1 )
$tmpPwd = $password ;
if ( Auth :: attempt ([ " email " => $email , " password " => $tmpPwd ], $remember )) {
if ( $userLocal -> role === 1 )
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' );
}
2020-10-30 16:12:14 +01:00
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
try {
$cpcConnect = new CPCConnection ( config ( 'crm.CRM_PLATOS_WSDL' ), config ( 'crm.WS_SERVCE_LOGIN' ), config ( 'crm.WS_SERVCE_PASSWORD' ));
$cpcConnect -> connect ();
try {
$cpcConnect -> activateUser ( $user -> crm_id );
$user -> email_verified = 1 ;
2020-11-19 10:05:37 +01:00
$user -> email_verify_token = NULL ;
2020-11-13 17:42:59 +01:00
$user -> save ();
$result = true ;
} catch ( Exception $e ) {
return view ( 'front.basic.confirm-email' , compact ( 'result' ));
}
} catch ( Exception $e ) {
return view ( 'front.basic.confirm-email' , compact ( 'result' ));
}
2020-10-30 16:12:14 +01:00
return view ( 'front.basic.confirm-email' , compact ( 'result' ));
}
2020-11-02 16:18:06 +01:00
2020-11-12 17:22:54 +01:00
public function forgotPassword ( Request $request ) {
2020-11-13 20:07:43 +01:00
if ( $request -> tokenValid && $request -> token ) {
$tokenValid = $request -> tokenValid ;
$token = $request -> token ;
2020-11-02 16:18:06 +01:00
return view ( 'front.basic.forgot-password' , compact ( 'tokenValid' , 'token' ));
}
2020-11-13 20:07:43 +01:00
return view ( 'front.basic.forgot-password' );
}
public function forgotPasswordReset ( Request $request , $token ) {
2020-11-16 10:55:42 +01:00
if ( ! $request -> hasValidSignature ( false ))
2020-11-13 20:07:43 +01:00
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' ));
2020-11-02 16:18:06 +01:00
}
public function mailPassword ( Request $request ) {
$email = filter_var ( $request -> email , FILTER_SANITIZE_STRING );
$user = User :: where ( 'email' , $email ) -> first ();
2020-12-09 17:36:54 +01:00
if ( ! $user ) {
try {
$cpcConnect = new CPCConnection ( config ( 'crm.CRM_PLATOS_WSDL' ), config ( 'crm.WS_SERVCE_LOGIN' ), config ( 'crm.WS_SERVCE_PASSWORD' ));
$cpcConnect -> connect ();
try {
$oCrmUser = $cpcConnect -> getUserByEmail ( $email );
$user = User :: create ([
'crm_id' => $oCrmUser -> iId ,
'civility' => $oCrmUser -> zCivilite ,
'firstname' => $oCrmUser -> zPrenom ,
'lastname' => $oCrmUser -> zNom ,
'birth_date' => $oCrmUser -> zDateNaissance ,
'email' => $oCrmUser -> zEmail ,
'password' => Hash :: make ( " MOTDEPASSE " ),
'address' => $oCrmUser -> zAdresse1 ,
'address2' => $oCrmUser -> zAdresse2 ,
'town' => $oCrmUser -> zVille ,
'postal_code' => $oCrmUser -> zCodePostal ,
'country' => " France " , // TODO : Voir pour changer le default
'email_verified' => 1
]);
} catch ( Exception $e ) {
return back () -> withInput ( $request -> only ( 'email' )) -> withErrors ( " Le mail que vous avez entré n'est pas enregistré dans nos services. " );
}
} catch ( Exception $e ) {
return back () -> withErrors ( " Une erreur est survenue, veuillez réessayer plus tard. " );
}
2020-11-02 16:18:06 +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).' );
2020-11-02 16:18:06 +01:00
}
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 )
2020-11-19 10:05:37 +01:00
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
2020-11-02 16:18:06 +01:00
$newPassword = $request -> password ;
2020-11-20 17:47:05 +01:00
try {
$cpcConnect = new CPCConnection ( config ( 'crm.CRM_PLATOS_WSDL' ), config ( 'crm.WS_SERVCE_LOGIN' ), config ( 'crm.WS_SERVCE_PASSWORD' ));
$cpcConnect -> connect ();
try {
$cpcConnect -> changePassword ( $user -> crm_id , $newPassword );
} catch ( Exception $e ) {
return back () -> withErrors ( " Une erreur est survenue, veuillez réessayer plus tard. " );
}
} catch ( Exception $e ) {
return back () -> withErrors ( " Une erreur est survenue, veuillez réessayer plus tard. " );
}
2020-11-02 16:18:06 +01:00
return redirect () -> route ( 'login' ) -> with ( 'success' , 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.' );
}
2020-10-29 15:40:23 +01:00
}