SettingsController.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\AccountLog;
  4. use App\EmailVerification;
  5. use App\Media;
  6. use App\Profile;
  7. use App\User;
  8. use App\Util\Lexer\PrettyNumber;
  9. use Auth;
  10. use DB;
  11. use Illuminate\Http\Request;
  12. class SettingsController extends Controller
  13. {
  14. public function __construct()
  15. {
  16. $this->middleware('auth');
  17. }
  18. public function home()
  19. {
  20. $id = Auth::user()->profile->id;
  21. $storage = [];
  22. $used = Media::whereProfileId($id)->sum('size');
  23. $storage['limit'] = config('pixelfed.max_account_size') * 1024;
  24. $storage['used'] = $used;
  25. $storage['percentUsed'] = ceil($storage['used'] / $storage['limit'] * 100);
  26. $storage['limitPretty'] = PrettyNumber::size($storage['limit']);
  27. $storage['usedPretty'] = PrettyNumber::size($storage['used']);
  28. return view('settings.home', compact('storage'));
  29. }
  30. public function homeUpdate(Request $request)
  31. {
  32. $this->validate($request, [
  33. 'name' => 'required|string|max:'.config('pixelfed.max_name_length'),
  34. 'bio' => 'nullable|string|max:'.config('pixelfed.max_bio_length'),
  35. 'website' => 'nullable|url',
  36. 'email' => 'nullable|email',
  37. ]);
  38. $changes = false;
  39. $name = $request->input('name');
  40. $bio = $request->input('bio');
  41. $website = $request->input('website');
  42. $email = $request->input('email');
  43. $user = Auth::user();
  44. $profile = $user->profile;
  45. $validate = config('pixelfed.enforce_email_verification');
  46. if ($user->email != $email) {
  47. $changes = true;
  48. $user->email = $email;
  49. if ($validate) {
  50. $user->email_verified_at = null;
  51. // Prevent old verifications from working
  52. EmailVerification::whereUserId($user->id)->delete();
  53. }
  54. }
  55. // Only allow email to be updated if not yet verified
  56. if (!$validate || !$changes && $user->email_verified_at) {
  57. if ($profile->name != $name) {
  58. $changes = true;
  59. $user->name = $name;
  60. $profile->name = $name;
  61. }
  62. if (!$profile->website || $profile->website != $website) {
  63. $changes = true;
  64. $profile->website = $website;
  65. }
  66. if (!$profile->bio || !$profile->bio != $bio) {
  67. $changes = true;
  68. $profile->bio = $bio;
  69. }
  70. }
  71. if ($changes === true) {
  72. $user->save();
  73. $profile->save();
  74. return redirect('/settings/home')->with('status', 'Profile successfully updated!');
  75. }
  76. return redirect('/settings/home');
  77. }
  78. public function password()
  79. {
  80. return view('settings.password');
  81. }
  82. public function passwordUpdate(Request $request)
  83. {
  84. $this->validate($request, [
  85. 'current' => 'required|string',
  86. 'password' => 'required|string',
  87. 'password_confirmation' => 'required|string',
  88. ]);
  89. $current = $request->input('current');
  90. $new = $request->input('password');
  91. $confirm = $request->input('password_confirmation');
  92. $user = Auth::user();
  93. if (password_verify($current, $user->password) && $new === $confirm) {
  94. $user->password = bcrypt($new);
  95. $user->save();
  96. return redirect('/settings/home')->with('status', 'Password successfully updated!');
  97. }
  98. return redirect('/settings/home')->with('error', 'There was an error with your request!');
  99. }
  100. public function email()
  101. {
  102. return view('settings.email');
  103. }
  104. public function avatar()
  105. {
  106. return view('settings.avatar');
  107. }
  108. public function accessibility()
  109. {
  110. $settings = Auth::user()->settings;
  111. return view('settings.accessibility', compact('settings'));
  112. }
  113. public function accessibilityStore(Request $request)
  114. {
  115. $settings = Auth::user()->settings;
  116. $fields = [
  117. 'compose_media_descriptions',
  118. 'reduce_motion',
  119. 'optimize_screen_reader',
  120. 'high_contrast_mode',
  121. 'video_autoplay',
  122. ];
  123. foreach ($fields as $field) {
  124. $form = $request->input($field);
  125. if ($form == 'on') {
  126. $settings->{$field} = true;
  127. } else {
  128. $settings->{$field} = false;
  129. }
  130. $settings->save();
  131. }
  132. return redirect(route('settings.accessibility'))->with('status', 'Settings successfully updated!');
  133. }
  134. public function notifications()
  135. {
  136. return view('settings.notifications');
  137. }
  138. public function privacy()
  139. {
  140. $settings = Auth::user()->settings;
  141. $is_private = Auth::user()->profile->is_private;
  142. $settings['is_private'] = (bool) $is_private;
  143. return view('settings.privacy', compact('settings'));
  144. }
  145. public function privacyStore(Request $request)
  146. {
  147. $settings = Auth::user()->settings;
  148. $profile = Auth::user()->profile;
  149. $fields = [
  150. 'is_private',
  151. 'crawlable',
  152. 'show_profile_follower_count',
  153. 'show_profile_following_count',
  154. ];
  155. foreach ($fields as $field) {
  156. $form = $request->input($field);
  157. if ($field == 'is_private') {
  158. if ($form == 'on') {
  159. $profile->{$field} = true;
  160. $settings->show_guests = false;
  161. $settings->show_discover = false;
  162. $profile->save();
  163. } else {
  164. $profile->{$field} = false;
  165. $profile->save();
  166. }
  167. } elseif ($field == 'crawlable') {
  168. if ($form == 'on') {
  169. $settings->{$field} = false;
  170. } else {
  171. $settings->{$field} = true;
  172. }
  173. } else {
  174. if ($form == 'on') {
  175. $settings->{$field} = true;
  176. } else {
  177. $settings->{$field} = false;
  178. }
  179. }
  180. $settings->save();
  181. }
  182. return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!');
  183. }
  184. public function security()
  185. {
  186. $sessions = DB::table('sessions')
  187. ->whereUserId(Auth::id())
  188. ->limit(20)
  189. ->get();
  190. $activity = AccountLog::whereUserId(Auth::id())
  191. ->orderBy('created_at', 'desc')
  192. ->limit(50)
  193. ->get();
  194. return view('settings.security', compact('sessions', 'activity'));
  195. }
  196. public function applications()
  197. {
  198. return view('settings.applications');
  199. }
  200. public function dataExport()
  201. {
  202. return view('settings.dataexport');
  203. }
  204. public function dataImport()
  205. {
  206. return view('settings.import.home');
  207. }
  208. public function dataImportInstagram()
  209. {
  210. return view('settings.import.instagram.home');
  211. }
  212. public function developers()
  213. {
  214. return view('settings.developers');
  215. }
  216. }