1 <?php namespace BookStack\Http\Controllers;
3 use BookStack\Auth\Access\SocialAuthService;
4 use BookStack\Auth\User;
5 use BookStack\Auth\UserRepo;
6 use Illuminate\Http\Request;
7 use Illuminate\Http\Response;
9 class UserController extends Controller
16 * UserController constructor.
18 * @param \BookStack\Auth\UserRepo $userRepo
20 public function __construct(User $user, UserRepo $userRepo)
23 $this->userRepo = $userRepo;
24 parent::__construct();
28 * Display a listing of the users.
29 * @param Request $request
32 public function index(Request $request)
34 $this->checkPermission('users-manage');
36 'order' => $request->get('order', 'asc'),
37 'search' => $request->get('search', ''),
38 'sort' => $request->get('sort', 'name'),
40 $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
41 $this->setPageTitle(trans('settings.users'));
42 $users->appends($listDetails);
43 return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
47 * Show the form for creating a new user.
50 public function create()
52 $this->checkPermission('users-manage');
53 $authMethod = config('auth.method');
54 $roles = $this->userRepo->getAllRoles();
55 return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
59 * Store a newly created user in storage.
60 * @param Request $request
63 public function store(Request $request)
65 $this->checkPermission('users-manage');
68 'email' => 'required|email|unique:users,email'
71 $authMethod = config('auth.method');
72 if ($authMethod === 'standard') {
73 $validationRules['password'] = 'required|min:5';
74 $validationRules['password-confirm'] = 'required|same:password';
75 } elseif ($authMethod === 'ldap') {
76 $validationRules['external_auth_id'] = 'required';
78 $this->validate($request, $validationRules);
80 $user = $this->user->fill($request->all());
82 if ($authMethod === 'standard') {
83 $user->password = bcrypt($request->get('password'));
84 } elseif ($authMethod === 'ldap') {
85 $user->external_auth_id = $request->get('external_auth_id');
90 if ($request->filled('roles')) {
91 $roles = $request->get('roles');
92 $user->roles()->sync($roles);
95 $this->userRepo->downloadGravatarToUserAvatar($user);
97 return redirect('/settings/users');
101 * Show the form for editing the specified user.
103 * @param \BookStack\Auth\Access\SocialAuthService $socialAuthService
106 public function edit($id, SocialAuthService $socialAuthService)
108 $this->checkPermissionOr('users-manage', function () use ($id) {
109 return $this->currentUser->id == $id;
112 $user = $this->user->findOrFail($id);
114 $authMethod = ($user->system_name) ? 'system' : config('auth.method');
116 $activeSocialDrivers = $socialAuthService->getActiveDrivers();
117 $this->setPageTitle(trans('settings.user_profile'));
118 $roles = $this->userRepo->getAllRoles();
119 return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
123 * Update the specified user in storage.
124 * @param Request $request
128 public function update(Request $request, $id)
130 $this->preventAccessForDemoUsers();
131 $this->checkPermissionOr('users-manage', function () use ($id) {
132 return $this->currentUser->id == $id;
135 $this->validate($request, [
137 'email' => 'min:2|email|unique:users,email,' . $id,
138 'password' => 'min:5|required_with:password_confirm',
139 'password-confirm' => 'same:password|required_with:password',
143 $user = $this->user->findOrFail($id);
144 $user->fill($request->all());
147 if (userCan('users-manage') && $request->filled('roles')) {
148 $roles = $request->get('roles');
149 $user->roles()->sync($roles);
153 if ($request->filled('password')) {
154 $password = $request->get('password');
155 $user->password = bcrypt($password);
158 // External auth id updates
159 if ($this->currentUser->can('users-manage') && $request->filled('external_auth_id')) {
160 $user->external_auth_id = $request->get('external_auth_id');
163 // Save an user-specific settings
164 if ($request->filled('setting')) {
165 foreach ($request->get('setting') as $key => $value) {
166 setting()->putUser($user, $key, $value);
171 session()->flash('success', trans('settings.users_edit_success'));
173 $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
174 return redirect($redirectUrl);
178 * Show the user delete page.
180 * @return \Illuminate\View\View
182 public function delete($id)
184 $this->checkPermissionOr('users-manage', function () use ($id) {
185 return $this->currentUser->id == $id;
188 $user = $this->user->findOrFail($id);
189 $this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name]));
190 return view('users/delete', ['user' => $user]);
194 * Remove the specified user from storage.
198 public function destroy($id)
200 $this->preventAccessForDemoUsers();
201 $this->checkPermissionOr('users-manage', function () use ($id) {
202 return $this->currentUser->id == $id;
205 $user = $this->userRepo->getById($id);
207 if ($this->userRepo->isOnlyAdmin($user)) {
208 session()->flash('error', trans('errors.users_cannot_delete_only_admin'));
209 return redirect($user->getEditUrl());
212 if ($user->system_name === 'public') {
213 session()->flash('error', trans('errors.users_cannot_delete_guest'));
214 return redirect($user->getEditUrl());
217 $this->userRepo->destroy($user);
218 session()->flash('success', trans('settings.users_delete_success'));
220 return redirect('/settings/users');
224 * Show the user profile page
226 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
228 public function showProfilePage($id)
230 $user = $this->userRepo->getById($id);
231 $userActivity = $this->userRepo->getActivity($user);
232 $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
233 $assetCounts = $this->userRepo->getAssetCounts($user);
234 return view('users/profile', [
236 'activity' => $userActivity,
237 'recentlyCreated' => $recentlyCreated,
238 'assetCounts' => $assetCounts
243 * Update the user's preferred book-list display setting.
245 * @param Request $request
246 * @return \Illuminate\Http\RedirectResponse
248 public function switchBookView($id, Request $request)
250 return $this->switchViewType($id, $request, 'books');
254 * Update the user's preferred shelf-list display setting.
256 * @param Request $request
257 * @return \Illuminate\Http\RedirectResponse
259 public function switchShelfView($id, Request $request)
261 return $this->switchViewType($id, $request, 'bookshelves');
265 * For a type of list, switch with stored view type for a user.
266 * @param integer $userId
267 * @param Request $request
268 * @param string $listName
269 * @return \Illuminate\Http\RedirectResponse
271 protected function switchViewType($userId, Request $request, string $listName)
273 $this->checkPermissionOrCurrentUser('users-manage', $userId);
275 $viewType = $request->get('view_type');
276 if (!in_array($viewType, ['grid', 'list'])) {
280 $user = $this->user->findOrFail($userId);
281 $key = $listName . '_view_type';
282 setting()->putUser($user, $key, $viewType);
284 return redirect()->back(302, [], "/settings/users/$userId");
288 * Change the stored sort type for the books view.
290 * @param Request $request
291 * @return \Illuminate\Http\RedirectResponse
293 public function changeBooksSort($id, Request $request)
295 // TODO - Test this endpoint
296 return $this->changeListSort($id, $request, 'books');
300 * Changed the stored preference for a list sort order.
302 * @param Request $request
303 * @param string $listName
304 * @return \Illuminate\Http\RedirectResponse
306 protected function changeListSort(int $userId, Request $request, string $listName)
308 $this->checkPermissionOrCurrentUser('users-manage', $userId);
310 $sort = $request->get('sort');
311 if (!in_array($sort, ['name', 'created_at', 'updated_at'])) {
315 $order = $request->get('order');
316 if (!in_array($order, ['asc', 'desc'])) {
320 $user = $this->user->findOrFail($userId);
321 $sortKey = $listName . '_sort';
322 $orderKey = $listName . '_sort_order';
323 setting()->putUser($user, $sortKey, $sort);
324 setting()->putUser($user, $orderKey, $order);
326 return redirect()->back(302, [], "/settings/users/$userId");