SecuritySettings.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace App\Http\Controllers\Settings;
  3. use App\AccountLog;
  4. use App\EmailVerification;
  5. use App\Media;
  6. use App\Profile;
  7. use App\User;
  8. use App\UserFilter;
  9. use App\Util\Lexer\PrettyNumber;
  10. use Auth;
  11. use DB;
  12. use Carbon\Carbon;
  13. use Illuminate\Http\Request;
  14. use PragmaRX\Google2FA\Google2FA;
  15. trait SecuritySettings
  16. {
  17. public function security()
  18. {
  19. $sessions = DB::table('sessions')
  20. ->whereUserId(Auth::id())
  21. ->limit(20)
  22. ->get();
  23. $activity = AccountLog::whereUserId(Auth::id())
  24. ->orderBy('created_at', 'desc')
  25. ->limit(20)
  26. ->get();
  27. $user = Auth::user();
  28. return view('settings.security', compact('sessions', 'activity', 'user'));
  29. }
  30. public function securityTwoFactorSetup(Request $request)
  31. {
  32. $user = Auth::user();
  33. if($user->{'2fa_enabled'} && $user->{'2fa_secret'}) {
  34. return redirect(route('account.security'));
  35. }
  36. $backups = $this->generateBackupCodes();
  37. $google2fa = new Google2FA();
  38. $key = $google2fa->generateSecretKey(32);
  39. $qrcode = $google2fa->getQRCodeInline(
  40. config('pixelfed.domain.app'),
  41. $user->email,
  42. $key,
  43. 500
  44. );
  45. $user->{'2fa_secret'} = $key;
  46. $user->{'2fa_backup_codes'} = json_encode($backups);
  47. $user->save();
  48. return view('settings.security.2fa.setup', compact('user', 'qrcode', 'backups'));
  49. }
  50. protected function generateBackupCodes()
  51. {
  52. $keys = [];
  53. for ($i=0; $i < 11; $i++) {
  54. $key = str_random(24);
  55. $keys[] = $key;
  56. }
  57. return $keys;
  58. }
  59. public function securityTwoFactorSetupStore(Request $request)
  60. {
  61. $user = Auth::user();
  62. if($user->{'2fa_enabled'} && $user->{'2fa_secret'}) {
  63. abort(403, 'Two factor auth is already setup.');
  64. }
  65. $this->validate($request, [
  66. 'code' => 'required|integer'
  67. ]);
  68. $code = $request->input('code');
  69. $google2fa = new Google2FA();
  70. $verify = $google2fa->verifyKey($user->{'2fa_secret'}, $code);
  71. if($verify) {
  72. $user->{'2fa_enabled'} = true;
  73. $user->{'2fa_setup_at'} = Carbon::now();
  74. $user->save();
  75. return response()->json(['msg'=>'success']);
  76. } else {
  77. return response()->json(['msg'=>'fail'], 403);
  78. }
  79. }
  80. public function securityTwoFactorEdit(Request $request)
  81. {
  82. $user = Auth::user();
  83. if(!$user->{'2fa_enabled'} || !$user->{'2fa_secret'}) {
  84. abort(403);
  85. }
  86. return view('settings.security.2fa.edit', compact('user'));
  87. }
  88. public function securityTwoFactorRecoveryCodes(Request $request)
  89. {
  90. $user = Auth::user();
  91. if(!$user->{'2fa_enabled'} || !$user->{'2fa_secret'} || !$user->{'2fa_backup_codes'}) {
  92. abort(403);
  93. }
  94. $codes = json_decode($user->{'2fa_backup_codes'}, true);
  95. return view('settings.security.2fa.recovery-codes', compact('user', 'codes'));
  96. }
  97. public function securityTwoFactorUpdate(Request $request)
  98. {
  99. $user = Auth::user();
  100. if(!$user->{'2fa_enabled'} || !$user->{'2fa_secret'} || !$user->{'2fa_backup_codes'}) {
  101. abort(403);
  102. }
  103. $this->validate($request, [
  104. 'action' => 'required|string|max:12'
  105. ]);
  106. if($request->action !== 'remove') {
  107. abort(403);
  108. }
  109. $user->{'2fa_enabled'} = false;
  110. $user->{'2fa_secret'} = null;
  111. $user->{'2fa_backup_codes'} = null;
  112. $user->{'2fa_setup_at'} = null;
  113. $user->save();
  114. return response()->json([
  115. 'msg' => 'Successfully removed 2fa device'
  116. ], 200);
  117. }
  118. }