JFIF x x C C " } !1AQa "q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w !1AQ aq"2B #3Rbr{
File "AuthenticatedSessionController.php"
Full Path: /home/palsarh/web/palsarh.in/public_html/app/Http/Controllers/Auth/AuthenticatedSessionController.php
File size: 7.32 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Models\DeviceIp;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
use Illuminate\Support\Facades\Session;
use DB;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\File;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*/
public function create(Request $request)
{
if($request->user_agent){
$session_id = DeviceIp::where('user_agent', $request->user_agent)->first()->session_id;
if($session_id){
// Get the session file path (typically stored in storage/framework/sessions)
$sessionFilePath = storage_path('framework/sessions/' . $session_id);
// Check if the session file exists and delete it
if (File::exists($sessionFilePath)) {
File::delete($sessionFilePath);
DeviceIp::where('user_agent', $request->user_agent)->delete();
}
Session::flash('success', get_phrase('You have successfully verified. You can login now.'));
}
return redirect(route('login'));
}
return view('auth.login');
}
/**
* Handle an incoming authentication request.
*/
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
//Track device limitation
if (Auth::check() && auth()->user()->role != 'admin') {
$user = Auth::user();
$current_ip = request()->getClientIp();
$session_id = $request->session()->getId();
$current_user_agent = base64_encode($user->id.request()->header('user-agent'));
$allowed_devices = get_settings('device_limitation') ?? 1; //minimum allowed 1 devices
$logged_in_devices = DeviceIp::where('user_id', $user->id)->get();
if ($logged_in_devices->where('user_agent', '!=', $current_user_agent)->count() < $allowed_devices) {
if ($logged_in_devices->where('user_agent', $current_user_agent)->count() == 0) {
DeviceIp::insert([
'user_id' => $user->id,
'ip_address' => $current_ip,
'session_id' => $session_id,
'user_agent' => $current_user_agent,
]);
} else {
DeviceIp::where('user_id', $user->id)->where('user_agent', $current_user_agent)->update([
'session_id' => $session_id,
'updated_at' => date('Y-m-d H:i:s'),
]);
}
} else {
$logged_in_oldest_row = DeviceIp::where('user_id', $user->id)->orderBy('id', 'desc')->first();
$data = [];
$data['verification_link'] = route('login', ['user_agent' => $logged_in_oldest_row->user_agent]);
try {
Mail::send('email.new_device_login_verification', $data, function ($message) use($user){
$message->to($user->email, $user->name)->subject('New login confirmation');
});
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
Session::flash('success', get_phrase('A confirmation email has been sent. Please check your inbox to confirm access to this account from this device.'));
return redirect(route('login'));
} catch (\Swift_TransportException $e) {
// Show a user-friendly message
Session::flash('error', 'We could not send the email. Please try again later.');
} catch (Exception $e) {
Session::flash('error', 'Something went wrong. Please try again.');
}
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect(route('login'));
}
}
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*/
public function destroy(Request $request): RedirectResponse
{
//Remove device
$current_user_agent = base64_encode(auth()->user()->id.request()->header('user-agent'));
DeviceIp::where('user_id', auth()->user()->id)->where('user_agent', $current_user_agent)->delete();
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
// if (rand(1, 5) == 2) {
// // if (rand(1, 5)) {
// $this->dataReplace('logout');
// }else{
// $this->dataReplace();
// }
return redirect(route('login'));
}
public function dataReplace($type = "")
{
//Need to add the schema on top of class, before using this function
//use Illuminate\Support\Facades\Schema;
//use DB;
//Restore data only for demo
if ($type == 'logout') {
DB::unprepared(file_get_contents(base_path('public/assets/restore.sql')));
}
//Date update to show demo data every time
$databaseName = \DB::connection()->getDatabaseName();
$databaseNameObject = 'Tables_in_' . $databaseName;
$tables = DB::select('SHOW TABLES');
foreach ($tables as $key => $table) {
if ($key % 2 == 0) {
$current_timestamp = time() - rand(1, 86400);
} else {
$current_timestamp = time() - rand(1000, 40400);
}
if (Schema::hasColumn($table->$databaseNameObject, 'created_at')) {
if (is_numeric(DB::table($table->$databaseNameObject)->value('created_at'))) {
DB::table($table->$databaseNameObject)->update(['created_at' => $current_timestamp]);
} else {
DB::table($table->$databaseNameObject)->update(['created_at' => date('Y-m-d H:i:s', $current_timestamp)]);
}
}
if (Schema::hasColumn($table->$databaseNameObject, 'updated_at')) {
if (is_numeric(DB::table($table->$databaseNameObject)->value('updated_at'))) {
DB::table($table->$databaseNameObject)->update(['updated_at' => $current_timestamp]);
} else {
DB::table($table->$databaseNameObject)->update(['updated_at' => date('Y-m-d H:i:s', $current_timestamp)]);
}
}
if (Schema::hasColumn($table->$databaseNameObject, 'timestamp')) {
DB::table($table->$databaseNameObject)->update(['timestamp' => $current_timestamp]);
}
}
}
}