user = $user; $this->userRepo = $userRepo; parent::__construct(); } /** * Display a listing of the users. * @param Request $request * @return Response */ public function index(Request $request) { $this->checkPermission('users-manage'); $listDetails = [ 'order' => $request->get('order', 'asc'), 'search' => $request->get('search', ''), 'sort' => $request->get('sort', 'name'), ]; $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails); $this->setPageTitle(trans('settings.users')); $users->appends($listDetails); return view('users/index', ['users' => $users, 'listDetails' => $listDetails]); } /** * Show the form for creating a new user. * @return Response */ public function create() { $this->checkPermission('users-manage'); $authMethod = config('auth.method'); $roles = $this->userRepo->getAllRoles(); return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]); } /** * Store a newly created user in storage. * @param Request $request * @return Response * @throws UserUpdateException */ public function store(Request $request) { $this->checkPermission('users-manage'); $validationRules = [ 'name' => 'required', 'email' => 'required|email|unique:users,email' ]; $authMethod = config('auth.method'); if ($authMethod === 'standard') { $validationRules['password'] = 'required|min:5'; $validationRules['password-confirm'] = 'required|same:password'; } elseif ($authMethod === 'ldap') { $validationRules['external_auth_id'] = 'required'; } $this->validate($request, $validationRules); $user = $this->user->fill($request->all()); if ($authMethod === 'standard') { $user->password = bcrypt($request->get('password')); } elseif ($authMethod === 'ldap') { $user->external_auth_id = $request->get('external_auth_id'); } $user->save(); if ($request->filled('roles')) { $roles = $request->get('roles'); $this->userRepo->setUserRoles($user, $roles); } $this->userRepo->downloadAndAssignUserAvatar($user); return redirect('/settings/users'); } /** * Show the form for editing the specified user. * @param int $id * @param \BookStack\Auth\Access\SocialAuthService $socialAuthService * @return Response */ public function edit($id, SocialAuthService $socialAuthService) { $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $user = $this->user->findOrFail($id); $authMethod = ($user->system_name) ? 'system' : config('auth.method'); $activeSocialDrivers = $socialAuthService->getActiveDrivers(); $this->setPageTitle(trans('settings.user_profile')); $roles = $this->userRepo->getAllRoles(); return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]); } /** * Update the specified user in storage. * @param Request $request * @param int $id * @return Response * @throws UserUpdateException */ public function update(Request $request, $id) { $this->preventAccessForDemoUsers(); $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $this->validate($request, [ 'name' => 'min:2', 'email' => 'min:2|email|unique:users,email,' . $id, 'password' => 'min:5|required_with:password_confirm', 'password-confirm' => 'same:password|required_with:password', 'setting' => 'array' ]); $user = $this->userRepo->getById($id); $user->fill($request->all()); // Role updates if (userCan('users-manage') && $request->filled('roles')) { $roles = $request->get('roles'); $this->userRepo->setUserRoles($user, $roles); } // Password updates if ($request->filled('password')) { $password = $request->get('password'); $user->password = bcrypt($password); } // External auth id updates if ($this->currentUser->can('users-manage') && $request->filled('external_auth_id')) { $user->external_auth_id = $request->get('external_auth_id'); } // Save an user-specific settings if ($request->filled('setting')) { foreach ($request->get('setting') as $key => $value) { setting()->putUser($user, $key, $value); } } $user->save(); session()->flash('success', trans('settings.users_edit_success')); $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id; return redirect($redirectUrl); } /** * Show the user delete page. * @param int $id * @return \Illuminate\View\View */ public function delete($id) { $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $user = $this->userRepo->getById($id); $this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name])); return view('users/delete', ['user' => $user]); } /** * Remove the specified user from storage. * @param int $id * @return Response * @throws \Exception */ public function destroy($id) { $this->preventAccessForDemoUsers(); $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $user = $this->userRepo->getById($id); if ($this->userRepo->isOnlyAdmin($user)) { session()->flash('error', trans('errors.users_cannot_delete_only_admin')); return redirect($user->getEditUrl()); } if ($user->system_name === 'public') { session()->flash('error', trans('errors.users_cannot_delete_guest')); return redirect($user->getEditUrl()); } $this->userRepo->destroy($user); session()->flash('success', trans('settings.users_delete_success')); return redirect('/settings/users'); } /** * Show the user profile page * @param $id * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function showProfilePage($id) { $user = $this->userRepo->getById($id); $userActivity = $this->userRepo->getActivity($user); $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0); $assetCounts = $this->userRepo->getAssetCounts($user); return view('users/profile', [ 'user' => $user, 'activity' => $userActivity, 'recentlyCreated' => $recentlyCreated, 'assetCounts' => $assetCounts ]); } /** * Update the user's preferred book-list display setting. * @param $id * @param Request $request * @return \Illuminate\Http\RedirectResponse */ public function switchBookView($id, Request $request) { $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $viewType = $request->get('view_type'); if (!in_array($viewType, ['grid', 'list'])) { $viewType = 'list'; } $user = $this->user->findOrFail($id); setting()->putUser($user, 'books_view_type', $viewType); return redirect()->back(302, [], "/settings/users/$id"); } /** * Update the user's preferred shelf-list display setting. * @param $id * @param Request $request * @return \Illuminate\Http\RedirectResponse */ public function switchShelfView($id, Request $request) { $this->checkPermissionOr('users-manage', function () use ($id) { return $this->currentUser->id == $id; }); $viewType = $request->get('view_type'); if (!in_array($viewType, ['grid', 'list'])) { $viewType = 'list'; } $user = $this->userRepo->getById($id); setting()->putUser($user, 'bookshelves_view_type', $viewType); return redirect()->back(302, [], "/settings/users/$id"); } }