1
0

SecuritySettings.php 3.5 KB

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