Skip to content
Snippets Groups Projects
Commit 58c1c49a authored by Camille Simiand's avatar Camille Simiand
Browse files

Add pending_email_address entity

parent a59ddf32
No related branches found
No related tags found
1 merge request!69tuleap-142-when-editing-email-address-user-should-confirm-it-with-email-validation
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20220307154836 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE `pending_email_address` (id INT AUTO_INCREMENT NOT NULL, user INT NOT NULL, email VARCHAR(255) NOT NULL, INDEX IDX_621FD0118D93D649 (user), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE `pending_email_address` ADD CONSTRAINT FK_621FD0118D93D649 FOREIGN KEY (user) REFERENCES `user` (id)');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE `pending_email_address`');
$this->addSql('ALTER TABLE capsule CHANGE nom nom VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE link link VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE edition_link edition_link VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE password password VARCHAR(50) NOT NULL COLLATE `utf8_unicode_ci`');
$this->addSql('ALTER TABLE `group` CHANGE name name VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`');
$this->addSql('ALTER TABLE invitation_editeur_capsule CHANGE email email VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`');
$this->addSql('ALTER TABLE reset_password_request CHANGE selector selector VARCHAR(20) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE hashed_token hashed_token VARCHAR(100) NOT NULL COLLATE `utf8_unicode_ci`');
$this->addSql('ALTER TABLE `user` CHANGE email email VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE email_canonical email_canonical VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE name name VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE firstname firstname VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE username username VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE username_canonical username_canonical VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE roles roles LONGTEXT NOT NULL COLLATE `utf8_unicode_ci` COMMENT \'(DC2Type:json)\', CHANGE password password VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`, CHANGE salt salt VARCHAR(255) NOT NULL COLLATE `utf8_unicode_ci`');
}
}
......@@ -2,10 +2,13 @@
namespace App\Controller;
use App\Entity\PendingEmailAddress;
use App\Entity\User;
use App\Form\EditPasswordFormType;
use App\Form\EditUserProfileFormType;
use App\Security\EmailVerifier;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
......@@ -36,7 +39,7 @@ class UserController extends AbstractController
}
#[Route('/edit_profile', name:'edit_profile')]
public function editProfile(Request $request): Response
public function editProfile(Request $request, EmailVerifier $email_verifier): Response
{
$current_user = $this->getUser();
......@@ -54,17 +57,28 @@ class UserController extends AbstractController
if ($form->isSubmitted() && $form->isValid()) {
$this->entity_manager->persist($current_user);
$this->entity_manager->flush();
$current_user->setFirstName($form->get('firstName')->getData());
$current_user->setLastName($form->get('lastName')->getData());
$this->entity_manager->persist($current_user);
if ($current_user->getEmail() !== $form->get('email')->getData()) {
$pending_email_address = new PendingEmailAddress();
$pending_email_address->setEmail($form->get('email')->getData());
$pending_email_address->setUser($current_user);
$this->entity_manager->persist($pending_email_address);
$this->entity_manager->flush();
$new_email_address = $form->get('email')->getData();
if ($current_user->getEmail() !== $new_email_address) {
$email_verifier->sendEmailConfirmation(
'app_verify_email',
$pending_email_address->getUser()->getId(),
$pending_email_address->getEmail(),
(new TemplatedEmail())
->to($pending_email_address->getEmail())
->subject('Please Confirm your Email')
->htmlTemplate('user/update_email.html.twig')
);
$this->addFlash(
'warning',
$this->translator->trans('user.profile.updated.warning', [
'new_email_address' => $new_email_address
'new_email_address' => $form->get('email')->getData()
])
);
......
<?php
namespace App\Entity;
use App\Repository\PendingEmailAddressRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass:PendingEmailAddressRepository::class)]
#[ORM\Table(name:'`pending_email_address`')]
class PendingEmailAddress
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type:'integer')]
private int $id;
#[ORM\ManyToOne(targetEntity:User::class)]
#[ORM\JoinColumn(name:'user', referencedColumnName:'id', nullable:false)]
private User $user;
#[Assert\Email(message: 'email.valid')]
#[ORM\Column(type:'string', length:255)]
private string $email;
public function getUser(): User
{
return $this->user;
}
public function setUser(User $user): void
{
$this->user = $user;
}
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): void
{
$this->email = $email;
}
}
......@@ -78,6 +78,5 @@ class EditUserProfileFormType extends AbstractType
'data_class' => User::class,
'current_email_address' => ''
]);
// $resolver->setAllowedTypes('current_email_address', 'string');
}
}
<?php
namespace App\Repository;
use App\Entity\PendingEmailAddress;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method PendingEmailAddress|null find($id, $lockMode = null, $lockVersion = null)
* @method PendingEmailAddress|null findOneBy(array $criteria, array $orderBy = null)
* @method PendingEmailAddress[] findAll()
* @method PendingEmailAddress[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
* @template PendingEmailAddress of object
*/
class PendingEmailAddressRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PendingEmailAddress::class);
}
}
<h1>
{{ 'user.edit.email.title'|trans }}
</h1>
<p>
{{ 'user.edit.email.text'|trans }}:
<br><br>
<a href="{{ signedUrl }}">
{{ 'user.edit.email.confirm_email'|trans }}
</a>
{{ 'general.link_expire'|trans({'%expirationDuration%':
expiresAtMessageKey|trans(expiresAtMessageData, 'VerifyEmailBundle')}) }}
</p>
<p>
{{ 'general.greeting'|trans }}
</p>
......@@ -119,6 +119,11 @@ user:
edit_profile: Edit my profile
edit_password: Edit my password
edit_email_address: Edit my email address
edit:
email:
title: Hi! Please confirm your email
text: Please click the following link to update your user account and for now on use this email address.
confirm_email: Confirm my email
editors:
title: Editors
......
......@@ -117,6 +117,11 @@ user:
edit_profile: Modifier mon mot de passe
edit_password: Modifier mon mot de passe
edit_email_address: Modifier mon adresse e-mail
edit:
email:
title: Bonjour ! Veuillez confirmer votre adresse email
text: Veuillez cliquer sur le lien suivant pour mettre à jour votre profil utilisateur et utiliser dorénavant cette adresse e-mail.
confirm_email: Confirmer mon adresse e-mail
editors:
title: Editeurs d'une capsule
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment