2021-06-29 05:02:45 +08:00
|
|
|
<?php
|
|
|
|
|
2023-05-18 00:56:55 +08:00
|
|
|
namespace BookStack\Access\Controllers;
|
2021-06-29 05:02:45 +08:00
|
|
|
|
2023-05-18 00:56:55 +08:00
|
|
|
use BookStack\Access\Mfa\MfaValue;
|
|
|
|
use BookStack\Activity\ActivityType;
|
2023-05-19 03:53:39 +08:00
|
|
|
use BookStack\Http\Controller;
|
2021-08-02 23:35:37 +08:00
|
|
|
use Illuminate\Http\Request;
|
2021-06-29 05:02:45 +08:00
|
|
|
|
|
|
|
class MfaController extends Controller
|
|
|
|
{
|
2021-07-18 23:52:31 +08:00
|
|
|
use HandlesPartialLogins;
|
|
|
|
|
2021-06-29 05:02:45 +08:00
|
|
|
/**
|
|
|
|
* Show the view to setup MFA for the current user.
|
|
|
|
*/
|
|
|
|
public function setup()
|
|
|
|
{
|
2021-07-18 23:52:31 +08:00
|
|
|
$userMethods = $this->currentOrLastAttemptedUser()
|
|
|
|
->mfaValues()
|
2021-07-01 05:10:02 +08:00
|
|
|
->get(['id', 'method'])
|
|
|
|
->groupBy('method');
|
2021-08-21 22:49:40 +08:00
|
|
|
|
2022-01-04 21:33:24 +08:00
|
|
|
$this->setPageTitle(trans('auth.mfa_setup'));
|
|
|
|
|
2021-07-01 05:10:02 +08:00
|
|
|
return view('mfa.setup', [
|
|
|
|
'userMethods' => $userMethods,
|
|
|
|
]);
|
2021-06-29 05:02:45 +08:00
|
|
|
}
|
2021-07-15 04:27:21 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove an MFA method for the current user.
|
2021-08-21 22:49:40 +08:00
|
|
|
*
|
2021-07-15 04:27:21 +08:00
|
|
|
* @throws \Exception
|
|
|
|
*/
|
|
|
|
public function remove(string $method)
|
|
|
|
{
|
|
|
|
if (in_array($method, MfaValue::allMethods())) {
|
|
|
|
$value = user()->mfaValues()->where('method', '=', $method)->first();
|
|
|
|
if ($value) {
|
|
|
|
$value->delete();
|
|
|
|
$this->logActivity(ActivityType::MFA_REMOVE_METHOD, $method);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return redirect('/mfa/setup');
|
|
|
|
}
|
2021-07-17 06:23:36 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the page to start an MFA verification.
|
|
|
|
*/
|
2021-07-18 23:52:31 +08:00
|
|
|
public function verify(Request $request)
|
2021-07-17 06:23:36 +08:00
|
|
|
{
|
2021-07-18 23:52:31 +08:00
|
|
|
$desiredMethod = $request->get('method');
|
|
|
|
$userMethods = $this->currentOrLastAttemptedUser()
|
|
|
|
->mfaValues()
|
2021-07-17 06:23:36 +08:00
|
|
|
->get(['id', 'method'])
|
|
|
|
->groupBy('method');
|
|
|
|
|
2021-07-18 23:52:31 +08:00
|
|
|
// Basic search for the default option for a user.
|
|
|
|
// (Prioritises totp over backup codes)
|
|
|
|
$method = $userMethods->has($desiredMethod) ? $desiredMethod : $userMethods->keys()->sort()->reverse()->first();
|
2021-08-21 22:49:40 +08:00
|
|
|
$otherMethods = $userMethods->keys()->filter(function ($userMethod) use ($method) {
|
2021-07-18 23:52:31 +08:00
|
|
|
return $method !== $userMethod;
|
|
|
|
})->all();
|
|
|
|
|
2021-07-17 06:23:36 +08:00
|
|
|
return view('mfa.verify', [
|
2021-08-21 22:49:40 +08:00
|
|
|
'userMethods' => $userMethods,
|
|
|
|
'method' => $method,
|
2021-07-18 23:52:31 +08:00
|
|
|
'otherMethods' => $otherMethods,
|
2021-07-17 06:23:36 +08:00
|
|
|
]);
|
|
|
|
}
|
2021-06-29 05:02:45 +08:00
|
|
|
}
|