Skip to content

Commit 6ec2959

Browse files
authored
Merge pull request #2 from mix-code/bug/multi_device_support
Fixing Multi Device Support
2 parents 0cc9f59 + 7a70891 commit 6ec2959

File tree

5 files changed

+25
-24
lines changed

5 files changed

+25
-24
lines changed

src/FilamentMulti2faPlugin.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,7 @@ public function register(Panel $panel): void
4242
public function boot(Panel $panel): void
4343
{
4444
Event::listen(Logout::class, function ($event) {
45-
$user = $event->user;
46-
47-
if ($user) {
48-
$user->two_factor_confirmed_at = null;
49-
$user->save();
50-
}
45+
session()->forget('2fa_passed');
5146
});
5247
}
5348

src/Middleware/CheckTrustedDevice.php

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,17 @@ public function handle(Request $request, Closure $next): Response
3131

3232
$requires2FA = $user->two_factor_type?->value !== TwoFactorAuthType::None->value;
3333

34-
// If 2FA is enforced globally (e.g., admin setting)
35-
if ($is2FAForced) {
36-
if (! $requires2FA && ! $request->routeIs(TwoFactorySetup::getRouteName())) {
34+
if (($is2FAForced || $requires2FA) && ! $user->hasSetupTwoFactor()) {
35+
if (! $request->routeIs(TwoFactorySetup::getRouteName())) {
3736
return redirect()->route(TwoFactorySetup::getRouteName());
3837
}
39-
40-
if ($requires2FA && ! $user->two_factor_confirmed_at) {
41-
if (! $this->checkTrusted($request, $trustDeviceModel, $user)) {
42-
return $this->handleOtpRedirect($request, $next);
43-
}
44-
}
4538
}
4639

47-
// Optional mode: if user enabled 2FA on their own
48-
if (! $is2FAForced && $requires2FA && ! $user->two_factor_confirmed_at) {
49-
if (! $this->checkTrusted($request, $trustDeviceModel, $user)) {
40+
if (($is2FAForced || $requires2FA) && $user->hasSetupTwoFactor()) {
41+
$trusted = $this->checkTrusted($request, $trustDeviceModel, $user);
42+
$otpSessionConfirmed = $user->isOtpPassed();
43+
44+
if (! $trusted && ! $otpSessionConfirmed) {
5045
return $this->handleOtpRedirect($request, $next);
5146
}
5247
}

src/Pages/OTPVerify.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,10 @@ public function save(): void
178178
$this->user->two_factor_expires_at = null;
179179
$this->user->save();
180180

181+
session(['2fa_passed' => true]);
182+
181183
if ($this->shouldTrustDevice()) {
182184
$this->user->addTrustedDevice();
183-
} else {
184-
$this->user->trustedDevices()->delete();
185185
}
186186
} catch (Halt $exception) {
187187
return;

src/Pages/TwoFactorySetup.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,6 @@ public function setup(): void
345345
$this->user->two_factor_expires_at = null;
346346
$this->user->save();
347347

348-
$this->user->trustedDevices()->delete();
349-
350348
session()->forget('trusted_device_validated');
351349

352350
redirect($this->getRedirectUrl());
@@ -372,10 +370,10 @@ public function verifyOTP(): void
372370
$this->user->two_factor_confirmed_at = now();
373371
$this->user->save();
374372

373+
session(['2fa_passed' => true]);
374+
375375
if ($this->shouldTrustDevice()) {
376376
$this->user->addTrustedDevice();
377-
} else {
378-
$this->user->trustedDevices()->delete();
379377
}
380378
});
381379
} catch (Halt $exception) {
@@ -405,6 +403,8 @@ public function verifyTOTP(): void
405403
$this->user->two_factor_confirmed_at = now();
406404
$this->user->save();
407405

406+
session(['2fa_passed' => true]);
407+
408408
if ($this->shouldTrustDevice()) {
409409
$this->user->addTrustedDevice();
410410
}

src/Traits/UsingTwoFA.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace MixCode\FilamentMulti2fa\Traits;
44

55
use Illuminate\Support\Facades\Notification;
6+
use MixCode\FilamentMulti2fa\Enums\TwoFactorAuthType;
67
use PragmaRX\Google2FA\Google2FA;
78

89
trait UsingTwoFA
@@ -67,6 +68,16 @@ public function verifyOTP($code): bool
6768
return decrypt($this->two_factor_secret) == $code && now()->lt($this->two_factor_expires_at);
6869
}
6970

71+
public function hasSetupTwoFactor(): bool
72+
{
73+
return $this->two_factor_type->value !== TwoFactorAuthType::None->value;
74+
}
75+
76+
public function isOtpPassed(): bool
77+
{
78+
return session('2fa_passed') === true;
79+
}
80+
7081
public function addTrustedDevice()
7182
{
7283
$request = request();

0 commit comments

Comments
 (0)