SettingsController.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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\UserFilter;
  9. use App\Util\Lexer\PrettyNumber;
  10. use Auth;
  11. use DB;
  12. use Illuminate\Http\Request;
  13. class SettingsController extends Controller
  14. {
  15. public function __construct()
  16. {
  17. $this->middleware('auth');
  18. }
  19. public function home()
  20. {
  21. $id = Auth::user()->profile->id;
  22. $storage = [];
  23. $used = Media::whereProfileId($id)->sum('size');
  24. $storage['limit'] = config('pixelfed.max_account_size') * 1024;
  25. $storage['used'] = $used;
  26. $storage['percentUsed'] = ceil($storage['used'] / $storage['limit'] * 100);
  27. $storage['limitPretty'] = PrettyNumber::size($storage['limit']);
  28. $storage['usedPretty'] = PrettyNumber::size($storage['used']);
  29. return view('settings.home', compact('storage'));
  30. }
  31. public function homeUpdate(Request $request)
  32. {
  33. $this->validate($request, [
  34. 'name' => 'required|string|max:'.config('pixelfed.max_name_length'),
  35. 'bio' => 'nullable|string|max:'.config('pixelfed.max_bio_length'),
  36. 'website' => 'nullable|url',
  37. 'email' => 'nullable|email',
  38. ]);
  39. $changes = false;
  40. $name = $request->input('name');
  41. $bio = $request->input('bio');
  42. $website = $request->input('website');
  43. $email = $request->input('email');
  44. $user = Auth::user();
  45. $profile = $user->profile;
  46. $validate = config('pixelfed.enforce_email_verification');
  47. if ($user->email != $email) {
  48. $changes = true;
  49. $user->email = $email;
  50. if ($validate) {
  51. $user->email_verified_at = null;
  52. // Prevent old verifications from working
  53. EmailVerification::whereUserId($user->id)->delete();
  54. }
  55. }
  56. // Only allow email to be updated if not yet verified
  57. if (!$validate || !$changes && $user->email_verified_at) {
  58. if ($profile->name != $name) {
  59. $changes = true;
  60. $user->name = $name;
  61. $profile->name = $name;
  62. }
  63. if (!$profile->website || $profile->website != $website) {
  64. $changes = true;
  65. $profile->website = $website;
  66. }
  67. if (!$profile->bio || !$profile->bio != $bio) {
  68. $changes = true;
  69. $profile->bio = $bio;
  70. }
  71. }
  72. if ($changes === true) {
  73. $user->save();
  74. $profile->save();
  75. return redirect('/settings/home')->with('status', 'Profile successfully updated!');
  76. }
  77. return redirect('/settings/home');
  78. }
  79. public function password()
  80. {
  81. return view('settings.password');
  82. }
  83. public function passwordUpdate(Request $request)
  84. {
  85. $this->validate($request, [
  86. 'current' => 'required|string',
  87. 'password' => 'required|string',
  88. 'password_confirmation' => 'required|string',
  89. ]);
  90. $current = $request->input('current');
  91. $new = $request->input('password');
  92. $confirm = $request->input('password_confirmation');
  93. $user = Auth::user();
  94. if (password_verify($current, $user->password) && $new === $confirm) {
  95. $user->password = bcrypt($new);
  96. $user->save();
  97. return redirect('/settings/home')->with('status', 'Password successfully updated!');
  98. }
  99. return redirect('/settings/home')->with('error', 'There was an error with your request!');
  100. }
  101. public function email()
  102. {
  103. return view('settings.email');
  104. }
  105. public function avatar()
  106. {
  107. return view('settings.avatar');
  108. }
  109. public function accessibility()
  110. {
  111. $settings = Auth::user()->settings;
  112. return view('settings.accessibility', compact('settings'));
  113. }
  114. public function accessibilityStore(Request $request)
  115. {
  116. $settings = Auth::user()->settings;
  117. $fields = [
  118. 'compose_media_descriptions',
  119. 'reduce_motion',
  120. 'optimize_screen_reader',
  121. 'high_contrast_mode',
  122. 'video_autoplay',
  123. ];
  124. foreach ($fields as $field) {
  125. $form = $request->input($field);
  126. if ($form == 'on') {
  127. $settings->{$field} = true;
  128. } else {
  129. $settings->{$field} = false;
  130. }
  131. $settings->save();
  132. }
  133. return redirect(route('settings.accessibility'))->with('status', 'Settings successfully updated!');
  134. }
  135. public function notifications()
  136. {
  137. return view('settings.notifications');
  138. }
  139. public function privacy()
  140. {
  141. $settings = Auth::user()->settings;
  142. $is_private = Auth::user()->profile->is_private;
  143. $settings['is_private'] = (bool) $is_private;
  144. return view('settings.privacy', compact('settings'));
  145. }
  146. public function privacyStore(Request $request)
  147. {
  148. $settings = Auth::user()->settings;
  149. $profile = Auth::user()->profile;
  150. $fields = [
  151. 'is_private',
  152. 'crawlable',
  153. 'show_profile_follower_count',
  154. 'show_profile_following_count',
  155. ];
  156. foreach ($fields as $field) {
  157. $form = $request->input($field);
  158. if ($field == 'is_private') {
  159. if ($form == 'on') {
  160. $profile->{$field} = true;
  161. $settings->show_guests = false;
  162. $settings->show_discover = false;
  163. $profile->save();
  164. } else {
  165. $profile->{$field} = false;
  166. $profile->save();
  167. }
  168. } elseif ($field == 'crawlable') {
  169. if ($form == 'on') {
  170. $settings->{$field} = false;
  171. } else {
  172. $settings->{$field} = true;
  173. }
  174. } else {
  175. if ($form == 'on') {
  176. $settings->{$field} = true;
  177. } else {
  178. $settings->{$field} = false;
  179. }
  180. }
  181. $settings->save();
  182. }
  183. return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!');
  184. }
  185. public function security()
  186. {
  187. $sessions = DB::table('sessions')
  188. ->whereUserId(Auth::id())
  189. ->limit(20)
  190. ->get();
  191. $activity = AccountLog::whereUserId(Auth::id())
  192. ->orderBy('created_at', 'desc')
  193. ->limit(50)
  194. ->get();
  195. return view('settings.security', compact('sessions', 'activity'));
  196. }
  197. public function applications()
  198. {
  199. return view('settings.applications');
  200. }
  201. public function dataExport()
  202. {
  203. return view('settings.dataexport');
  204. }
  205. public function dataImport()
  206. {
  207. return view('settings.import.home');
  208. }
  209. public function dataImportInstagram()
  210. {
  211. return view('settings.import.instagram.home');
  212. }
  213. public function developers()
  214. {
  215. return view('settings.developers');
  216. }
  217. public function mutedUsers()
  218. {
  219. $pid = Auth::user()->profile->id;
  220. $ids = (new UserFilter())->mutedUserIds($pid);
  221. $users = Profile::whereIn('id', $ids)->simplePaginate(15);
  222. return view('settings.privacy.muted', compact('users'));
  223. }
  224. public function mutedUsersUpdate(Request $request)
  225. {
  226. $this->validate($request, [
  227. 'profile_id' => 'required|integer|min:1'
  228. ]);
  229. $fid = $request->input('profile_id');
  230. $pid = Auth::user()->profile->id;
  231. DB::transaction(function () use ($fid, $pid) {
  232. $filter = UserFilter::whereUserId($pid)
  233. ->whereFilterableId($fid)
  234. ->whereFilterableType('App\Profile')
  235. ->whereFilterType('mute')
  236. ->firstOrFail();
  237. $filter->delete();
  238. });
  239. return redirect()->back();
  240. }
  241. public function blockedUsers()
  242. {
  243. $pid = Auth::user()->profile->id;
  244. $ids = (new UserFilter())->blockedUserIds($pid);
  245. $users = Profile::whereIn('id', $ids)->simplePaginate(15);
  246. return view('settings.privacy.blocked', compact('users'));
  247. }
  248. public function blockedUsersUpdate(Request $request)
  249. {
  250. $this->validate($request, [
  251. 'profile_id' => 'required|integer|min:1'
  252. ]);
  253. $fid = $request->input('profile_id');
  254. $pid = Auth::user()->profile->id;
  255. DB::transaction(function () use ($fid, $pid) {
  256. $filter = UserFilter::whereUserId($pid)
  257. ->whereFilterableId($fid)
  258. ->whereFilterableType('App\Profile')
  259. ->whereFilterType('block')
  260. ->firstOrFail();
  261. $filter->delete();
  262. });
  263. return redirect()->back();
  264. }
  265. public function blockedInstances()
  266. {
  267. $settings = Auth::user()->settings;
  268. return view('settings.privacy.blocked-instances');
  269. }
  270. }