]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/UserController.php
Merge pull request #2 from BookStackApp/master
[bookstack] / app / Http / Controllers / UserController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use BookStack\Activity;
6 use Exception;
7 use Illuminate\Http\Request;
8
9 use Illuminate\Http\Response;
10 use BookStack\Http\Requests;
11 use BookStack\Repos\UserRepo;
12 use BookStack\Services\SocialAuthService;
13 use BookStack\User;
14
15 class UserController extends Controller
16 {
17
18     protected $user;
19     protected $userRepo;
20
21     /**
22      * UserController constructor.
23      * @param User     $user
24      * @param UserRepo $userRepo
25      */
26     public function __construct(User $user, UserRepo $userRepo)
27     {
28         $this->user = $user;
29         $this->userRepo = $userRepo;
30         parent::__construct();
31     }
32
33     /**
34      * Display a listing of the users.
35      * @param Request $request
36      * @return Response
37      */
38     public function index(Request $request)
39     {
40         $this->checkPermission('users-manage');
41         $listDetails = [
42             'order' => $request->has('order') ? $request->get('order') : 'asc',
43             'search' => $request->has('search') ? $request->get('search') : '',
44             'sort' => $request->has('sort') ? $request->get('sort') : 'name',
45         ];
46         $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
47         $this->setPageTitle('Users');
48         $users->appends($listDetails);
49         return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
50     }
51
52     /**
53      * Show the form for creating a new user.
54      * @return Response
55      */
56     public function create()
57     {
58         $this->checkPermission('users-manage');
59         $authMethod = config('auth.method');
60         $roles = $this->userRepo->getAllRoles();
61         return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
62     }
63
64     /**
65      * Store a newly created user in storage.
66      * @param  Request $request
67      * @return Response
68      */
69     public function store(Request $request)
70     {
71         $this->checkPermission('users-manage');
72         $validationRules = [
73             'name'             => 'required',
74             'email'            => 'required|email|unique:users,email'
75         ];
76
77         $authMethod = config('auth.method');
78         if ($authMethod === 'standard') {
79             $validationRules['password'] = 'required|min:5';
80             $validationRules['password-confirm'] = 'required|same:password';
81         } elseif ($authMethod === 'ldap') {
82             $validationRules['external_auth_id'] = 'required';
83         }
84         $this->validate($request, $validationRules);
85
86
87         $user = $this->user->fill($request->all());
88
89         if ($authMethod === 'standard') {
90             $user->password = bcrypt($request->get('password'));
91         } elseif ($authMethod === 'ldap') {
92             $user->external_auth_id = $request->get('external_auth_id');
93         }
94
95         $user->save();
96
97         if ($request->has('roles')) {
98             $roles = $request->get('roles');
99             $user->roles()->sync($roles);
100         }
101
102         // Get avatar from gravatar and save
103         if (!config('services.disable_services')) {
104             try {
105                 $avatar = \Images::saveUserGravatar($user);
106                 $user->avatar()->associate($avatar);
107                 $user->save();
108             } catch (Exception $e) {
109                 \Log::error('Failed to save user gravatar image');
110             }
111
112         }
113
114         return redirect('/settings/users');
115     }
116
117     /**
118      * Show the form for editing the specified user.
119      * @param  int              $id
120      * @param SocialAuthService $socialAuthService
121      * @return Response
122      */
123     public function edit($id, SocialAuthService $socialAuthService)
124     {
125         $this->checkPermissionOr('users-manage', function () use ($id) {
126             return $this->currentUser->id == $id;
127         });
128
129         $user = $this->user->findOrFail($id);
130
131         $authMethod = ($user->system_name) ? 'system' : config('auth.method');
132
133         $activeSocialDrivers = $socialAuthService->getActiveDrivers();
134         $this->setPageTitle('User Profile');
135         $roles = $this->userRepo->getAllRoles();
136         return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
137     }
138
139     /**
140      * Update the specified user in storage.
141      * @param  Request $request
142      * @param  int     $id
143      * @return Response
144      */
145     public function update(Request $request, $id)
146     {
147         $this->preventAccessForDemoUsers();
148         $this->checkPermissionOr('users-manage', function () use ($id) {
149             return $this->currentUser->id == $id;
150         });
151
152         $this->validate($request, [
153             'name'             => 'min:2',
154             'email'            => 'min:2|email|unique:users,email,' . $id,
155             'password'         => 'min:5|required_with:password_confirm',
156             'password-confirm' => 'same:password|required_with:password'
157         ], [
158             'password-confirm.required_with' => 'Password confirmation required'
159         ]);
160
161         $user = $this->user->findOrFail($id);
162         $user->fill($request->all());
163
164         // Role updates
165         if (userCan('users-manage') && $request->has('roles')) {
166             $roles = $request->get('roles');
167             $user->roles()->sync($roles);
168         }
169
170         // Password updates
171         if ($request->has('password') && $request->get('password') != '') {
172             $password = $request->get('password');
173             $user->password = bcrypt($password);
174         }
175
176         // External auth id updates
177         if ($this->currentUser->can('users-manage') && $request->has('external_auth_id')) {
178             $user->external_auth_id = $request->get('external_auth_id');
179         }
180
181         $user->save();
182         session()->flash('success', 'User successfully updated');
183
184         $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
185         return redirect($redirectUrl);
186     }
187
188     /**
189      * Show the user delete page.
190      * @param int $id
191      * @return \Illuminate\View\View
192      */
193     public function delete($id)
194     {
195         $this->checkPermissionOr('users-manage', function () use ($id) {
196             return $this->currentUser->id == $id;
197         });
198
199         $user = $this->user->findOrFail($id);
200         $this->setPageTitle('Delete User ' . $user->name);
201         return view('users/delete', ['user' => $user]);
202     }
203
204     /**
205      * Remove the specified user from storage.
206      * @param  int $id
207      * @return Response
208      */
209     public function destroy($id)
210     {
211         $this->preventAccessForDemoUsers();
212         $this->checkPermissionOr('users-manage', function () use ($id) {
213             return $this->currentUser->id == $id;
214         });
215
216         $user = $this->userRepo->getById($id);
217
218         if ($this->userRepo->isOnlyAdmin($user)) {
219             session()->flash('error', 'You cannot delete the only admin');
220             return redirect($user->getEditUrl());
221         }
222
223         if ($user->system_name === 'public') {
224             session()->flash('error', 'You cannot delete the guest user');
225             return redirect($user->getEditUrl());
226         }
227
228         $this->userRepo->destroy($user);
229         session()->flash('success', 'User successfully removed');
230
231         return redirect('/settings/users');
232     }
233
234     /**
235      * Show the user profile page
236      * @param $id
237      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
238      */
239     public function showProfilePage($id)
240     {
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', [
246             'user' => $user,
247             'activity' => $userActivity,
248             'recentlyCreated' => $recentlyCreated,
249             'assetCounts' => $assetCounts
250         ]);
251     }
252 }