/home/techb158/ileadtechnology.com/SSM/app/Repositories/auth
NameSizeModeActions
AuthRepository.php190820644editdlrm
LoginThrottleRepository.php18520644editdlrm
TwoFactorSecurityRepository.php13990644editdlrm
UserRepository.php22630644editdlrm
Edit: /home/techb158/ileadtechnology.com/SSM/app/Repositories/auth/AuthRepository.php (19082B)
user = $user; $this->throttle = $throttle; $this->two_factor = $two_factor; $this->config = $config; $this->ip_filter = $ip_filter; $this->academic_session = $academic_session; $this->student = $student; $this->employee = $employee; $this->user_push_token = $user_push_token; } /** * Authenticate an user. * * @param array $params * @return array */ public function auth($params = array()) { $email_or_username = gv($params, 'email_or_username'); $this->throttle->validate(); $token = $this->validateLogin($params); if (filter_var($email_or_username, FILTER_VALIDATE_EMAIL)) { $auth_user = $this->user->findByEmail($email_or_username); } else { $auth_user = $this->user->findByUsername($email_or_username); } $name = $this->validateStatus($auth_user); event(new UserLogin($auth_user)); $two_factor_code = $this->two_factor->set($auth_user); $this->checkPreference($auth_user); $auth_user = $auth_user->fresh(); $payload = auth()->payload(); $this->updatePushToken($auth_user); return $this->prepareLoginData([ 'token' => $token, 'name' => $name, 'expires_on' => $payload->get('exp'), 'auth_user' => $auth_user ]); } public function checkPreference($auth_user) { $user_preference = $auth_user->userPreference; if (!isset($user_preference) || $user_preference === '' || $user_preference === null) { $user_preference = new \App\UserPreference; $user_preference->user()->associate($auth_user); $user_preference->save(); } $user_preference->color_theme = ($user_preference->color_theme) ? : config('config.color_theme'); $user_preference->direction = ($user_preference->direction) ? : config('config.direction'); $user_preference->locale = ($user_preference->locale) ? : config('config.locale'); $user_preference->sidebar = ($user_preference->sidebar) ? : config('config.sidebar'); $user_preference->academic_session_id = $user_preference->academic_session_id ? : optional($this->academic_session->default())->id; $user_preference->save(); } /** * Validate login credentials. * * @param array $params * @return auth token */ public function validateLogin($params = array()) { $email_or_username = gv($params, 'email_or_username'); $password = gv($params, 'password'); if (filter_var($email_or_username, FILTER_VALIDATE_EMAIL)) { $credentials = array('email' => $email_or_username, 'password' => $password); } else { $credentials = array('username' => $email_or_username, 'password' => $password); } $ttl = request('device_name') ? config('config.mobile_token_lifetime') : config('config.token_lifetime'); if (! $token = auth()->setTTL($ttl)->attempt($credentials)) { $this->throttle->update(); throw ValidationException::withMessages(['email_or_username' => trans('auth.failed')]); } $this->throttle->clearCache(); return $token; } /** * Validate authenticated user status. * * @param authenticated user * @return null */ public function validateStatus($auth_user) { if ($auth_user->status === 'pending_activation') { throw ValidationException::withMessages(['email_or_username' => trans('auth.pending_activation')]); } if ($auth_user->status === 'pending_approval') { throw ValidationException::withMessages(['email_or_username' => trans('auth.pending_approval')]); } if ($auth_user->status === 'disapproved') { throw ValidationException::withMessages(['email_or_username' => trans('auth.not_activated')]); } if ($auth_user->status === 'banned') { throw ValidationException::withMessages(['email_or_username' => trans('auth.account_banned')]); } if ($auth_user->status != 'activated') { throw ValidationException::withMessages(['email_or_username' => trans('auth.not_activated')]); } if (!$auth_user->hasPermissionTo('enable-login')) { throw ValidationException::withMessages(['email_or_username' => trans('auth.login_permission_disabled')]); } $user_roles = $auth_user->getRoleNames()->all(); if (in_array(config('system.default_role.student'), $user_roles)) { $student = $auth_user->Student; $valid_student = $this->student->filterById($student->id)->whereHas('studentRecords', function ($q) { $q->whereNull('date_of_exit')->whereIsPromoted(0); })->first(); if (! $valid_student) { throw ValidationException::withMessages(['email_or_username' => trans('student.login_permission_disabled')]); } return $student->name; } elseif (in_array(config('system.default_role.parent'), $user_roles)) { $parent = $auth_user->Parent; $student_ids = $parent->Students->pluck('id')->all(); $valid_student = $this->student->whereIn('id', $student_ids)->whereHas('studentRecords', function ($q) { $q->whereNull('date_of_exit')->whereIsPromoted(0); })->count(); if (! $valid_student) { throw ValidationException::withMessages(['email_or_username' => trans('student.login_permission_disabled')]); } return $parent->first_guardian_name; } elseif ( count(array_diff($user_roles, [config('system.default_role.admin'),config('system.default_role.student'),config('system.default_role.parent')])) ) { $employee = $auth_user->Employee; $valid_employee = $this->employee->filterById($employee->id)->whereHas('employeeTerms', function ($q) { $q->whereNull('date_of_leaving'); })->first(); if (! $valid_employee) { throw ValidationException::withMessages(['email_or_username' => trans('employee.login_permission_disabled')]); } return $employee->name; } else { return optional($auth_user->Employee)->name; } } /** * Get user for OTP * @param numeric $mobile * @return User|void */ private function getUserForOTP($mobile) { $user = \App\User::whereHas('employee', function($q) use($mobile) { $q->where('contact_number', $mobile) ->orWhere('alternate_contact_number', $mobile); })->first(); if ($user) { return $user; } $user = \App\User::whereHas('student', function($q) use($mobile) { $q->where('contact_number', $mobile); })->first(); if ($user) { return $user; } $user = \App\User::whereHas('parent', function($q) use($mobile) { $q->where('first_guardian_contact_number_1', $mobile) ->orWhere('first_guardian_contact_number_2', $mobile) ->orWhere('second_guardian_contact_number_1', $mobile) ->orWhere('second_guardian_contact_number_2', $mobile); })->first(); if ($user) { return $user; } throw ValidationException::withMessages(['message' => trans('auth.could_not_find_user_with_mobile')]); } /** * Generate OTP * @param numeric $mobile * @return void */ private function generateOTP($mobile) { $key = 'otp_from_mobile_'.$mobile; if (\Cache::has($key)) { \Cache::increment($key, 1); } else { \Cache::put($key, 1, 5 * 10); } if (\Cache::get($key) > 3) { throw ValidationException::withMessages(['message' => trans('auth.max_otp_request_limit_crossed')]); } $user = $this->getUserForOTP($mobile); $otp = generateOTP(); $sms = 'Your login OTP is '.$otp.'. Do not share OTP with any one. '. config('app.name'); if ($mobile) { SendSMS::dispatch([$mobile], $sms); } \Cache::put('otp_'.$user->id, $otp, 10 * 60); } /** * Check OTP * @param array $params * @return array */ public function otp($params = array()) { if (! config('config.login_with_otp')) { throw ValidationException::withMessages(['message' => trans('general.permission_denied')]); } $mobile = gv($params, 'mobile'); $otp = gv($params, 'otp'); if (! $otp) { $this->generateOTP($mobile); return -1; } $auth_user = $this->getUserForOTP($mobile); if ($otp != \Cache::get('otp_'.$auth_user->id)) { throw ValidationException::withMessages(['message' => trans('auth.invalid_otp')]); } \Cache::forget('otp_'.$auth_user->id); \Cache::forget('otp_from_mobile_'.$mobile); $ttl = request('device_name') ? config('config.mobile_token_lifetime') : config('config.token_lifetime'); $token = auth()->setTTL($ttl)->login($auth_user); $name = $this->validateStatus($auth_user); event(new UserLogin($auth_user)); $this->checkPreference($auth_user); $payload = auth()->payload(); return $this->prepareLoginData([ 'token' => $token, 'name' => $name, 'expires_on' => $payload->get('exp'), 'auth_user' => $auth_user ]); } /** * Prepare login data * @param array $params * @return array */ private function prepareLoginData($params = array()) { $auth_user = $params['auth_user']; $token = $params['token']; $name = $params['name']; $auth_user->user_roles = $auth_user->roles()->pluck('name')->all(); $auth_user->user_permissions = $auth_user->getAllPermissions()->pluck('name')->all(); \Cache::put('locale', $auth_user->userPreference->locale, 1440 * 60); \Cache::put('direction', $auth_user->userPreference->direction, 1440 * 60); $reload = (config('app.locale') != cache('locale') || config('config.direction') != cache('direction')) ? 1 : 0; $config = $this->config->getConfig(); $academic_sessions = $this->academic_session->getAll(); $default_academic_session = $auth_user->userPreference->academic_session_id ? $auth_user->userPreference->academicSession : $academic_sessions->firstWhere('is_default',1); activity('login')->log('login'); $auth_user['name'] = $name; return [ 'message' => trans('auth.logged_in'), 'token' => $token, 'expires_on' => Carbon::createFromTimestamp(gv($params, 'expires_on'))->toDateTimeString(), 'user' => $auth_user, 'reload' => $reload, 'config' => $config, 'academic_sessions' => $academic_sessions, 'default_academic_session' => $default_academic_session ]; } /** * Update user push token * @return void */ private function updatePushToken($auth_user) { if (! request('device_name') && ! request('push_token')) { return; } if (! $auth_user->relationLoaded('pushTokens')) { $auth_user->load('pushTokens'); } $user_push_token = $auth_user->pushTokens->firstWhere('device_name', request('device_name')); if ($user_push_token && $user_push_token->token === request('push_token')) {} else { if ($user_push_token) { $user_push_token->token = request('push_token'); $user_push_token->save(); } else { $user_push_token = $this->user_push_token->create([ 'device_name' => request('device_name'), 'token' => request('push_token'), ]); $user_push_token->user_id = $auth_user->id; $user_push_token->save(); } } } /** * Get configuration * @return array */ public function getConfig() { return $this->config->getConfig(); } /** * Check for registration availability. * * @return null */ public function validateRegistrationStatus() { if (! config('config.registration')) { throw ValidationException::withMessages(['message' => trans('general.feature_not_available')]); } } /** * Check for email verification availability. * * @return null */ public function validateEmailVerificationStatus() { if (! config('config.email_verification')) { throw ValidationException::withMessages(['message' => trans('general.feature_not_available')]); } } /** * Check for account approval availability. * * @return null */ public function validateAccountApprovalStatus() { if (! config('config.account_approval')) { throw ValidationException::withMessages(['message' => trans('general.feature_not_available')]); } } /** * Check for reset password availability. * * @return null */ public function validateResetPasswordStatus() { if (! config('config.reset_password')) { throw ValidationException::withMessages(['message' => trans('general.feature_not_available')]); } } /** * Validate user for reset password. * * @param email $email * @return User */ public function validateUserAndStatusForResetPassword($email = null) { $user = $this->user->findByEmail($email); if (! $user) { throw ValidationException::withMessages(['email' => trans('passwords.user')]); } if ($user->status != 'activated') { throw ValidationException::withMessages(['email' => trans('passwords.account_not_activated')]); } return $user; } /** * Request password reset token of user. * * @param array * @return null */ public function password($params = array()) { $email = gv($params, 'email'); $this->validateResetPasswordStatus(); $user = $this->validateUserAndStatusForResetPassword($email); $token = rand(100000, 99999999); \DB::table('password_resets')->insert([ 'email' => $email, 'token' => $token, 'created_at' => Carbon::now() ]); $user->notify(new PasswordReset($user, $token)); } /** * Validate reset password token. * * @param string $token * @param email $email * @return null */ public function validateResetPasswordToken($token, $email) { $reset = \DB::table('password_resets')->where('email', '=', $email)->where('token', '=', $token)->first(); if (! $reset) { throw ValidationException::withMessages(['message' => trans('passwords.token')]); } if (date("Y-m-d H:i:s", strtotime($reset->created_at . "+".config('config.reset_password_token_lifetime')." minutes")) < date('Y-m-d H:i:s')) { throw ValidationException::withMessages(['email' => trans('passwords.token_expired')]); } } /** * Reset password of user. * * @param array * @return null */ public function reset($params = array()) { $email = gv($params, 'email'); $token = gv($params, 'token'); $password = gv($params, 'password'); $this->validateResetPasswordStatus(); $user = $this->validateUserAndStatusForResetPassword($email); $this->validateResetPasswordToken($token, $email); $this->resetPassword($password, $user); \DB::table('password_resets')->where('email', '=', $email)->where('token', '=', $token)->delete(); $user->notify(new PasswordResetted($user)); } /** * Update user password. * * @param string $password * @param User $user * @return null */ public function resetPassword($password, $user = null) { $user = ($user) ? : \Auth::user(); $user->password = bcrypt($password); $user->save(); } /** * Validate current password of user. * * @param string $password * @return null */ public function validateCurrentPassword($password) { if (!\Hash::check($password, \Auth::user()->password)) { throw ValidationException::withMessages(['password' => trans('passwords.lock_screen_password_mismatch')]); } } /** * Validate two factor security. * * @param numeric $two_factor_code * @return null */ public function security($two_factor_code) { $user = \Auth::user(); if ($two_factor_code != \Cache::get('tfc_'.$user->id)) { throw ValidationException::withMessages(['message' => trans('auth.invalid_two_factor_code')]); } } }