]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/UserController.php
Merge pull request #1 from ssddanbrown/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->getAssignableRoles();
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         $authMethod = config('auth.method');
130
131         $user = $this->user->findOrFail($id);
132         $activeSocialDrivers = $socialAuthService->getActiveDrivers();
133         $this->setPageTitle('User Profile');
134         $roles = $this->userRepo->getAssignableRoles();
135         return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
136     }
137
138     /**
139      * Update the specified user in storage.
140      * @param  Request $request
141      * @param  int     $id
142      * @return Response
143      */
144     public function update(Request $request, $id)
145     {
146         $this->preventAccessForDemoUsers();
147         $this->checkPermissionOr('users-manage', function () use ($id) {
148             return $this->currentUser->id == $id;
149         });
150
151         $this->validate($request, [
152             'name'             => 'min:2',
153             'email'            => 'min:2|email|unique:users,email,' . $id,
154             'password'         => 'min:5|required_with:password_confirm',
155             'password-confirm' => 'same:password|required_with:password'
156         ], [
157             'password-confirm.required_with' => 'Password confirmation required'
158         ]);
159
160         $user = $this->user->findOrFail($id);
161         $user->fill($request->all());
162
163         // Role updates
164         if (userCan('users-manage') && $request->has('roles')) {
165             $roles = $request->get('roles');
166             $user->roles()->sync($roles);
167         }
168
169         // Password updates
170         if ($request->has('password') && $request->get('password') != '') {
171             $password = $request->get('password');
172             $user->password = bcrypt($password);
173         }
174
175         // External auth id updates
176         if ($this->currentUser->can('users-manage') && $request->has('external_auth_id')) {
177             $user->external_auth_id = $request->get('external_auth_id');
178         }
179
180         $user->save();
181         session()->flash('success', 'User successfully updated');
182
183         $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
184         return redirect($redirectUrl);
185     }
186
187     /**
188      * Show the user delete page.
189      * @param $id
190      * @return \Illuminate\View\View
191      */
192     public function delete($id)
193     {
194         $this->checkPermissionOr('users-manage', function () use ($id) {
195             return $this->currentUser->id == $id;
196         });
197
198         $user = $this->user->findOrFail($id);
199         $this->setPageTitle('Delete User ' . $user->name);
200         return view('users/delete', ['user' => $user]);
201     }
202
203     /**
204      * Remove the specified user from storage.
205      * @param  int $id
206      * @return Response
207      */
208     public function destroy($id)
209     {
210         $this->preventAccessForDemoUsers();
211         $this->checkPermissionOr('users-manage', function () use ($id) {
212             return $this->currentUser->id == $id;
213         });
214
215         $user = $this->userRepo->getById($id);
216
217         if ($this->userRepo->isOnlyAdmin($user)) {
218             session()->flash('error', 'You cannot delete the only admin');
219             return redirect($user->getEditUrl());
220         }
221
222         $this->userRepo->destroy($user);
223         session()->flash('success', 'User successfully removed');
224
225         return redirect('/settings/users');
226     }
227
228     /**
229      * Show the user profile page
230      * @param $id
231      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
232      */
233     public function showProfilePage($id)
234     {
235         $user = $this->userRepo->getById($id);
236         $userActivity = $this->userRepo->getActivity($user);
237         $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
238         $assetCounts = $this->userRepo->getAssetCounts($user);
239         return view('users/profile', [
240             'user' => $user,
241             'activity' => $userActivity,
242             'recentlyCreated' => $recentlyCreated,
243             'assetCounts' => $assetCounts
244         ]);
245     }
246 }