浏览代码

Evolution #582: Implémenter le mode nopass

Sevajol Bastien 11 年前
父节点
当前提交
64aecf2c3c

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

34
   change_username:
34
   change_username:
35
     success:       Your username has been updated.
35
     success:       Your username has been updated.
36
     failure:       An error occured.
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
 presubscription:
44
 presubscription:
39
   success:         An email has been sent for confirmation.
45
   success:         An email has been sent for confirmation.

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

34
   change_username:
34
   change_username:
35
     success:       Votre nom d'utilisateur a bien été modifié
35
     success:       Votre nom d'utilisateur a bien été modifié
36
     failure:       Une erreur s'est produite
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
 presubscription:
44
 presubscription:
39
   success:         Un email a été envoyé a votre adresse email pour confirmation (vérifiez aussi dans vos SPAM)
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
                     Cordialement,
80
                     Cordialement,
81
                     
81
                     
82
                     L'équipe de Muzi.ch
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
 help:
100
 help:
85
   element_add_url:
101
   element_add_url:

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

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

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

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

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

10
     intercept_redirects: false
10
     intercept_redirects: false
11
     
11
     
12
 swiftmailer:
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
     delivery_address: sevajol.bastien@gmail.com
20
     delivery_address: sevajol.bastien@gmail.com
21
     
21
     
22
 monolog:
22
 monolog:

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

265
   private $username_updatable = false;
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
   public function __construct()
281
   public function __construct()
1119
     return false;
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
     return false;
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
       $response = $this->getSuccessRegistrationResponse();
144
       $response = $this->getSuccessRegistrationResponse();
145
       $userManager->updateUser($user);
145
       $userManager->updateUser($user);
146
       $this->authenticateUser($user, $response);
146
       $this->authenticateUser($user, $response);
147
+      $this->sendEmailconfirmationEmail();
147
       return $response;
148
       return $response;
148
     }
149
     }
149
     
150
     
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
 change_email_confirm:
27
 change_email_confirm:
28
   pattern: /account/change-email/confirm/{token}
28
   pattern: /account/change-email/confirm/{token}
29
   defaults: { _controller: MuzichUserBundle:User:changeEmailConfirm }
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
 update_address:
39
 update_address:
32
   pattern: /ajax/update-address/{token}
40
   pattern: /ajax/update-address/{token}
33
   defaults: { _controller: MuzichUserBundle:User:updateAddress }
41
   defaults: { _controller: MuzichUserBundle:User:updateAddress }

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

18
       </li>
18
       </li>
19
       <li>
19
       <li>
20
         <b>{{ 'my_account.email'|trans({}, 'userui') }}</b>: {{ user.email }}
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
       </li>
24
       </li>
22
     </ul>
25
     </ul>
23
 
26
 

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

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 %}