diff --git a/config/routing/admin_users.yaml b/config/routing/admin_users.yaml index 48f2ddc..36f694f 100644 --- a/config/routing/admin_users.yaml +++ b/config/routing/admin_users.yaml @@ -18,6 +18,22 @@ sfs_user_admin_users_delete: controller: sfs_user.admin.user.controller::delete path: /{user}/delete +sfs_user_admin_users_confirm: + controller: Softspring\UserBundle\Controller\Admin\UsersController::userConfirm + path: /{user}/confirm + +sfs_user_admin_users_unconfirm: + controller: Softspring\UserBundle\Controller\Admin\UsersController::userUnconfirm + path: /{user}/unconfirm + +sfs_user_admin_users_enable: + controller: Softspring\UserBundle\Controller\Admin\UsersController::userEnable + path: /{user}/enable + +sfs_user_admin_users_disable: + controller: Softspring\UserBundle\Controller\Admin\UsersController::userDisable + path: /{user}/disable + sfs_user_admin_users_resend_confirmation: controller: Softspring\UserBundle\Controller\Admin\UsersController::resendConfirmationEmail path: /{user}/resend diff --git a/config/security/admin_role_hierarchy.yaml b/config/security/admin_role_hierarchy.yaml index 567955d..4836930 100644 --- a/config/security/admin_role_hierarchy.yaml +++ b/config/security/admin_role_hierarchy.yaml @@ -8,6 +8,10 @@ security: - PERMISSION_SFS_USER_ADMIN_USERS_DELETE - PERMISSION_SFS_USER_ADMIN_USERS_UPDATE - PERMISSION_SFS_USER_ADMIN_HISTORY_LIST + - PERMISSION_SFS_USER_ADMIN_USERS_CONFIRM + - PERMISSION_SFS_USER_ADMIN_USERS_UNCONFIRM + - PERMISSION_SFS_USER_ADMIN_USERS_ENABLE + - PERMISSION_SFS_USER_ADMIN_USERS_DISABLE ROLE_SFS_USER_ADMIN_ADMINISTRATORS_RO: - PERMISSION_SFS_USER_ADMIN_ADMINISTRATORS_LIST - PERMISSION_SFS_USER_ADMIN_ADMINISTRATORS_DETAILS diff --git a/src/Controller/Admin/UsersController.php b/src/Controller/Admin/UsersController.php index f426ef9..af93022 100644 --- a/src/Controller/Admin/UsersController.php +++ b/src/Controller/Admin/UsersController.php @@ -2,6 +2,7 @@ namespace Softspring\UserBundle\Controller\Admin; +use DateTime; use Doctrine\ORM\EntityManagerInterface; use Exception; use Softspring\Component\Events\DispatchGetResponseTrait; @@ -9,9 +10,12 @@ use Softspring\UserBundle\Mailer\UserMailerInterface; use Softspring\UserBundle\Manager\UserManagerInterface; use Softspring\UserBundle\Model\ConfirmableInterface; +use Softspring\UserBundle\Model\EnablableInterface; use Softspring\UserBundle\Model\RolesAdminInterface; +use Softspring\UserBundle\Model\User; use Softspring\UserBundle\Model\UserInterface; use Softspring\UserBundle\SfsUserEvents; +use Softspring\UserBundle\Util\TokenGeneratorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; @@ -30,12 +34,15 @@ class UsersController extends AbstractController protected EventDispatcherInterface $eventDispatcher; - public function __construct(UserManagerInterface $userManager, EntityManagerInterface $em, ?UserMailerInterface $userMailer, EventDispatcherInterface $eventDispatcher) + protected TokenGeneratorInterface $tokenGenerator; + + public function __construct(UserManagerInterface $userManager, EntityManagerInterface $em, ?UserMailerInterface $userMailer, EventDispatcherInterface $eventDispatcher, TokenGeneratorInterface $tokenGenerator) { $this->userManager = $userManager; $this->em = $em; $this->userMailer = $userMailer; $this->eventDispatcher = $eventDispatcher; + $this->tokenGenerator = $tokenGenerator; } public function promoteAdmin(string $user, Request $request): Response @@ -84,6 +91,76 @@ public function usersPendingConfirmCountWidget(): Response ]); } + public function userConfirm(string $user): Response + { + /** @var User $user */ + $user = $this->userManager->findUserBy(['id' => $user]); + + $this->denyAccessUnlessGranted('PERMISSION_SFS_USER_ADMIN_USERS_CONFIRM', $user); + + if (!$user instanceof UserInterface || !$user instanceof ConfirmableInterface) { + throw new Exception(sprintf('User %s class must implement %s to confirm', get_class($user), ConfirmableInterface::class)); + } + + $user->setConfirmationToken(null); + $user->setConfirmedAt(new DateTime()); + $this->userManager->saveEntity($user); + + return $this->redirectToRoute('sfs_user_admin_users_details', ['user' => $user->getId()]); + } + + public function userUnconfirm(string $user): Response + { + /** @var User $user */ + $user = $this->userManager->findUserBy(['id' => $user]); + + $this->denyAccessUnlessGranted('PERMISSION_SFS_USER_ADMIN_USERS_UNCONFIRM', $user); + + if (!$user instanceof UserInterface || !$user instanceof ConfirmableInterface) { + throw new Exception(sprintf('User %s class must implement %s to confirm', get_class($user), ConfirmableInterface::class)); + } + + $user->setConfirmationToken($this->tokenGenerator->generateToken()); + $user->setConfirmedAt(null); + $this->userManager->saveEntity($user); + + return $this->redirectToRoute('sfs_user_admin_users_details', ['user' => $user->getId()]); + } + + public function userEnable(string $user): Response + { + /** @var User $user */ + $user = $this->userManager->findUserBy(['id' => $user]); + + $this->denyAccessUnlessGranted('PERMISSION_SFS_USER_ADMIN_USERS_ENABLE', $user); + + if (!$user instanceof UserInterface || !$user instanceof EnablableInterface) { + throw new Exception(sprintf('User %s class must implement %s to enable', get_class($user), EnablableInterface::class)); + } + + $user->setEnabled(true); + $this->userManager->saveEntity($user); + + return $this->redirectToRoute('sfs_user_admin_users_details', ['user' => $user->getId()]); + } + + public function userDisable(string $user): Response + { + /** @var User $user */ + $user = $this->userManager->findUserBy(['id' => $user]); + + $this->denyAccessUnlessGranted('PERMISSION_SFS_USER_ADMIN_USERS_DISABLE', $user); + + if (!$user instanceof UserInterface || !$user instanceof EnablableInterface) { + throw new Exception(sprintf('User %s class must implement %s to enable', get_class($user), EnablableInterface::class)); + } + + $user->setEnabled(false); + $this->userManager->saveEntity($user); + + return $this->redirectToRoute('sfs_user_admin_users_details', ['user' => $user->getId()]); + } + public function resendConfirmationEmail(string $user, Request $request): Response { /** @var ConfirmableInterface|UserInterface $user */ diff --git a/translations/sfs_user.en.yaml b/translations/sfs_user.en.yaml index 246631d..6854ca2 100644 --- a/translations/sfs_user.en.yaml +++ b/translations/sfs_user.en.yaml @@ -160,10 +160,13 @@ admin_users: unconfirm: "Unconfirm" confirm: "Confirm" resend_confirm: "Resend confirm" + enable: "Enable" + disable: "Disable" fields: username: "Username" email: "Email" confirmed: "Confirmation" + enabled: "Enabled" lastLogin: "Last access" lastLogin.notYet: "not yet" role: "Role" diff --git a/translations/sfs_user.es.yaml b/translations/sfs_user.es.yaml index 8640fa2..1760e0b 100644 --- a/translations/sfs_user.es.yaml +++ b/translations/sfs_user.es.yaml @@ -160,10 +160,13 @@ admin_users: unconfirm: "Desconfirmar manualmente" confirm: "Confirmar manualmente" resend_confirm: "Reenviar confirmación" + enable: "Habilitar" + disable: "Deshabilitar" fields: username: "Nombre de usuario" email: "Email" confirmed: "Confirmado" + enabled: "Habilitado" lastLogin: "Último acceso" lastLogin.notYet: "aún no ha accedido" role: "Rol"