diff --git a/VERSIONS_HOTLINE/136183 b/VERSIONS_HOTLINE/136183 new file mode 100644 index 0000000000000000000000000000000000000000..543c09c7222c20594b3908abadcfb4624d8d9051 --- /dev/null +++ b/VERSIONS_HOTLINE/136183 @@ -0,0 +1 @@ + - ticket #136183 : Lettres d'information : Correction d'une erreur dans le processus d'activation de l'inscription en tant qu'invité \ No newline at end of file diff --git a/application/modules/opac/controllers/AuthController.php b/application/modules/opac/controllers/AuthController.php index 969f37c1985f36598795367e8551cb3bd5d22bf2..74593608322a8702c42b412482e8e0e7fce3ed01 100644 --- a/application/modules/opac/controllers/AuthController.php +++ b/application/modules/opac/controllers/AuthController.php @@ -424,48 +424,46 @@ class AuthController extends ZendAfi_Controller_Action { public function newsletterRegisterAction() { - if('' != $this->_request->getParam('website')) + if ('' != $this->_getParam('website')) return $this->_redirect('/'); - if(!($id_newsletter = $this->_request->getParam('id'))) + if (!($id_newsletter = $this->_getParam('id'))) return $this->_redirect('/'); - if(!($newsletter = Class_Newsletter::find($id_newsletter))) + if (!($newsletter = Class_Newsletter::find($id_newsletter))) return $this->_redirect('/'); $this->view->newsletter = $newsletter; - if(null != Class_Users::getIdentity()) { + if (Class_Users::hasIdentity()) { $_SERVER['HTTP_REFERER'] = '/'; - return $this->_forward('subscribe-newsletter', 'abonne', 'opac', ['id' => $id_newsletter]); + return $this->_forward('subscribe-newsletter', 'abonne', 'opac', + ['id' => $newsletter->getId()]); } - $this->view->titre = $this->view->_('Inscription à la lettre d\'information: ') . $newsletter->getTitre(); + $this->view->titre = $this->_('Inscription à la lettre d\'information: %s', + $newsletter->getTitre()); $this->view->error = ''; - $this->view->form = new ZendAfi_Form_NewsletterRegister(); + $this->view->form = $form = new ZendAfi_Form_NewsletterRegister(); if (!$this->_request->isPost() - || !$this->view->form->isValid($this->_request->getPost())) + || !$form->isValid($this->_request->getPost())) return; - $email = $this->view->form->getValue('email'); + $email = $form->getValue('email'); if (!Class_Users::isEmailUnique($email)) { $this->view->error = $this->_('Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le compte qui utilise cet email.'); return; } - $user = Class_UsersNonValid::newWithMail($email); - - $link = new Class_Entity(['ActivationLink' => (new Class_Url)->absoluteUrl(['module' => 'opac', - 'controller' => 'auth', - 'action' => 'newsletter-active-user', - 'c' => $user->getCle(), - 'id' => $newsletter->getId()], - null, true)]); + $this->view->titre = $this->_('Demande d\'inscription à la lettre d\'information: %s', + $newsletter->getTitre()); - $this->view->titre = $this->_('Demande d\'inscription à la lettre d\'information: %s', $newsletter->getTitre()); + $user = Class_UsersNonValid::newWithMail($email); + $mail_result = Class_Newsletter_RegisterNotification::newActivate($newsletter, $user) + ->send(); - if (true !== (new Class_Newsletter_RegisterNotification_Activate($newsletter, $user, $link))->send()) { + if (true !== $mail_result) { $this->view->error = $this->_("Une erreur est survenue à l'envoi du courriel de confirmation d'inscription à la lettre %s à l'adresse %s. Veuillez réessayer. Si le problème persiste, veuillez contacter votre médiathèque.", $newsletter->getTitre(), $user->getMail()); @@ -474,26 +472,24 @@ class AuthController extends ZendAfi_Controller_Action { $this->view->message = $this->_("Une demande de confirmation d'inscription vous a été envoyée à l'adresse mail renseignée."); - $this->getHelper('ViewRenderer')->renderScript('auth/newsletter-message.phtml'); + $this->renderScript('auth/newsletter-message.phtml'); } protected function _newsletterRegistrationCompleteSendMail($newsletter, $user) { - $link = new Class_Entity(['UnsubscribeLink' => (new Class_Url)->absoluteUrl(['module' => 'opac', - 'controller' => 'newsletter', - 'action' => 'unsubscribe', - 'newsletter' => $newsletter->getId(), - 'user' => $user->getId(), - 'hash' => Class_Newsletter_Template::hashForUser($newsletter->getId(), - $user->getMail())],null, true)]); - - if (true !== (new Class_Newsletter_RegisterNotification_Welcome($newsletter, $user, $link))->send()) { - $this->view->error = $this->_("Le courriel de bienvenue à la lettre d'information '%s' n'a pas pu être envoyé à l'utilisateur %s.", $newsletter->getTitre(), $user->getLogin()); + $mail_result = Class_Newsletter_RegisterNotification::newWelcome($newsletter, $user) + ->send(); + + if (true !== $mail_result) { + $this->view->error = $this->_("Le courriel de bienvenue à la lettre d'information '%s' n'a pas pu être envoyé à l'utilisateur %s.", + $newsletter->getTitre(), + $user->getLogin()); return false; } - $this->view->message .= $this->_("<br/>Un courriel de bienvenue a été envoyée à l'adresse mail %s.", $user->getMail()); + $this->view->message .= $this->_("<br/>Un courriel de bienvenue a été envoyée à l'adresse mail %s.", + $user->getMail()); } @@ -527,22 +523,28 @@ class AuthController extends ZendAfi_Controller_Action { public function newsletterActiveUserAction() { - if(!($key = $this->_request->getParam('c')) || !($id_newsletter = $this->_request->getParam('id'))) + if (!($key = $this->_getParam('c')) + || !($id_newsletter = $this->_getParam('id'))) return $this->_redirect('/'); - if(!$this->view->newsletter = Class_Newsletter::find($id_newsletter)) + if (!$newsletter = Class_Newsletter::find($id_newsletter)) { + $this->notify($this->_('La newsletter est introuvable')); return $this->_redirect('/'); + } + + $this->view->newsletter = $newsletter; + $this->view->titre = $this->_('Confirmation d\'inscription à la newsletter: %s', + $newsletter->getTitre()); - $this->view->titre = $this->view->_("Confirmation d'inscription à la newsletter: ").$this->view->newsletter->getTitre(); ($this->view->user = Class_UsersNonValid::activateForNewsletterBy($key)) ? $this->newsletterRegisterUser($this->view->newsletter, $this->view->user) - : $this->view->message = $this->_("Inscription à la newsletter invalide."); + : $this->view->message = $this->_('Inscription à la newsletter invalide.'); } protected function newsletterRegisterUser($newsletter, $user) { if (!$user->addNewsletter($newsletter)) - return $this->view->message = $this->view->_('Erreur lors de l\inscription à la newsletter.'); + return $this->view->message = $this->_('Erreur lors de l\'inscription à la newsletter.'); $this->view->message = $this->view->_('Vous avez bien été abonné à la newsletter: %s avec l\'adresse suivante: %s', $newsletter->getTitre(), diff --git a/library/Class/Newsletter/RegisterNotification.php b/library/Class/Newsletter/RegisterNotification.php index affa9b16c5351aacdd3b5c3338e60b920c3f54ad..afaf907fa9c9920c62973800286743f72c2a3cf6 100644 --- a/library/Class/Newsletter/RegisterNotification.php +++ b/library/Class/Newsletter/RegisterNotification.php @@ -22,39 +22,51 @@ abstract class Class_Newsletter_RegisterNotification { protected $_newsletter, - $_user; + $_user, + $_link, + $_adminvar_name_for_subject, + $_adminvar_name_for_content; - public function __construct($newsletter, $user, $link) { + public static function newActivate($newsletter, $user) { + return new Class_Newsletter_RegisterNotificationActivate($newsletter, $user); + } + + + public static function newWelcome($newsletter, $user) { + return new Class_Newsletter_RegisterNotificationWelcome($newsletter, $user); + } + + + public function __construct($newsletter, $user) { $this->_newsletter = $newsletter; $this->_user = $user; - $this->_link = $link; } + public function send() { if ((!$newsletter = $this->_newsletter) || (!$user = $this->_user) - || !($link = $this->_link)) - return; + || !($link = $this->_link()) + || !$this->_adminvar_name_for_subject + || !$this->_adminvar_name_for_content) + return false; $mailer = new Class_MailHtml(); if (!$mailer->isMailValid($user->getMail())) - return; + return false; $data_source = ['newsletter' => $newsletter, 'user' => $user, 'link' => $link]; - $body = $this->_transform($this->_contentTemplate(), $data_source); - $subject = $this->_transform($this->_subjectTemplate(), $data_source); - $mail_admin = Class_Profil::getCurrentProfil()->getMailSiteOrPortail(); - - if ($mail_admin) - $mailer->setFrom($mail_admin); + $body = $this->_transform(Class_AdminVar::getValueOrDefault($this->_adminvar_name_for_content), + $data_source); + $subject = $this->_transform(Class_AdminVar::getValueOrDefault($this->_adminvar_name_for_subject), + $data_source); $mail = $mailer->prepare($user->getMail(), $subject, $body, true); - return $mailer->send($mail); } @@ -67,25 +79,57 @@ abstract class Class_Newsletter_RegisterNotification { } - /** @return string Class_ModeleFusion compatible text */ - abstract protected function _subjectTemplate(); + abstract protected function _link(); +} - /** @return string Class_ModeleFusion compatible text */ - abstract protected function _contentTemplate(); -} +class Class_Newsletter_RegisterNotificationWelcome extends Class_Newsletter_RegisterNotification { + protected + $_adminvar_name_for_subject = 'NEWSLETTER_TEMPLATE_REGISTER_WELCOME_SUBJECT', + $_adminvar_name_for_content = 'NEWSLETTER_TEMPLATE_REGISTER_WELCOME_HTML'; -class Class_Newsletter_RegisterNotification_Welcome extends Class_Newsletter_RegisterNotification { + protected function _link() { + if (!$this->_user || !$this->_newsletter) + return; - protected function _subjectTemplate(){ - return Class_AdminVar::getValueOrDefault('NEWSLETTER_TEMPLATE_REGISTER_WELCOME_SUBJECT'); - } + $hash = Class_Newsletter_Template::hashForUser($this->_newsletter->getId(), + $this->_user->getMail()); + $url = Class_Url::absolute(['module' => 'opac', + 'controller' => 'newsletter', + 'action' => 'unsubscribe', + 'newsletter' => $this->_newsletter->getId(), + 'user' => $this->_user->getId(), + 'hash' => $hash], + null, true); - protected function _contentTemplate(){ - return Class_AdminVar::getValueOrDefault('NEWSLETTER_TEMPLATE_REGISTER_WELCOME_HTML'); + return new Class_Entity(['UnsubscribeLink' => $url]); } } + + + + +class Class_Newsletter_RegisterNotificationActivate extends Class_Newsletter_RegisterNotification { + protected + $_adminvar_name_for_subject = 'NEWSLETTER_TEMPLATE_REGISTER_NEWUSER_SUBJECT', + $_adminvar_name_for_content = 'NEWSLETTER_TEMPLATE_REGISTER_NEWUSER_HTML'; + + + protected function _link() { + if (!$this->_user || !$this->_newsletter) + return; + + $url = Class_Url::absolute(['module' => 'opac', + 'controller' => 'auth', + 'action' => 'newsletter-active-user', + 'c' => $this->_user->getCle(), + 'id' => $this->_newsletter->getId()], + null, true); + + return new Class_Entity(['ActivationLink' => $url]); + } +} \ No newline at end of file diff --git a/library/Class/Newsletter/RegisterNotification/Activate.php b/library/Class/Newsletter/RegisterNotification/Activate.php deleted file mode 100644 index b5afeb7bb24309301e758c064c29bb8b410dd4eb..0000000000000000000000000000000000000000 --- a/library/Class/Newsletter/RegisterNotification/Activate.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * Copyright (c) 2012-2020, Agence Française Informatique (AFI). All rights reserved. - * - * BOKEH is free software; you can redistribute it and/or modify - * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by - * the Free Software Foundation. - * - * There are special exceptions to the terms and conditions of the AGPL as it - * is applied to this software (see README file). - * - * BOKEH is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE - * along with BOKEH; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -class Class_Newsletter_RegisterNotification_Activate extends Class_Newsletter_RegisterNotification { - - protected function _subjectTemplate(){ - return Class_AdminVar::getValueOrDefault('NEWSLETTER_TEMPLATE_REGISTER_NEWUSER_SUBJECT'); - } - - protected function _contentTemplate(){ - return Class_AdminVar::getValueOrDefault('NEWSLETTER_TEMPLATE_REGISTER_NEWUSER_HTML'); - } -} \ No newline at end of file diff --git a/library/Class/UsersNonValid.php b/library/Class/UsersNonValid.php index 87fe8cb6bb4c8cd87cc78d3b55ed0bea6a84786b..4f2ae2403f4d1d74105f6184af6a3e076886fba1 100644 --- a/library/Class/UsersNonValid.php +++ b/library/Class/UsersNonValid.php @@ -31,8 +31,9 @@ class UsersNonValidLoader extends Storm_Model_Loader { if (!$model = Class_UsersNonValid::findFirstBy(['cle' => $key])) return ''; - $user = $model->activateForNewsletter(); - Class_UsersNonValid::deleteBy(['mail' => $user->getMail()]); + if ($user = $model->activateForNewsletter()) + Class_UsersNonValid::deleteBy(['mail' => $user->getMail()]); + return $user; } @@ -154,13 +155,15 @@ class Class_UsersNonValid extends Storm_Model_Abstract { public function activateForNewsletter() { - return $this->activate() ? $this->_user: ''; + return $this->activate() + ? $this->_user + : ''; } public function getBibLibelle() { - return $this->hasBib() - ? $this->getBib()->getLibelle() + return ($bib = $this->getBib()) + ? $bib->getLibelle() : ''; } diff --git a/tests/application/modules/opac/controllers/AuthControllerTest.php b/tests/application/modules/opac/controllers/AuthControllerTest.php index fe36e939f0ce082f90d46cd0ab2dff4740c11626..d76cc2622a1467913f24bf4039a00083c10b3e0a 100644 --- a/tests/application/modules/opac/controllers/AuthControllerTest.php +++ b/tests/application/modules/opac/controllers/AuthControllerTest.php @@ -2281,11 +2281,8 @@ class AuthControllerPostRegisterNewsletterDailyNewsWithBadMailTest extends AuthC -class AuthControllerNewsletterActiveUserWithWrongParamsTest extends AuthControllerNoBodyLoggedTestCase { - public function setUp() { - parent::setUp(); - } - +class AuthControllerNewsletterActiveUserWithWrongParamsTest + extends AuthControllerNoBodyLoggedTestCase { /** @test */ public function noParamsShouldRedirectToIndex() {