Преглед изворни кода

Evolution #43: Changer son email de contact

bastien пре 13 година
родитељ
комит
3086d22aea

+ 19 - 12
app/Resources/translations/flash.fr.yml Прегледај датотеку

@@ -1,22 +1,29 @@
1 1
 
2 2
 # FOS
3
-group.flash.updated: Le groupe a été mis à jour
4
-group.flash.created: Le groupe a été créé
5
-group.flash.deleted: Le groupe a été supprimé
6
-profile.flash.updated: Le profil a été mis à jour
7
-change_password.flash.success: Le mot de passe a été modifié
8
-registration.flash.user_created: L'utilisateur a été créé avec succès
9
-resetting.flash.success: Le mot de passe a été réinitialisé avec succès
3
+group.flash.updated: Le groupe a été mis à jour.
4
+group.flash.created: Le groupe a été créé.
5
+group.flash.deleted: Le groupe a été supprimé.
6
+profile.flash.updated: Le profil a été mis à jour.
7
+change_password.flash.success: Le mot de passe a été modifié.
8
+registration.flash.user_created: L'utilisateur a été créé avec succès.
9
+resetting.flash.success: Le mot de passe a été réinitialisé avec succès.
10 10
 
11 11
 # muzich
12 12
 group:
13 13
   create:
14
-    success:      Le groupe a été créé avec succés
15
-    failure:      Un erreur est survenue lors de la création du groupe
14
+    success:      Le groupe a été créé avec succés.
15
+    failure:      Un erreur est survenue lors de la création du groupe.
16 16
   update:
17
-    success:      La mise a jour a été un succés
18
-    failure:      Une erreur est survenue lors de la mise a jour du groupe
17
+    success:      La mise a jour a été un succés.
18
+    failure:      Une erreur est survenue lors de la mise a jour du groupe.
19 19
     
20 20
 element:
21 21
   add:
22
-    error:        Une erreur est survenus lors de l'ajout
22
+    error:        Une erreur est survenus lors de l'ajout.
23
+    
24
+user:
25
+  changeemail:
26
+    mail_send:     Un email a été envoyé a l'adresse communiqué pour confirmation.
27
+    token_invalid: Le lien pour mettre a jour votre email est périmé, veuillez relancer la procédure.
28
+    success:       Votre email a correctement été mis a jour.
29
+    wait:          Vous devez attendre avant de pouvoir faire une nouvelle demande de changement d'email.

+ 4 - 1
app/Resources/translations/validators.fr.yml Прегледај датотеку

@@ -20,4 +20,7 @@ error:
20 20
       notsame:           Vous avez saisie deux mot de passes différents.
21 21
   changepassword:
22 22
     new:
23
-      notsame:           Vous avez saisie deux nouveaux mot de passes différents.
23
+      notsame:           Vous avez saisie deux nouveaux mot de passes différents.
24
+  changeemail:
25
+    email:
26
+      invalid:           L'email saisie n'est pas valide.

+ 41 - 0
src/Muzich/CoreBundle/Entity/User.php Прегледај датотеку

@@ -36,6 +36,17 @@ class User extends BaseUser
36 36
   protected $slug;
37 37
   
38 38
   /**
39
+   * @ORM\Column(type="text", nullable=true)
40
+   * @ORM\Column(length=256)
41
+   */
42
+  protected $email_requested;
43
+  
44
+ /**
45
+  * @ORM\Column(type="integer", nullable=true)
46
+  */
47
+  protected $email_requested_datetime;
48
+  
49
+  /**
39 50
    * Cet attribut contient les enregistrements UsersTagsFavorites lié 
40 51
    * a cet utilisateur dans le cadre des Tags Favoris.
41 52
    * 
@@ -288,6 +299,16 @@ class User extends BaseUser
288 299
     $this->slug = $slug;
289 300
   }
290 301
   
302
+  public function getEmailRequested()
303
+  {
304
+    return $this->email_requested;
305
+  }
306
+  
307
+  public function setEmailRequested($email_requested)
308
+  {
309
+    $this->email_requested = $email_requested;
310
+  }
311
+  
291 312
   /*
292 313
    * 
293 314
    * 
@@ -450,5 +471,25 @@ class User extends BaseUser
450 471
     }
451 472
     return $max;
452 473
   }
474
+
475
+  /**
476
+   * Set email_requested_datetime
477
+   *
478
+   * @param integer $emailRequestedDatetime
479
+   */
480
+  public function setEmailRequestedDatetime($emailRequestedDatetime)
481
+  {
482
+    $this->email_requested_datetime = $emailRequestedDatetime;
483
+  }
484
+
485
+  /**
486
+   * Get email_requested_datetime
487
+   *
488
+   * @return integer 
489
+   */
490
+  public function getEmailRequestedDatetime()
491
+  {
492
+    return $this->email_requested_datetime;
493
+  }
453 494
   
454 495
 }

+ 145 - 13
src/Muzich/UserBundle/Controller/UserController.php Прегледај датотеку

@@ -8,9 +8,37 @@ use Symfony\Component\HttpFoundation\RedirectResponse;
8 8
 use Symfony\Component\Security\Core\Exception\AccessDeniedException;
9 9
 use FOS\UserBundle\Model\UserInterface;
10 10
 use Muzich\CoreBundle\Form\Tag\TagFavoritesForm;
11
+use Symfony\Component\Validator\Constraints\Email;
12
+use Symfony\Component\Validator\Constraints\Collection;
11 13
 
12 14
 class UserController extends Controller
13 15
 {
16
+  
17
+  protected function getChangeEmailForm()
18
+  {
19
+    $collectionConstraint = new Collection(array(
20
+      'email' => new Email(array('message' => 'error.changeemail.email.invalid')),
21
+    ));
22
+    
23
+    return $this->createFormBuilder(null, array(
24
+      'validation_constraint' => $collectionConstraint,
25
+    ))
26
+      ->add('email', 'text')
27
+      ->getForm()
28
+    ;
29
+  }
30
+  
31
+  protected function getTagsFavoritesForm($user)
32
+  {
33
+    return $this->createForm(
34
+      new TagFavoritesForm(), 
35
+      array('tags' => $this->getDoctrine()->getRepository('MuzichCoreBundle:User')
36
+        ->getTagIdsFavorites($user->getId())
37
+      ),
38
+      array('tags' => $this->getTagsArray())
39
+    );
40
+  }
41
+  
14 42
   /**
15 43
    * Page de configuration de son compte
16 44
    *
@@ -19,22 +47,16 @@ class UserController extends Controller
19 47
   public function accountAction()
20 48
   {
21 49
     $user = $this->getUser();
22
-
23 50
     $form_password = $this->container->get('fos_user.change_password.form');
51
+    $form_tags_favorites = $this->getTagsFavoritesForm($user);
52
+    $change_email_form = $this->getChangeEmailForm();
24 53
     
25
-    $form_tags_favorites = $this->createForm(
26
-      new TagFavoritesForm(), 
27
-      array('tags' => $this->getDoctrine()->getRepository('MuzichCoreBundle:User')
28
-        ->getTagIdsFavorites($user->getId())
29
-      ),
30
-      array('tags' => $this->getTagsArray())
54
+    return array(
55
+      'user'                => $user,
56
+      'form_password'       => $form_password->createView(),
57
+      'form_tags_favorites' => $form_tags_favorites->createView(),
58
+      'change_email_form'   => $change_email_form->createView()
31 59
     );
32
-
33
-      return array(
34
-        'user' => $user,
35
-        'form_password' => $form_password->createView(),
36
-        'form_tags_favorites' => $form_tags_favorites->createView()
37
-      );
38 60
   }
39 61
   
40 62
   /**
@@ -295,5 +317,115 @@ class UserController extends Controller
295 317
       return $this->redirect($this->generateUrl('my_account'));
296 318
     }
297 319
   }
320
+  
321
+  protected function checkChangeEmailFrequencies($user, $new_email)
322
+  {
323
+    $delay = $this->container->getParameter('changeemail_security_delay');
324
+    if (($last_request_datetime = $user->getEmailRequestedDatetime()))
325
+    {
326
+      if ((time() - $last_request_datetime) < $delay)
327
+      {
328
+        return false;
329
+      }
330
+    }
331
+    return true;
332
+  }
333
+  
334
+  
335
+  /**
336
+   * Procédure de demande de changement de mot de passe
337
+   */
338
+  public function changeEmailRequestAction()
339
+  {
340
+    $em = $this->getDoctrine()->getEntityManager();
341
+    $user = $this->getUser();
342
+    $request = $this->getRequest();
343
+    $change_email_form = $this->getChangeEmailForm();
344
+    
345
+    $change_email_form->bindRequest($request);
346
+    if ($change_email_form->isValid())
347
+    {
348
+      $data = $change_email_form->getData();
349
+      $email = $data['email'];
350
+      
351
+      if (!$this->checkChangeEmailFrequencies($user, $email))
352
+      {
353
+        $this->setFlash('error', 'user.changeemail.wait');
354
+        return new RedirectResponse($this->generateUrl('my_account'));
355
+      }
356
+      
357
+      // On renseigne en base l'email demandé
358
+      $user->setEmailRequested($email);
359
+      $user->setEmailRequestedDatetime(time());
360
+      $user->generateConfirmationToken();
361
+      $token = hash('sha256', $user->getConfirmationToken().$email);
362
+      $url = $this->get('router')->generate('change_email_confirm', array('token' => $token), true);
363
+      $rendered = $this->get('templating')->render('MuzichUserBundle:User:change_email_mail.txt.twig', array(
364
+          'user' => $user,
365
+          'confirmationUrl' => $url
366
+      ));
367
+      
368
+      //$this->sendEmailMessage($rendered, $this->parameters['from_email']['resetting'], $user->getEmail());
369
+      
370
+      // Render the email, use the first line as the subject, and the rest as the body
371
+      $renderedLines = explode("\n", trim($rendered));
372
+      $subject = $renderedLines[0];
373
+      $body = implode("\n", array_slice($renderedLines, 1));
374
+
375
+      $message = \Swift_Message::newInstance()
376
+        ->setSubject($subject)
377
+        ->setFrom('noreply@muzi.ch')
378
+        ->setTo($email)
379
+        ->setBody($body);
380
+
381
+      $mailer = $this->get('mailer');
382
+      $mailer->send($message);
383
+      
384
+      $this->setFlash('info', 'user.changeemail.mail_send');
385
+      $em->flush();
386
+    }
387
+    
388
+    // En cas d'échec
389
+    $form_password = $this->container->get('fos_user.change_password.form');
390
+    $form_tags_favorites = $this->getTagsFavoritesForm($user);
391
+    
392
+    return $this->container->get('templating')->renderResponse(
393
+      'MuzichUserBundle:User:account.html.twig',
394
+      array(
395
+        'user'                => $user,
396
+        'form_password'       => $form_password->createView(),
397
+        'form_tags_favorites' => $form_tags_favorites->createView(),
398
+        'change_email_form'   => $change_email_form->createView()
399
+      )
400
+    );
401
+  }
402
+  
403
+  
404
+  
405
+  /**
406
+   * Procédure de confirmation de la nouvelle adresse email.
407
+   */
408
+  public function changeEmailConfirmAction($token)
409
+  {
410
+    $em = $this->getDoctrine()->getEntityManager();
411
+    $um = $this->get('muzich_user_manager');
412
+    $user = $this->getUser();
413
+    $token_ = hash('sha256', $user->getConfirmationToken().($email = $user->getEmailRequested()));
414
+    
415
+    // Le token est-il valide
416
+    if ($token_ != $token)
417
+    {
418
+      $this->setFlash('error', 'user.changeemail.token_invalid');
419
+      return new RedirectResponse($this->generateUrl('my_account'));
420
+    }
421
+    
422
+    $user->setEmail($email);
423
+    $user->setEmailRequested(null);
424
+    $um->updateCanonicalFields($user);
425
+    $em->flush();
426
+    
427
+    $this->setFlash('success', 'user.changeemail.success');
428
+    return new RedirectResponse($this->generateUrl('my_account'));
429
+  }
298 430
     
299 431
 }

+ 10 - 1
src/Muzich/UserBundle/Resources/config/routing.yml Прегледај датотеку

@@ -19,4 +19,13 @@ start:
19 19
 update_tag_favorites:
20 20
   pattern: /account/update-tag-favorites/{redirect}
21 21
   defaults: { _controller: MuzichUserBundle:User:updateTagFavorites, redirect: home }
22
-    
22
+    
23
+change_email_request:
24
+  pattern: /account/change-email/request
25
+  defaults: { _controller: MuzichUserBundle:User:changeEmailRequest }
26
+  requirements:
27
+    _method:  POST
28
+    
29
+change_email_confirm:
30
+  pattern: /account/change-email/confirm/{token}
31
+  defaults: { _controller: MuzichUserBundle:User:changeEmailConfirm }

+ 9 - 0
src/Muzich/UserBundle/Resources/views/User/account.html.twig Прегледај датотеку

@@ -34,5 +34,14 @@
34 34
   </form>
35 35
   
36 36
   <h3>{{ 'my_account.change_email'|trans({}, 'userui') }}</h3>
37
+  
38
+  <form action="{{ path('change_email_request') }}" method="post" {{ form_enctype(change_email_form) }}>
39
+    
40
+    {% include "MuzichUserBundle:User:change_email_form.html.twig" with { 
41
+      'form': change_email_form
42
+    } %}
43
+
44
+    <input type="submit" />
45
+  </form>
37 46
     
38 47
 {% endblock %}

+ 9 - 0
src/Muzich/UserBundle/Resources/views/User/change_email_form.html.twig Прегледај датотеку

@@ -0,0 +1,9 @@
1
+{% form_theme form 'MuzichCoreBundle:Form:errors.html.twig' %}
2
+
3
+{{ form_errors(form) }}
4
+    
5
+  {{ form_errors(form.email) }}
6
+  {{ form_label(form.email) }}
7
+  {{ form_widget(form.email) }}
8
+
9
+{{ form_rest(form) }}

+ 4 - 0
src/Muzich/UserBundle/Resources/views/User/change_email_mail.txt.twig Прегледај датотеку

@@ -0,0 +1,4 @@
1
+{% autoescape false %}
2
+  Changement d'adresse email
3
+  {{ confirmationUrl }}
4
+{% endautoescape %}