* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace FOS\UserBundle\Util; use FOS\UserBundle\Event\UserEvent; use FOS\UserBundle\FOSUserEvents; use FOS\UserBundle\Model\UserInterface; use FOS\UserBundle\Model\UserManagerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\RequestStack; /** * Executes some manipulations on the users. * * @author Christophe Coevoet * @author Luis Cordova */ class UserManipulator { /** * User manager. * * @var UserManagerInterface */ private $userManager; /** * @var EventDispatcherInterface */ private $dispatcher; /** * @var RequestStack */ private $requestStack; /** * UserManipulator constructor. * * @param UserManagerInterface $userManager * @param EventDispatcherInterface $dispatcher * @param RequestStack $requestStack */ public function __construct(UserManagerInterface $userManager, EventDispatcherInterface $dispatcher, RequestStack $requestStack) { $this->userManager = $userManager; $this->dispatcher = $dispatcher; $this->requestStack = $requestStack; } /** * Creates a user and returns it. * * @param string $username * @param string $password * @param string $email * @param bool $active * @param bool $superadmin * * @return \FOS\UserBundle\Model\UserInterface */ public function create($username, $password, $email, $active, $superadmin) { $user = $this->userManager->createUser(); $user->setUsername($username); $user->setEmail($email); $user->setPlainPassword($password); $user->setEnabled((bool) $active); $user->setSuperAdmin((bool) $superadmin); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_CREATED, $event); return $user; } /** * Activates the given user. * * @param string $username */ public function activate($username) { $user = $this->findUserByUsernameOrThrowException($username); $user->setEnabled(true); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_ACTIVATED, $event); } /** * Deactivates the given user. * * @param string $username */ public function deactivate($username) { $user = $this->findUserByUsernameOrThrowException($username); $user->setEnabled(false); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_DEACTIVATED, $event); } /** * Changes the password for the given user. * * @param string $username * @param string $password */ public function changePassword($username, $password) { $user = $this->findUserByUsernameOrThrowException($username); $user->setPlainPassword($password); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_PASSWORD_CHANGED, $event); } /** * Promotes the given user. * * @param string $username */ public function promote($username) { $user = $this->findUserByUsernameOrThrowException($username); $user->setSuperAdmin(true); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_PROMOTED, $event); } /** * Demotes the given user. * * @param string $username */ public function demote($username) { $user = $this->findUserByUsernameOrThrowException($username); $user->setSuperAdmin(false); $this->userManager->updateUser($user); $event = new UserEvent($user, $this->getRequest()); $this->dispatcher->dispatch(FOSUserEvents::USER_DEMOTED, $event); } /** * Adds role to the given user. * * @param string $username * @param string $role * * @return bool true if role was added, false if user already had the role */ public function addRole($username, $role) { $user = $this->findUserByUsernameOrThrowException($username); if ($user->hasRole($role)) { return false; } $user->addRole($role); $this->userManager->updateUser($user); return true; } /** * Removes role from the given user. * * @param string $username * @param string $role * * @return bool true if role was removed, false if user didn't have the role */ public function removeRole($username, $role) { $user = $this->findUserByUsernameOrThrowException($username); if (!$user->hasRole($role)) { return false; } $user->removeRole($role); $this->userManager->updateUser($user); return true; } /** * Finds a user by his username and throws an exception if we can't find it. * * @param string $username * * @throws \InvalidArgumentException When user does not exist * * @return UserInterface */ private function findUserByUsernameOrThrowException($username) { $user = $this->userManager->findUserByUsername($username); if (!$user) { throw new \InvalidArgumentException(sprintf('User identified by "%s" username does not exist.', $username)); } return $user; } /** * @return Request */ private function getRequest() { return $this->requestStack->getCurrentRequest(); } }