1 <?php namespace BookStack\Http\Controllers;
4 use Illuminate\Http\Request;
5 use Illuminate\Http\Response;
6 use BookStack\Repos\UserRepo;
7 use BookStack\Services\SocialAuthService;
10 class UserController extends Controller
17 * UserController constructor.
19 * @param UserRepo $userRepo
21 public function __construct(User $user, UserRepo $userRepo)
24 $this->userRepo = $userRepo;
25 parent::__construct();
29 * Display a listing of the users.
30 * @param Request $request
33 public function index(Request $request)
35 $this->checkPermission('users-manage');
37 'order' => $request->get('order', 'asc'),
38 'search' => $request->get('search', ''),
39 'sort' => $request->get('sort', 'name'),
41 $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
42 $this->setPageTitle(trans('settings.users'));
43 $users->appends($listDetails);
44 return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
48 * Show the form for creating a new user.
51 public function create()
53 $this->checkPermission('users-manage');
54 $authMethod = config('auth.method');
55 $roles = $this->userRepo->getAllRoles();
56 return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
60 * Store a newly created user in storage.
61 * @param Request $request
64 public function store(Request $request)
66 $this->checkPermission('users-manage');
69 'email' => 'required|email|unique:users,email'
72 $authMethod = config('auth.method');
73 if ($authMethod === 'standard') {
74 $validationRules['password'] = 'required|min:5';
75 $validationRules['password-confirm'] = 'required|same:password';
76 } elseif ($authMethod === 'ldap') {
77 $validationRules['external_auth_id'] = 'required';
79 $this->validate($request, $validationRules);
81 $user = $this->user->fill($request->all());
83 if ($authMethod === 'standard') {
84 $user->password = bcrypt($request->get('password'));
85 } elseif ($authMethod === 'ldap') {
86 $user->external_auth_id = $request->get('external_auth_id');
91 if ($request->filled('roles')) {
92 $roles = $request->get('roles');
93 $user->roles()->sync($roles);
96 // Get avatar from gravatar and save
97 if (!config('services.disable_services')) {
99 $avatar = \Images::saveUserGravatar($user);
100 $user->avatar()->associate($avatar);
102 } catch (Exception $e) {
103 \Log::error('Failed to save user gravatar image');
108 return redirect('/settings/users');
112 * Show the form for editing the specified user.
114 * @param SocialAuthService $socialAuthService
117 public function edit($id, SocialAuthService $socialAuthService)
119 $this->checkPermissionOr('users-manage', function () use ($id) {
120 return $this->currentUser->id == $id;
123 $user = $this->user->findOrFail($id);
125 $authMethod = ($user->system_name) ? 'system' : config('auth.method');
127 $activeSocialDrivers = $socialAuthService->getActiveDrivers();
128 $this->setPageTitle(trans('settings.user_profile'));
129 $roles = $this->userRepo->getAllRoles();
130 return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
134 * Update the specified user in storage.
135 * @param Request $request
139 public function update(Request $request, $id)
141 $this->preventAccessForDemoUsers();
142 $this->checkPermissionOr('users-manage', function () use ($id) {
143 return $this->currentUser->id == $id;
146 $this->validate($request, [
148 'email' => 'min:2|email|unique:users,email,' . $id,
149 'password' => 'min:5|required_with:password_confirm',
150 'password-confirm' => 'same:password|required_with:password',
154 $user = $this->user->findOrFail($id);
155 $user->fill($request->all());
158 if (userCan('users-manage') && $request->filled('roles')) {
159 $roles = $request->get('roles');
160 $user->roles()->sync($roles);
164 if ($request->filled('password')) {
165 $password = $request->get('password');
166 $user->password = bcrypt($password);
169 // External auth id updates
170 if ($this->currentUser->can('users-manage') && $request->filled('external_auth_id')) {
171 $user->external_auth_id = $request->get('external_auth_id');
174 // Save an user-specific settings
175 if ($request->filled('setting')) {
176 foreach ($request->get('setting') as $key => $value) {
177 setting()->putUser($user, $key, $value);
182 session()->flash('success', trans('settings.users_edit_success'));
184 $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
185 return redirect($redirectUrl);
189 * Show the user delete page.
191 * @return \Illuminate\View\View
193 public function delete($id)
195 $this->checkPermissionOr('users-manage', function () use ($id) {
196 return $this->currentUser->id == $id;
199 $user = $this->user->findOrFail($id);
200 $this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name]));
201 return view('users/delete', ['user' => $user]);
205 * Remove the specified user from storage.
209 public function destroy($id)
211 $this->preventAccessForDemoUsers();
212 $this->checkPermissionOr('users-manage', function () use ($id) {
213 return $this->currentUser->id == $id;
216 $user = $this->userRepo->getById($id);
218 if ($this->userRepo->isOnlyAdmin($user)) {
219 session()->flash('error', trans('errors.users_cannot_delete_only_admin'));
220 return redirect($user->getEditUrl());
223 if ($user->system_name === 'public') {
224 session()->flash('error', trans('errors.users_cannot_delete_guest'));
225 return redirect($user->getEditUrl());
228 $this->userRepo->destroy($user);
229 session()->flash('success', trans('settings.users_delete_success'));
231 return redirect('/settings/users');
235 * Show the user profile page
237 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
239 public function showProfilePage($id)
241 $user = $this->userRepo->getById($id);
242 $userActivity = $this->userRepo->getActivity($user);
243 $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
244 $assetCounts = $this->userRepo->getAssetCounts($user);
245 return view('users/profile', [
247 'activity' => $userActivity,
248 'recentlyCreated' => $recentlyCreated,
249 'assetCounts' => $assetCounts
253 public function switchBookView($id, Request $request) {
254 $this->checkPermissionOr('users-manage', function () use ($id) {
255 return $this->currentUser->id == $id;
257 $viewType = $request->get('book_view_type');
259 if (!in_array($viewType, ['grid', 'list'])) {
263 $user = $this->user->findOrFail($id);
264 setting()->putUser($user, 'books_view_type', $viewType);
266 $previousUrl = url()->previous();
267 if (empty($previousUrl)) {
268 // if no previous URL, redirect to settings
269 return redirect("/settings/users/$id");
271 // redirect to the previous page.
272 return redirect($previousUrl);