From 9ffddb5ce18a332cc04ffc40d760671699c1025f Mon Sep 17 00:00:00 2001
From: Arthur Suzuki <arthur.suzuki@biblibre.com>
Date: Thu, 9 Jun 2022 16:35:16 +0200
Subject: [PATCH] hotline#145461 : Analytics : Exclude ModoBib Users from web
 analytics

---
 VERSIONS_HOTLINE/145461                 |  3 +
 library/Class/AdminVar.php              |  8 ++-
 library/Class/Cookies/Base.php          | 25 +++++--
 library/Class/Cookies/TarteAuCitron.php |  9 ++-
 tests/scenarios/matomo/MatomoTest.php   | 92 +++++++++++++++++++++++++
 5 files changed, 126 insertions(+), 11 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/145461

diff --git a/VERSIONS_HOTLINE/145461 b/VERSIONS_HOTLINE/145461
new file mode 100644
index 00000000000..70f1c9013ed
--- /dev/null
+++ b/VERSIONS_HOTLINE/145461
@@ -0,0 +1,3 @@
+ - correctif #145461 : Statistiques Matomo et Google Analytics : Vous pouvez exclure
+   	     	       les statistiques d'utilisation du portail des administrateurs
+		       via la variable en décochant la variable "ENABLE_ADMIN_STATS".
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 9614400cddd..4d33457501b 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -470,7 +470,8 @@ Pour vous désabonner de la lettre d\'information, merci de cliquer sur le lien
             'GOOGLE_TAG_MANAGER_ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant Google Tag Manager (sous la forme GTM-XXXXXX')),
             'GOOGLE_ANALYTICS_ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant Google Analytics (sous la forme UA-12345678-1)')),
             'GOOGLE_ANALYTICS_MOREJS' => Class_AdminVar_Meta::newDefault($this->_('Javascript additionnel pour google analytics',
-                                                                                  ['value'=> '']))];
+                                                                                  ['value'=> ''])),
+            'ENABLE_ADMIN_STATS' => Class_AdminVar_Meta::newOnOff($this->_('Activer les statistiques d\'utilisation du portail pour l\'activité des administrateurs'))->enable()];
   }
 
 
@@ -711,6 +712,11 @@ Pour vous désabonner de la lettre d\'information, merci de cliquer sur le lien
   }
 
 
+  public function areAdminStatsEnabled() : bool {
+    return Class_AdminVar::isModuleEnabled('ENABLE_ADMIN_STATS');
+  }
+
+
   /**
    * @return bool
    */
diff --git a/library/Class/Cookies/Base.php b/library/Class/Cookies/Base.php
index 832b55ca0c2..b1a926be029 100644
--- a/library/Class/Cookies/Base.php
+++ b/library/Class/Cookies/Base.php
@@ -22,7 +22,8 @@
 
 class Class_Cookies_Base {
   protected $_activated = [],
-    $_display_panel = false;
+    $_display_panel = false,
+    $_js_stat;
 
 
   public function initScripts() {
@@ -69,10 +70,24 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
 
 
   public function analytics() {
-    $js_stat = new Class_AdminVar_JsStat();
-    if ($js_stat->isGoogleAnalytics() && $id = Class_AdminVar::get('GOOGLE_ANALYTICS_ID'))
-      return $this->googleAnalytics($id,$js_stat->getGoogleAnalyticsMoreJs());
-    return Class_AdminVar::get('JS_STAT');
+    if ( ! $this->_isAnalyticsEnabledForCurrentUser())
+      return '';
+
+    $this->_js_stat = new Class_AdminVar_JsStat;
+
+    return($this->_js_stat->isGoogleAnalytics() && $this->_getGoogleAnalyticsId())
+      ? $this->googleAnalytics($this->_getGoogleAnalyticsId(),$this->_js_stat->getGoogleAnalyticsMoreJs())
+      : Class_AdminVar::get('JS_STAT');
+  }
+
+
+  protected function _isAnalyticsEnabledForCurrentUser() : bool {
+    return Class_AdminVar::areAdminStatsEnabled() || ! Class_Users::isCurrentUserCanAccesBackend();
+  }
+
+
+  protected function _getGoogleAnalyticsId(){
+    return Class_AdminVar::get('GOOGLE_ANALYTICS_ID');
   }
 
 
diff --git a/library/Class/Cookies/TarteAuCitron.php b/library/Class/Cookies/TarteAuCitron.php
index 448bb733394..40f847b08af 100644
--- a/library/Class/Cookies/TarteAuCitron.php
+++ b/library/Class/Cookies/TarteAuCitron.php
@@ -59,11 +59,10 @@ class Class_Cookies_TarteAuCitron extends Class_Cookies_Base {
   }
 
 
-  public function analytics() {
-    $js_stat = new Class_AdminVar_JsStat();
-    if ($js_stat->isGoogleAnalytics())
-      return $this->googleAnalytics($js_stat->getTrackerId(), $js_stat->getGoogleAnalyticsMoreJs());
-    return Class_AdminVar::get('JS_STAT');
+  protected function _getGoogleAnalyticsId() {
+    return ($this->_js_stat)
+      ? $this->_js_stat->getTrackerId()
+      : '';
   }
 
 
diff --git a/tests/scenarios/matomo/MatomoTest.php b/tests/scenarios/matomo/MatomoTest.php
index 2bbd61b8aa1..92d9e9457ff 100644
--- a/tests/scenarios/matomo/MatomoTest.php
+++ b/tests/scenarios/matomo/MatomoTest.php
@@ -261,6 +261,7 @@ class MatomoStatControllerMatomoActionTest extends Admin_AbstractControllerTestC
 
 
 
+
 /**
  * @see http://forge.afi-sa.fr/issues/52810
  */
@@ -458,3 +459,94 @@ _paq.push(['enableLinkTracking']);
     $this->assertEquals(1, $this->_matomotracker->methodCallCount('setCity'));
  }
 }
+
+
+
+
+abstract class MatomoStatWithUserModoBibModoTestCase extends Admin_AbstractControllerTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('JS_STAT','<script>JS_STAT_matomo</script>');
+    Class_Users::getIdentity()->beModoBib();
+  }
+}
+
+
+
+
+class MatomoStatWithAdminStatsEnabledAndUserModoBibTest extends MatomoStatWithUserModoBibModoTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('ENABLE_ADMIN_STATS', '1');
+  }
+
+
+  /** @test */
+  public function whenEnableAdminStatspageShouldContainsJSStatMatomo() {
+    $this->dispatch('/');
+    $this->assertXPathContentContains('//script', 'JS_STAT_matomo');
+  }
+
+
+  /** @test */
+  public function inIntonationTemplatePageShouldContainsJSStatMatomo() {
+    $this->_buildTemplateProfil(['id' => 2]);
+    $this->dispatch('/');
+    $this->assertXPathContentContains('//script', 'JS_STAT_matomo');
+  }
+}
+
+
+
+
+class MatomoStatWithAdminStatDisabledAndUserModoBibTest extends MatomoStatWithUserModoBibModoTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('ENABLE_ADMIN_STATS', '0');
+  }
+
+
+  /** @test */
+  public function pageShouldNotContainsJSStatMatomo() {
+    $this->dispatch('/');
+    $this->assertNotXPathContentContains('//script', 'JS_STAT_matomo');
+  }
+
+
+  /** @test */
+  public function whenEnableAdminStatsInIntonationpageShouldContainsJSStatMatomo() {
+    $this->_buildTemplateProfil(['id' => 2]);
+    $this->dispatch('/');
+    $this->assertNotXPathContentContains('//script', 'JS_STAT_matomo');
+  }
+}
+
+
+
+
+class MatomoStatShouldTrackAbonneSIGBActionTest extends Admin_AbstractControllerTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    Class_AdminVar::set('JS_STAT','<script>JS_STAT_matomo</script>');
+    Class_Users::getIdentity()->beAbonneSigb();
+   }
+
+
+  /** @test */
+  public function pageShouldContainsJSStatMatomo() {
+    $this->dispatch('/');
+    $this->assertXPathContentContains('//body/script', 'JS_STAT_matomo');
+  }
+
+
+  /** @test */
+  public function inIntonationTemplatePageShouldContainsJSStatMatomo() {
+    $this->_buildTemplateProfil(['id' => 2]);
+    $this->dispatch('/');
+    $this->assertXPathContentContains('//body/script', 'JS_STAT_matomo');
+  }
+}
\ No newline at end of file
-- 
GitLab