diff --git a/Web-Application/Manually/app/Http/Controllers/Auth/BrowseSessionController.php b/Web-Application/Manually/app/Http/Controllers/Auth/BrowseSessionController.php new file mode 100644 index 0000000..73cd2f6 --- /dev/null +++ b/Web-Application/Manually/app/Http/Controllers/Auth/BrowseSessionController.php @@ -0,0 +1,18 @@ +id)->get(); + return view("auth.browse-session", compact(['device_sessions','user'])); + } +} diff --git a/Web-Application/Manually/app/Http/Controllers/Auth/LoginController.php b/Web-Application/Manually/app/Http/Controllers/Auth/LoginController.php index ccc05b5..99d31e7 100644 --- a/Web-Application/Manually/app/Http/Controllers/Auth/LoginController.php +++ b/Web-Application/Manually/app/Http/Controllers/Auth/LoginController.php @@ -2,7 +2,9 @@ namespace App\Http\Controllers\Auth; +use Jenssegers\Agent\Agent; use Illuminate\Http\Request; +use App\Models\DeviceSession; use App\Http\Requests\LoginRequest; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; @@ -29,6 +31,19 @@ class LoginController extends Controller $request->session()->regenerate(); + //browse session + $agent = new Agent(); + $user = Auth::user(); + + DeviceSession::create([ + 'user_id' => $user->id, + 'session_id' => session()->getId(), + 'browser' => $agent->browser(), + 'os' => $agent->platform(), + 'device' => $agent->device(), + 'is_mobile' => $agent->isMobile() + ]); + return redirect()->route('dashboard')->with("success", "login successfully"); } catch (\Exception $e) { return redirect() diff --git a/Web-Application/Manually/app/Http/Controllers/Auth/LogoutController.php b/Web-Application/Manually/app/Http/Controllers/Auth/LogoutController.php index b90d6ac..1b8fa22 100644 --- a/Web-Application/Manually/app/Http/Controllers/Auth/LogoutController.php +++ b/Web-Application/Manually/app/Http/Controllers/Auth/LogoutController.php @@ -3,9 +3,11 @@ namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; +use App\Models\DeviceSession; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; class LogoutController extends Controller { @@ -21,6 +23,8 @@ class LogoutController extends Controller 'verify2fa' => 0, ]); + DeviceSession::where('session_id', session()->getId())->delete(); + Auth::logout(); $request->session()->invalidate(); @@ -36,8 +40,26 @@ class LogoutController extends Controller $request->session()->invalidate(); $request->session()->regenerateToken(); + DeviceSession::where('user_id', $this->user->id)->delete(); + $this->user->delete(); return redirect()->route('login')->with('success', 'Your account has been deleted successfully.'); } + + public function logoutOtherDevice(Request $request) + { + $currentSessionId = Session::getId(); + + DB::table('sessions') + ->where('user_id', $this->user->id) + ->where('id', '!=', $currentSessionId) + ->delete(); + + DeviceSession::where('user_id', $this->user->id) + ->where('session_id', '!=', $currentSessionId) + ->delete(); + + return back()->with('success', 'logout other system successfully'); + } } diff --git a/Web-Application/Manually/app/Http/Controllers/Auth/RegisterController.php b/Web-Application/Manually/app/Http/Controllers/Auth/RegisterController.php index 5628b83..106189f 100644 --- a/Web-Application/Manually/app/Http/Controllers/Auth/RegisterController.php +++ b/Web-Application/Manually/app/Http/Controllers/Auth/RegisterController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Auth; use App\Models\User; +use Jenssegers\Agent\Agent; use Illuminate\Http\Request; +use App\Models\DeviceSession; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -27,6 +29,19 @@ class RegisterController extends Controller Auth::login($user); + //browse session + $agent = new Agent(); + $user = Auth::user(); + + DeviceSession::create([ + 'user_id' => $user->id, + 'session_id' => session()->getId(), + 'browser' => $agent->browser(), + 'os' => $agent->platform(), + 'device' => $agent->device(), + 'is_mobile' => $agent->isMobile() + ]); + return redirect()->route('dashboard')->with('success', 'register successfully'); } catch (\Exception $e) { return redirect() diff --git a/Web-Application/Manually/app/Models/DeviceSession.php b/Web-Application/Manually/app/Models/DeviceSession.php new file mode 100644 index 0000000..3a9e713 --- /dev/null +++ b/Web-Application/Manually/app/Models/DeviceSession.php @@ -0,0 +1,12 @@ +=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Jaybizzle\\CrawlerDetect\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Beech", + "email": "m@rkbee.ch", + "role": "Developer" + } + ], + "description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent", + "homepage": "https://github.com/JayBizzle/Crawler-Detect/", + "keywords": [ + "crawler", + "crawler detect", + "crawler detector", + "crawlerdetect", + "php crawler detect" + ], + "support": { + "issues": "https://github.com/JayBizzle/Crawler-Detect/issues", + "source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.3.4" + }, + "time": "2025-03-05T23:12:10+00:00" + }, + { + "name": "jenssegers/agent", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/jenssegers/agent.git", + "reference": "daa11c43729510b3700bc34d414664966b03bffe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe", + "reference": "daa11c43729510b3700bc34d414664966b03bffe", + "shasum": "" + }, + "require": { + "jaybizzle/crawler-detect": "^1.2", + "mobiledetect/mobiledetectlib": "^2.7.6", + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.0|^6.0|^7.0" + }, + "suggest": { + "illuminate/support": "Required for laravel service providers" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Agent": "Jenssegers\\Agent\\Facades\\Agent" + }, + "providers": [ + "Jenssegers\\Agent\\AgentServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Jenssegers\\Agent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jens Segers", + "homepage": "https://jenssegers.com" + } + ], + "description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect", + "homepage": "https://github.com/jenssegers/agent", + "keywords": [ + "Agent", + "browser", + "desktop", + "laravel", + "mobile", + "platform", + "user agent", + "useragent" + ], + "support": { + "issues": "https://github.com/jenssegers/agent/issues", + "source": "https://github.com/jenssegers/agent/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://github.com/jenssegers", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/jenssegers/agent", + "type": "tidelift" + } + ], + "time": "2020-06-13T08:05:20+00:00" + }, { "name": "laravel/framework", "version": "v12.10.0", @@ -2590,6 +2725,68 @@ }, "time": "2025-04-03T12:16:11+00:00" }, + { + "name": "mobiledetect/mobiledetectlib", + "version": "2.8.45", + "source": { + "type": "git", + "url": "https://github.com/serbanghita/Mobile-Detect.git", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36" + }, + "type": "library", + "autoload": { + "psr-0": { + "Detection": "namespaced/" + }, + "classmap": [ + "Mobile_Detect.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Serban Ghita", + "email": "serbanghita@gmail.com", + "homepage": "http://mobiledetect.net", + "role": "Developer" + } + ], + "description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.", + "homepage": "https://github.com/serbanghita/Mobile-Detect", + "keywords": [ + "detect mobile devices", + "mobile", + "mobile detect", + "mobile detector", + "php mobile detect" + ], + "support": { + "issues": "https://github.com/serbanghita/Mobile-Detect/issues", + "source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.45" + }, + "funding": [ + { + "url": "https://github.com/serbanghita", + "type": "github" + } + ], + "time": "2023-11-07T21:57:25+00:00" + }, { "name": "monolog/monolog", "version": "3.9.0", diff --git a/Web-Application/Manually/database/migrations/2025_04_23_111401_create_device_sessions_table.php b/Web-Application/Manually/database/migrations/2025_04_23_111401_create_device_sessions_table.php new file mode 100644 index 0000000..0eb73a8 --- /dev/null +++ b/Web-Application/Manually/database/migrations/2025_04_23_111401_create_device_sessions_table.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('session_id')->nullable()->unique(); + $table->string('browser')->nullable(); + $table->string('os')->nullable(); + $table->string('device')->nullable(); + $table->boolean('is_mobile')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('device_sessions'); + } +}; diff --git a/Web-Application/Manually/resources/views/auth/browse-session.blade.php b/Web-Application/Manually/resources/views/auth/browse-session.blade.php new file mode 100644 index 0000000..de6b8fb --- /dev/null +++ b/Web-Application/Manually/resources/views/auth/browse-session.blade.php @@ -0,0 +1,30 @@ +@extends('layouts.aside') + +@section('main') + + + + + Browse Session + + @foreach($device_sessions as $session) + + 🖥️ {{ $session->browser }} - {{ $session->os }} + + 🕐 {{ $session->created_at->diffForHumans() }} + + @endforeach + + + @csrf + + Logout Other Devices + + + + + + + +@endsection \ No newline at end of file diff --git a/Web-Application/Manually/resources/views/layouts/aside.blade.php b/Web-Application/Manually/resources/views/layouts/aside.blade.php index 2c59536..201c310 100644 --- a/Web-Application/Manually/resources/views/layouts/aside.blade.php +++ b/Web-Application/Manually/resources/views/layouts/aside.blade.php @@ -19,7 +19,7 @@ class="block px-4 py-2 rounded-lg hover:bg-[#415a77] transition"> 🔐 Change Password - + 🖥️ Browse Session diff --git a/Web-Application/Manually/routes/web.php b/Web-Application/Manually/routes/web.php index c250928..8519ab7 100644 --- a/Web-Application/Manually/routes/web.php +++ b/Web-Application/Manually/routes/web.php @@ -1,5 +1,6 @@ 'auth'], function () { Route::post('logout', action: [LogoutController::class, 'logout'])->name('logout'); Route::post('delete-account', action: [LogoutController::class, 'deleteAccount'])->name('delete.account'); + Route::post('logout-other-device', [LogoutController::class, 'logoutOtherDevice'])->name('logout.other.device'); //verify mail Route::post('email/verification-notification', [MailController::class, 'notification'])->name('verification.send'); @@ -46,6 +48,9 @@ Route::group(['middleware' => 'auth'], function () { //change password in profile Route::get('change-password', [PasswordController::class, 'changePasswordPage'])->name('change.password.show'); Route::post('change-password', [PasswordController::class, 'changePassword'])->name('change.password'); + + //browse session + Route::get('browse-session', [BrowseSessionController::class, 'browseSession'])->name('browse.session'); });