瀏覽代碼

Evolution #582: Implémenter le mode nopass

Sevajol Bastien 11 年之前
父節點
當前提交
64aecf2c3c

+ 6 - 0
app/Resources/translations/flash.en.yml 查看文件

@@ -34,6 +34,12 @@ user:
34 34
   change_username:
35 35
     success:       Your username has been updated.
36 36
     failure:       An error occured.
37
+  confirm_email:
38
+    alreaydy:      Your email is already confirmed
39
+    sent:          Email sent on your email address for confirmation (check your SPAM to)
40
+    sent_recently: Confirmation email already sent recently
41
+    confirmed:     Email confirmed
42
+    failtoken:     Your confirmation query is too old, please re-ask confirmation
37 43
 
38 44
 presubscription:
39 45
   success:         An email has been sent for confirmation.

+ 6 - 0
app/Resources/translations/flash.fr.yml 查看文件

@@ -34,6 +34,12 @@ user:
34 34
   change_username:
35 35
     success:       Votre nom d'utilisateur a bien été modifié
36 36
     failure:       Une erreur s'est produite
37
+  confirm_email:
38
+    alreaydy:      Votre email est déjà confirmé
39
+    sent:          Un email a été envoyé sur votre adresse pour confirmation (pensez à vérifier votre boite SPAM)
40
+    sent_recently: Un email de confirmation a déjà été envoyé récemment (pensez à vérifier votre boite SPAM)
41
+    confirmed:     Votre email est maintenant confirmé
42
+    failtoken:     La demande de confirmation est trop ancienne, veuillez en demander une nouvelle
37 43
 
38 44
 presubscription:
39 45
   success:         Un email a été envoyé a votre adresse email pour confirmation (vérifiez aussi dans vos SPAM)

+ 16 - 0
app/Resources/translations/text.fr.yml 查看文件

@@ -80,6 +80,22 @@ mail:
80 80
                     Cordialement,
81 81
                     
82 82
                     L'équipe de Muzi.ch
83
+  confirm_email:
84
+    subject:        Muzi.ch: Confirmer votre email
85
+    text:           >
86
+                    Vous venez de vous inscrire sur http://muzi.ch:
87
+                    
88
+                    
89
+                    Si vous n'êtes pas à l'origine de cette inscription, ne tenez pas compte de cet email.
90
+                    
91
+                    Sinon, pour confirmer que vous êtes bien le propriétaire de cet email veuillez suivre ce lien : %url%
92
+                    
93
+                    Nous vous remercions pour votre intérêt.
94
+                    
95
+                    
96
+                    Cordialement,
97
+                    
98
+                    L'équipe de Muzi.ch
83 99
 
84 100
 help:
85 101
   element_add_url:

+ 2 - 0
app/Resources/translations/userui.en.yml 查看文件

@@ -44,6 +44,7 @@ title:
44 44
 my_account: 
45 45
   title:          Mon compte
46 46
   username:         Nom d'utilisateur
47
+  change_username:  Change
47 48
   email:            Adresse email
48 49
   favorite_tags:    Vos tags préférés
49 50
   change_password:  Changer mon mot de passe
@@ -73,6 +74,7 @@ my_account:
73 74
     submit:         Enregistrer mes préférences
74 75
     success:        Vos préférences ont bien été mises à jour
75 76
     error:          Une erreur est survenue lors de la mise à jour de vos préférences
77
+  send_email_confirm: Renvoyer l'email de confirmation
76 78
   
77 79
 connexion:
78 80
   password_lost:    Mot de passe perdu ?

+ 2 - 1
app/Resources/translations/userui.fr.yml 查看文件

@@ -45,7 +45,7 @@ title:
45 45
 my_account: 
46 46
   title:          Mon compte
47 47
   username:         Nom d'utilisateur
48
-  change_username:  modifier
48
+  change_username:  Modifier
49 49
   email:            Adresse email
50 50
   favorite_tags:    Vos tags préférés
51 51
   change_password:  Changer mon mot de passe
@@ -75,6 +75,7 @@ my_account:
75 75
     submit:         Enregistrer mes préférences
76 76
     success:        Vos préférences ont bien été mises à jour
77 77
     error:          Une erreur est survenue lors de la mise à jour de vos préférences
78
+  send_email_confirm: Renvoyer l'email de confirmation
78 79
 
79 80
 change_username:
80 81
   submit:           Changer

+ 7 - 7
app/config/config_dev.yml 查看文件

@@ -10,13 +10,13 @@ web_profiler:
10 10
     intercept_redirects: false
11 11
     
12 12
 swiftmailer:
13
-    transport:  smtp
14
-    username:   contact@muzi.ch
15
-    password:   ***REMOVED***
16
-    host:       mx.muzi.ch
17
-    port:       587
18
-    encryption: tls
19
-    auth_mode:  login
13
+    #transport:  smtp
14
+    #username:   contact@muzi.ch
15
+    #password:   ***REMOVED***
16
+    #host:       mx.muzi.ch
17
+    #port:       587
18
+    #encryption: tls
19
+    #auth_mode:  login
20 20
     delivery_address: sevajol.bastien@gmail.com
21 21
     
22 22
 monolog:

+ 31 - 0
src/Muzich/CoreBundle/Entity/User.php 查看文件

@@ -265,6 +265,17 @@ class User extends BaseUser
265 265
   private $username_updatable = false;
266 266
   
267 267
   /**
268
+   * @ORM\Column(type="boolean", nullable=false)
269
+   * @var type boolean
270
+   */
271
+  private $email_confirmed = false;
272
+  
273
+ /**
274
+  * @ORM\Column(type="integer")
275
+  */
276
+  protected $email_confirmation_sent_timestamp = 0;
277
+  
278
+  /**
268 279
    * 
269 280
    */
270 281
   public function __construct()
@@ -1119,4 +1130,24 @@ class User extends BaseUser
1119 1130
     return false;
1120 1131
   }
1121 1132
   
1133
+  public function isEmailConfirmed()
1134
+  {
1135
+    return ($this->email_confirmed)?true:false;
1136
+  }
1137
+  
1138
+  public function setEmailConfirmed($confirmed)
1139
+  {
1140
+    $this->email_confirmed = ($confirmed)?true:false;
1141
+  }
1142
+  
1143
+  public function setEmailConfirmationSentTimestamp($timestamp)
1144
+  {
1145
+    $this->email_confirmation_sent_timestamp = $timestamp;
1146
+  }
1147
+  
1148
+  public function getEmailConfirmationSentTimestamp()
1149
+  {
1150
+    return $this->email_confirmation_sent_timestamp;
1151
+  }
1152
+  
1122 1153
 }

+ 40 - 0
src/Muzich/CoreBundle/lib/Controller.php 查看文件

@@ -566,4 +566,44 @@ class Controller extends BaseController
566 566
     return false;
567 567
   }
568 568
   
569
+  protected function sendEmailconfirmationEmail()
570
+  {
571
+    $user = $this->getUser();
572
+    
573
+    $tokenGenerator = $this->container->get('fos_user.util.token_generator');
574
+    $user->setConfirmationToken($tokenGenerator->generateToken());
575
+    $user->setEmailConfirmationSentTimestamp(time());
576
+    
577
+    $token = hash('sha256', $user->getConfirmationToken().$user->getEmail());
578
+    $url = $this->get('router')->generate('email_confirm', array('token' => $token), true);
579
+    $rendered = $this->get('templating')->render('MuzichUserBundle:User:confirm_email_email.txt.twig', array(
580
+      'confirmation_url' => $url
581
+    ));
582
+    
583
+    //$this->sendEmailMessage($rendered, $this->parameters['from_email']['resetting'], $user->getEmail());
584
+    
585
+    // Render the email, use the first line as the subject, and the rest as the body
586
+    $renderedLines = explode("\n", trim($rendered));
587
+    $subject = $renderedLines[0];
588
+    $body = implode("\n", array_slice($renderedLines, 1));
589
+
590
+    $message = \Swift_Message::newInstance()
591
+      ->setSubject($subject)
592
+      ->setFrom('contact@muzi.ch')
593
+      ->setTo($user->getEmail())
594
+      ->setBody($body);
595
+    $message->getHeaders()->addTextHeader('List-Unsubscribe', 'unsubscribe@muzi.ch');
596
+
597
+    $mailer = $this->get('mailer');
598
+    $mailer->send($message);
599
+    
600
+    $this->persist($user);
601
+    $this->flush();
602
+  }
603
+  
604
+  protected function getParameter($key)
605
+  {
606
+    return $this->container->getParameter($key);
607
+  }
608
+  
569 609
 }

+ 64 - 0
src/Muzich/UserBundle/Controller/UserController.php 查看文件

@@ -144,6 +144,7 @@ class UserController extends Controller
144 144
       $response = $this->getSuccessRegistrationResponse();
145 145
       $userManager->updateUser($user);
146 146
       $this->authenticateUser($user, $response);
147
+      $this->sendEmailconfirmationEmail();
147 148
       return $response;
148 149
     }
149 150
     
@@ -755,4 +756,67 @@ class UserController extends Controller
755 756
     ;
756 757
   }
757 758
   
759
+  public function sendEmailConfirmAction(Request $request)
760
+  {
761
+    $user = $this->getUser();
762
+    if ($user->isEmailConfirmed())
763
+    {
764
+      if ($request->isXmlHttpRequest())
765
+      {
766
+        return $this->jsonResponse(array(
767
+          'status' => 'success',
768
+          'result' => 'already_confirmed',
769
+          'message' => $this->trans('user.confirm_email.alreaydy', array(), 'flash')
770
+        ));
771
+      }
772
+      
773
+      $this->setFlash('success', 'user.confirm_email.alreaydy');
774
+      return new RedirectResponse($this->generateUrl('home'));
775
+    }
776
+    if ((time() - $user->getEmailConfirmationSentTimestamp() < $this->getParameter('email_confirmation_email_interval')))
777
+    {
778
+      if ($request->isXmlHttpRequest())
779
+      {
780
+        return $this->jsonResponse(array(
781
+          'status' => 'error',
782
+          'result' => 'already_sent_recently',
783
+          'message' => $this->trans('user.confirm_email.sent_recently', array(), 'flash')
784
+        ));
785
+      }
786
+      
787
+      $this->setFlash('success', 'user.confirm_email.sent_recently');
788
+      return new RedirectResponse($this->generateUrl('my_account'));
789
+    }
790
+    
791
+    $this->sendEmailconfirmationEmail();
792
+    
793
+    if ($request->isXmlHttpRequest())
794
+    {
795
+      return $this->jsonResponse(array(
796
+        'status' => 'success',
797
+        'result' => 'sent',
798
+        'message' => $this->trans('user.confirm_email.sent', array(), 'flash')
799
+      ));
800
+    }
801
+    
802
+    $this->setFlash('success', 'user.confirm_email.sent');
803
+    return new RedirectResponse($this->generateUrl('my_account'));
804
+  }
805
+  
806
+  public function confirmEmailAction(Request $request, $token)
807
+  {
808
+    $user = $this->getUser();
809
+    if ($token == hash('sha256', $user->getConfirmationToken().$user->getEmail()))
810
+    {
811
+      $user->setEmailConfirmed(true);
812
+      $this->persist($user);
813
+      $this->flush();
814
+      $this->setFlash('success', 'user.confirm_email.confirmed');
815
+      return new RedirectResponse($this->generateUrl('home'));
816
+    }
817
+    
818
+    $this->setFlash('success', 'user.confirm_email.failtoken');
819
+    return new RedirectResponse($this->generateUrl('my_account'));
820
+  }
821
+  
758 822
 }

+ 9 - 1
src/Muzich/UserBundle/Resources/config/routing.yml 查看文件

@@ -27,7 +27,15 @@ change_email_request:
27 27
 change_email_confirm:
28 28
   pattern: /account/change-email/confirm/{token}
29 29
   defaults: { _controller: MuzichUserBundle:User:changeEmailConfirm }
30
-  
30
+
31
+email_confirm:
32
+  pattern: /account/email/confirm/{token}
33
+  defaults: { _controller: MuzichUserBundle:User:confirmEmail }
34
+
35
+send_email_confirm:
36
+  pattern: /account/email/send-confirm
37
+  defaults: { _controller: MuzichUserBundle:User:sendEmailConfirm }
38
+
31 39
 update_address:
32 40
   pattern: /ajax/update-address/{token}
33 41
   defaults: { _controller: MuzichUserBundle:User:updateAddress }

+ 3 - 0
src/Muzich/UserBundle/Resources/views/User/account.html.twig 查看文件

@@ -18,6 +18,9 @@
18 18
       </li>
19 19
       <li>
20 20
         <b>{{ 'my_account.email'|trans({}, 'userui') }}</b>: {{ user.email }}
21
+        {% if not app.user.emailConfirmed %}
22
+          (<a href="{{ path('send_email_confirm') }}">{{ 'my_account.send_email_confirm'|trans({}, 'userui') }}</a>)
23
+        {% endif %}
21 24
       </li>
22 25
     </ul>
23 26
 

+ 9 - 0
src/Muzich/UserBundle/Resources/views/User/confirm_email_email.txt.twig 查看文件

@@ -0,0 +1,9 @@
1
+{% block subject %}{{ 'mail.confirm_email.subject'|trans({}, 'text') }}{% endblock %}
2
+
3
+{% block body_text %}
4
+  {% autoescape false %}
5
+    {{ 'mail.confirm_email.text'|trans({
6
+      '%url%'      : confirmation_url
7
+    }, 'text') }}
8
+  {% endautoescape %}
9
+{% endblock %}