SecuritySettings.php 3.4 KB

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