From c388b93a52065328b7c2657b918c08fa99eb5bcd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?ANDRE=20s=C3=A9bastien?= <sandre@afi-sa.fr>
Date: Thu, 13 Feb 2025 11:58:30 +0100
Subject: [PATCH] hotline#212789 : redirect after login

---
 VERSIONS_HOTLINE/212789                       |   1 +
 .../Plugin/Manager/AbonneSessionActivity.php  |  42 +++----
 .../Helper/TagSessionActivityInscription.php  |   5 +-
 .../AccueilRedirectAfterInscriptionTest.php   | 117 ++++++++++++++++++
 4 files changed, 140 insertions(+), 25 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/212789
 create mode 100644 tests/scenarios/Activities/AccueilRedirectAfterInscriptionTest.php

diff --git a/VERSIONS_HOTLINE/212789 b/VERSIONS_HOTLINE/212789
new file mode 100644
index 00000000000..23a349463f3
--- /dev/null
+++ b/VERSIONS_HOTLINE/212789
@@ -0,0 +1 @@
+ - correctif #212789 : Boite activité : Un utilisateur non connecté est redirigé vers la popup d'activité après avoir rempli le formulaire de connexion.
\ No newline at end of file
diff --git a/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php b/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php
index 357f6fe541f..0712099e354 100644
--- a/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php
+++ b/library/ZendAfi/Controller/Plugin/Manager/AbonneSessionActivity.php
@@ -24,42 +24,36 @@
 class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity
   extends ZendAfi_Controller_Plugin_Manager_SessionActivityInscriptionBasic {
 
-  protected $view;
-
-  public function predDispatch(){
-    parent:preDispatch();
-    if ( ! $this->_checkLogged(['authenticate']))
-      return $this->_forwardToLogin($this->view->url(), $this->_getReferer()?? $this->view->url());
-    return null;
-  }
-
-
-  public function init() {
+  public function init()
+  {
     parent::init();
-    $this->_validators[] = '_sessionInscriptionNotClosed';
-    $this->_validators[] = '_sessionInscriptionOpened';
+
+    $this->_validators [] = '_sessionInscriptionNotClosed';
+    $this->_validators [] = '_sessionInscriptionOpened';
     $this->_user = Class_Users::getIdentity();
-    $this->_session_activity = Class_SessionActivity::find((int)$this->_getParam('id'));
+    $this->_session_activity = Class_SessionActivity::find((int) $this->_getParam('id'));
     $this->_messages = new ZendAfi_Controller_Plugin_Manager_AbonneSessionActivityMessages;
   }
 
 
-  public function inscrireSessionAction() {
+  public function inscrireSessionAction()
+  {
     $this->_initRedirect();
 
     if (Class_AdminVar::isActivitySessionQuotasEnabled())
       return parent::addAction();
 
     $this->_addWithoutQuotas();
-    $this->_redirectToUrlOrReferer($this->_redirect_default_url);
-    return null;
+
+    return $this->_redirectToUrlOrReferer($this->_redirect_default_url);
   }
 
 
-  public function desinscrireSessionAction() {
+  public function desinscrireSessionAction()
+  {
     $this->_initRedirect();
 
-    if (!$this->_session_activity) {
+    if ( ! $this->_session_activity) {
       $this->_helper->notify($this->_('Session non trouvée'));
 
       return $this->_redirectToUrlOrReferer($this->_redirect_default_url);
@@ -80,8 +74,8 @@ class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity
   }
 
 
-
-  public function editSessionAction() {
+  public function editSessionAction()
+  {
     $this->_initRedirect();
 
     $this->_controller->setScriptAction('inscrire-session');
@@ -101,7 +95,8 @@ class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity
   }
 
 
-  protected function _initRedirect() {
+  protected function _initRedirect()
+  {
     $this->_redirect_default_url = $this->_getParam('redirect_url', $this->_getReferer());
 
     if (strpos($this->_redirect_default_url, 'inscription-session') !== false)
@@ -119,7 +114,8 @@ class ZendAfi_Controller_Plugin_Manager_AbonneSessionActivity
   }
 
 
-  protected function _redirectInscrireSession() {
+  protected function _redirectInscrireSession()
+  {
     if ($this->_session_activity && $this->_session_activity->hasQueueAttendees())
       return $this->_redirect_default_url = Class_Url::absolute(['controller' => 'abonne',
                                                                  'action' => 'inscription-session',
diff --git a/library/ZendAfi/View/Helper/TagSessionActivityInscription.php b/library/ZendAfi/View/Helper/TagSessionActivityInscription.php
index 16f525cbddf..70198aabc29 100644
--- a/library/ZendAfi/View/Helper/TagSessionActivityInscription.php
+++ b/library/ZendAfi/View/Helper/TagSessionActivityInscription.php
@@ -59,11 +59,12 @@ class ZendAfi_View_Helper_TagSessionActivityInscription extends ZendAfi_View_Hel
   }
 
 
-  protected function _renderWithoutUser() {
+  protected function _renderWithoutUser(): string
+  {
     return $this->_session_activity->isSubscriableFor(null)
       ? $this->_tagAnchor($this->_url(['controller' => 'auth',
                                        'action' => 'popup-login'])
-                          . '?location=' . urlencode($this->_registerUrl()),
+                          . '?redirect=' . urlencode($this->_registerUrl()),
                           $this->_('S\'inscrire'),
                           ['data-popup' => 'true'])
       : $this->_('Inscription non permise');
diff --git a/tests/scenarios/Activities/AccueilRedirectAfterInscriptionTest.php b/tests/scenarios/Activities/AccueilRedirectAfterInscriptionTest.php
new file mode 100644
index 00000000000..24cfaa25eba
--- /dev/null
+++ b/tests/scenarios/Activities/AccueilRedirectAfterInscriptionTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Copyright (c) 2012-2025, 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 AccueilRedirectAfterInscriptionTest extends ViewHelperTestCase
+{
+
+  protected ZendAfi_View_Helper_Accueil_ActivitiesWidget $_helper;
+  protected Class_Users $_user;
+
+  public function setUp(): void
+  {
+    parent::setUp();
+
+    Class_AdminVar::set('CACHE_ACTIF', 0);
+    Class_AdminVar::set('ACTIVITY', 1);
+    Class_AdminVar::set('ACTIVITY_SESSION_QUOTAS', 1);
+    $time_source = new TimeSourceForTest('2024-01-01 10:00:00');
+    Class_Activity::setTimeSource($time_source);
+    Class_SessionActivity::setTimeSource($time_source);
+
+    $group = $this->fixture(Class_UserGroup::class,
+                            ['id' => 111,
+                             'protected' => false,
+                             'libelle' => 'Group',
+                             'group_type' => Class_UserGroup::TYPE_MANUAL,
+                             'rights' => [Class_UserGroup::RIGHT_SUIVRE_ACTIVITY],
+                             'filters' => json_encode(['search_role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB])]);
+
+    $this->_user = $this->fixture(Class_Users::class,
+                                  ['id' => 111,
+                                   'id_sigb'=> 1,
+                                   'idabon'=> '1234',
+                                   'nom' => 'name_user_abon',
+                                   'login' => 'login_user_abon',
+                                   'last_login' => '',
+                                   'password' => 'passloguserabon',
+                                   'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB,
+                                   'id_site' => 1]);
+
+    $this->_user->addUserGroup($group)->assertSave();
+
+    $activity = $this->fixture(Class_Activity::class,
+                               ['id' => 111,
+                                'libelle' => 'Activity numero 111',
+                                'visible' => true]);
+
+    $session_activity = $this->fixture(Class_SessionActivity::class,
+                                       ['id' => 111,
+                                        'activity' => $activity,
+                                        'date_debut' => '2024-01-01 08:00:00',
+                                        'date_limite_fin' => '2024-01-06 18:00:00',
+                                        'date_fin' => '2024-01-08 18:00:00',
+                                        'effectif_inscription_max' => 2,
+                                        'effectif_inscription_child_max' => 2,
+                                        'effectif_child_min' => 0,
+                                        'effectif_child_max' => 2,
+                                        'age_child_max' => 12]);
+
+    $activity->setSessions([$session_activity])
+             ->assertSave();
+
+    $this->_helper = new ZendAfi_View_Helper_Accueil_ActivitiesWidget('ACTIVITIES_WIDGET',
+                                                                      ['division' => 1,
+                                                                       'type_module' => 'ACTIVITIES_WIDGET',
+                                                                       'preferences' => ['selected_activities' => 111]]);
+    $this->_helper->setView($this->view);
+  }
+
+
+  public function tearDown(): void
+  {
+    Class_Activity::setTimeSource(null);
+    Class_SessionActivity::setTimeSource(null);
+    parent::tearDown();
+  }
+
+
+  /** @test */
+  public function withUserLoggedShouldNotRedirectTo()
+  {
+    ZendAfi_Auth::getInstance()->logUser($this->_user);
+    $html = $this->_helper->getBoite();
+    $this->assertNotXPath($html, '//a[contains(@href, "redirect")]');
+    $this->assertXPath($html, '//a[contains(@href, "abonne/inscrire-session/id/111")]');
+  }
+
+
+  /** @test */
+  public function withoutUserLoggedShouldRedirectTo()
+  {
+    ZendAfi_Auth::getInstance()->clearIdentity();
+    $html = $this->_helper->getBoite();
+    $this->assertXPath($html, '//a[contains(@href, "?redirect=")]');
+    $this->assertXPath($html, '//a[contains(@href, "'
+                       . urlencode('abonne/inscrire-session/id/111')
+                       . '")]');
+  }
+}
-- 
GitLab