diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 2f937a1..f0b4bb6 100755 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -32,17 +32,20 @@ use App\Http\Requests\FlushSessionsRequest; use App\Http\Requests\Remove2FASecretRequest; use App\Http\Requests\Reset2FASecretRequest; use App\Http\Requests\SearchPlayerRequest; +use App\Http\Requests\SetNewPasswordRequest; use App\Http\Requests\UpdateUserRequest; use App\Notifications\ChangedPassword; use App\Notifications\EmailChanged; use App\Notifications\PasswordAdminResetNotification; use App\Notifications\TwoFactorResetNotification; use App\Services\AccountSuspensionService; +use App\Services\DiscordService; use App\Traits\DisablesFeatures; use App\Traits\HandlesAccountDeletion; use App\Traits\ReceivesAccountTokens; use App\User; use Google2FA; +use Illuminate\Http\Client\RequestException; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -245,6 +248,44 @@ class UserController extends Controller } + /** + * Sets a user's password and removes their discord information from storage + * + * @param User $user + * @param SetNewPasswordRequest $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function setUnlinkPassword(SetNewPasswordRequest $request, DiscordService $discordService) + { + Auth::user()->password = Hash::make($request->newpass); + Auth::user()->save(); + + try { + $discordService->revokeAccountTokens(Auth::user()); + Log::warning('Revoking social account tokens, user initiated', [ + 'user' => Auth::user()->email + ]); + } catch (RequestException $requestException) { + + if ($requestException->getCode() == 401) { + return redirect(route('discordRedirect')); + } + + Log::error('Error while trying to revoke Discord credentials', [$requestException->getMessage()]); + return redirect() + ->back() + ->with('error', __('An unknown error ocurred. Please try again later.')); + } + + + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + $request->session()->flash('success', 'Discord account unlinked! You may now login with your Discord email and brand new password.'); + return redirect(route('login')); + } + /** * Change the current user's email address diff --git a/app/Http/Requests/SetNewPasswordRequest.php b/app/Http/Requests/SetNewPasswordRequest.php new file mode 100644 index 0000000..9e41dc8 --- /dev/null +++ b/app/Http/Requests/SetNewPasswordRequest.php @@ -0,0 +1,34 @@ +hasDiscordConnection()) { + return true; + } + + return false; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'newpass' => 'required|string|min:10|confirmed' + ]; + } +} diff --git a/app/Services/DiscordService.php b/app/Services/DiscordService.php new file mode 100644 index 0000000..91e43d5 --- /dev/null +++ b/app/Services/DiscordService.php @@ -0,0 +1,42 @@ +post(config('services.discord.base_url') . '/oauth2/token/revoke', [ + 'client_id' => config('services.discord.client_id'), + 'client_secret' => config('services.discord.client_secret'), + 'token' => $user->discord_token, + ])->throw(); + + + + $user->discord_token = null; + $user->discord_user_id = null; + $user->discord_refresh_token = null; + $user->discord_pfp = null; + $user->save(); + + return $req->ok(); + } + + +} diff --git a/resources/views/dashboard/user/profile/useraccount.blade.php b/resources/views/dashboard/user/profile/useraccount.blade.php index 1ffb360..a4f521a 100755 --- a/resources/views/dashboard/user/profile/useraccount.blade.php +++ b/resources/views/dashboard/user/profile/useraccount.blade.php @@ -271,7 +271,7 @@

{{ __('Alternatively, you can unlink your Discord account and set a password which you can use to sign in. Please note that any roles and/or privileges you may have been given as a result of this integration may be automatically removed until you link your Discord account again.') }}

-
+ @csrf @method('PATCH') @@ -285,13 +285,15 @@
- +
- + +

{{ __('You will be logged out afterwards.') }}

@else +
{{__('Change Password')}}

{{__('Change your password here. This will log you out from all existing sessions for your security.')}}

diff --git a/routes/web.php b/routes/web.php index f651813..7d87478 100755 --- a/routes/web.php +++ b/routes/web.php @@ -219,6 +219,9 @@ Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['lo Route::patch('/settings/account/change-password', [UserController::class, 'changePassword']) ->name('changePassword'); + Route::patch('/settings/account/add-password', [UserController::class, 'setUnlinkPassword']) + ->name('addPassword'); + Route::patch('/settings/account/change-email', [UserController::class, 'changeEmail'])