namespace BookStack\Users\Controllers;
-use BookStack\Access\SocialAuthService;
+use BookStack\Access\SocialDriverManager;
+use BookStack\Access\UserInviteException;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\UserUpdateException;
use BookStack\Http\Controller;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Rules\Password;
use Illuminate\Validation\ValidationException;
class UserController extends Controller
{
- protected UserRepo $userRepo;
- protected ImageRepo $imageRepo;
-
- public function __construct(UserRepo $userRepo, ImageRepo $imageRepo)
- {
- $this->userRepo = $userRepo;
- $this->imageRepo = $imageRepo;
+ public function __construct(
+ protected UserRepo $userRepo,
+ protected ImageRepo $imageRepo
+ ) {
}
/**
$validated = $this->validate($request, array_filter($validationRules));
- DB::transaction(function () use ($validated, $sendInvite) {
- $this->userRepo->create($validated, $sendInvite);
- });
+ try {
+ DB::transaction(function () use ($validated, $sendInvite) {
+ $this->userRepo->create($validated, $sendInvite);
+ });
+ } catch (UserInviteException $e) {
+ Log::error("Failed to send user invite with error: {$e->getMessage()}");
+ $this->showErrorNotification(trans('errors.users_could_not_send_invite'));
+ return redirect('/settings/users/create')->withInput();
+ }
return redirect('/settings/users');
}
/**
* Show the form for editing the specified user.
*/
- public function edit(int $id, SocialAuthService $socialAuthService)
+ public function edit(int $id, SocialDriverManager $socialDriverManager)
{
- $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $this->checkPermission('users-manage');
$user = $this->userRepo->getById($id);
$user->load(['apiTokens', 'mfaValues']);
$authMethod = ($user->system_name) ? 'system' : config('auth.method');
- $activeSocialDrivers = $socialAuthService->getActiveDrivers();
+ $activeSocialDrivers = $socialDriverManager->getActive();
$mfaMethods = $user->mfaValues->groupBy('method');
$this->setPageTitle(trans('settings.user_profile'));
$roles = Role::query()->orderBy('display_name', 'asc')->get();
public function update(Request $request, int $id)
{
$this->preventAccessInDemoMode();
- $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $this->checkPermission('users-manage');
$validated = $this->validate($request, [
- 'name' => ['min:2', 'max:100'],
+ 'name' => ['min:1', 'max:100'],
'email' => ['min:2', 'email', 'unique:users,email,' . $id],
'password' => ['required_with:password_confirm', Password::default()],
'password-confirm' => ['same:password', 'required_with:password'],
]);
$user = $this->userRepo->getById($id);
- $this->userRepo->update($user, $validated, userCan('users-manage'));
+ $this->userRepo->update($user, $validated, true);
// Save profile image if in request
if ($request->hasFile('profile_image')) {
$user->save();
}
- $redirectUrl = userCan('users-manage') ? '/settings/users' : "/settings/users/{$user->id}";
-
- return redirect($redirectUrl);
+ return redirect('/settings/users');
}
/**
*/
public function delete(int $id)
{
- $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $this->checkPermission('users-manage');
$user = $this->userRepo->getById($id);
$this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name]));
public function destroy(Request $request, int $id)
{
$this->preventAccessInDemoMode();
- $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $this->checkPermission('users-manage');
$user = $this->userRepo->getById($id);
$newOwnerId = intval($request->get('new_owner_id')) ?: null;