diff --git a/src/Command/SetPasswordCommand.php b/src/Command/SetPasswordCommand.php new file mode 100644 index 00000000..5cf78971 --- /dev/null +++ b/src/Command/SetPasswordCommand.php @@ -0,0 +1,95 @@ +entityManager = $entityManager; + $this->encoder = $passwordEncoder; + + + parent::__construct(); + } + + + protected function configure() + { + $this + ->setDescription('Sets the password of a user') + ->setHelp('This password allows you to set the password of a user, without knowing the old password.') + ->addArgument('user', InputArgument::REQUIRED, 'The name of the user') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $io = new SymfonyStyle($input, $output); + $user_name = $input->getArgument('user'); + + /** + * @var User $user + */ + $users = $this->entityManager->getRepository(User::class)->findBy(['name' => $user_name]); + $user = $users[0]; + + + if($user == null) + { + $io->error(sprintf('No user with the given username %s found in the database!', $user_name)); + return; + } + + $io->note('User found!'); + + $proceed = $io->confirm( + sprintf('You are going to change the password of %s with ID %d. Proceed?', + $user->getFullName(true), $user->getID())); + + if(!$proceed) + { + return; + } + + $success = false; + $new_password = ""; + + while(!$success) { + $pw1 = $io->askHidden("Please enter new password:"); + $pw2 = $io->askHidden('Please confirm:'); + if($pw1 !== $pw2) { + $io->error('The entered password did not match! Please try again.'); + } else { + //Exit loop + $success = true; + $new_password = $pw1; + } + } + + //Encode password + $hash = $this->encoder->encodePassword($user, $new_password); + $user->setPassword($hash); + + //And save it to databae + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $io->success('Password was set successful! You can now log in using the new password.'); + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php index b07c0a4a..e5855333 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -74,6 +74,12 @@ class User extends NamedDBElement implements UserInterface, HasPermissionsInterf */ protected $password; + /** + * @var bool True if the user needs to change password after log in + * @ORM\Column(type="boolean") + */ + protected $need_pw_change; + /** * @var string|null The first name of the User * @ORM\Column(type="string", length=255, nullable=true) @@ -228,6 +234,23 @@ class User extends NamedDBElement implements UserInterface, HasPermissionsInterf * Getters ************************************************/ + /** + * Returns the full name in the format FIRSTNAME LASTNAME [(USERNAME)]. + * Example: Max Muster (m.muster) + * @param bool $including_username Include the username in the full name. + * @return string A string with the full name of this user. + */ + public function getFullName(bool $including_username = false) + { + $str = $this->getFirstName() . ' ' . $this->getLastName(); + if ($including_username) { + $str .= ' (' . $this->getName() . ')'; + } + + return $str; + } + + public function setName(string $new_name) : NamedDBElement { // Anonymous user is not allowed to change its username