From 42c1d8a7237b5c27301735504f39244b0c0ad218 Mon Sep 17 00:00:00 2001
From: Laurent Laffont <llaffont@afi-sa.fr>
Date: Mon, 18 Feb 2019 17:17:30 +0100
Subject: [PATCH] hotline #87312 remove LeKiosk keys from source code

---
 VERSIONS_HOTLINE/87312                        |  2 +-
 library/digital_resources/Lekiosk/Config.php  | 12 +++--
 library/digital_resources/Lekiosk/Link.php    | 10 ++--
 library/digital_resources/Lekiosk/Service.php |  1 -
 .../Lekiosk/tests/LekioskTest.php             | 50 +++++++++++--------
 5 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/VERSIONS_HOTLINE/87312 b/VERSIONS_HOTLINE/87312
index 362232488fe..bd454c26f97 100644
--- a/VERSIONS_HOTLINE/87312
+++ b/VERSIONS_HOTLINE/87312
@@ -1 +1 @@
- - ticket #87312 : Des clés valides LeKiosk sont dans le code source!
\ No newline at end of file
+ - ticket #87312 : sécurisation de l'accès à la plateforme LeKiosk
\ No newline at end of file
diff --git a/library/digital_resources/Lekiosk/Config.php b/library/digital_resources/Lekiosk/Config.php
index 27120451fef..f7b40600424 100644
--- a/library/digital_resources/Lekiosk/Config.php
+++ b/library/digital_resources/Lekiosk/Config.php
@@ -36,16 +36,18 @@ class Lekiosk_Config extends Class_DigitalResource_Config {
             'MailUrl' => 'http://get.lekiosk.com/pro/?utm_source=LK&utm_campaign=B2B&utm_medium=footer',
 
             'AdminVars' => [
-                            'ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant fournit par LeKiosk'))->bePrivate(),
+                            'ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant fourni par LeKiosk'))->bePrivate(),
                             'SSO_MODE' => Class_AdminVar_Meta::newCombo($this->_('Type de SSO lekiosk.com'),
                                                                         ['options' => ['selectOptions' => ['label' => $this->_('Mode d\'authentification'),
                                                                                                            'multioptions' => ['' => 'Lien',
                                                                                                                               'CAS' => 'CAS']]]])->bePrivate(),
-                            'FTP_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Identifiant du compte FTP fournit par LeKiosk (déprécié)'))->bePrivate(),
-                            'FTP_PASSWORD' => Class_AdminVar_Meta::newDefault($this->_('Mot de passe du compte FTP fournit par LeKiosk (déprécié)'))->bePrivate(),
-                            'HTTP_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Identifiant du compte HTTP fournit par LeKiosk'))->bePrivate(),
-                            'HTTP_PASSWORD' => Class_AdminVar_Meta::newDefault($this->_('Mot de passe du compte HTTP fournit par LeKiosk'))->bePrivate(),
+                            'FTP_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Identifiant du compte FTP fourni par LeKiosk (déprécié)'))->bePrivate(),
+                            'FTP_PASSWORD' => Class_AdminVar_Meta::newDefault($this->_('Mot de passe du compte FTP fourni par LeKiosk (déprécié)'))->bePrivate(),
+                            'HTTP_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Identifiant du compte HTTP fourni par LeKiosk'))->bePrivate(),
+                            'HTTP_PASSWORD' => Class_AdminVar_Meta::newDefault($this->_('Mot de passe du compte HTTP fourni par LeKiosk'))->bePrivate(),
                             'HARVEST_URL' => Class_AdminVar_Meta::newDefault($this->_('URL de moissonage de la ressource LeKiosk'))->bePrivate(),
+                            'AES_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé de cryptage/AES des mails fourni par LeKiosk'))->bePrivate(),
+                            'SHA1_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé de cryptage/SHA1 des accès fourni par LeKiosk'))->bePrivate(),
             ],
 
             'SsoAction' => true,
diff --git a/library/digital_resources/Lekiosk/Link.php b/library/digital_resources/Lekiosk/Link.php
index 8fcce9be861..9414b08008c 100644
--- a/library/digital_resources/Lekiosk/Link.php
+++ b/library/digital_resources/Lekiosk/Link.php
@@ -23,8 +23,6 @@
 class Lekiosk_Link extends Lekiosk_LinkAbstract {
   const ROOT_URL = 'https://pros.lekiosk.com';
   const BASE_URL = '/login/accesshash?';
-  const AES_KEY = '56FGH4sTOV9ZXr4Q';
-  const SHA1_KEY = '897RDZQo789';
 
   protected $_mail;
   protected $_base_url;
@@ -48,7 +46,7 @@ class Lekiosk_Link extends Lekiosk_LinkAbstract {
 
 
   protected function accessHash() {
-    return sha1($this->baseUrl() . static::SHA1_KEY);
+    return sha1($this->baseUrl() . Lekiosk_Config::getInstance()->getAdminVar('SHA1_KEY'));
   }
 
 
@@ -64,7 +62,11 @@ class Lekiosk_Link extends Lekiosk_LinkAbstract {
 
 
   protected function cryptedMail() {
-    return bin2hex(openssl_encrypt($this->_mail, 'aes-128-cbc', static::AES_KEY, true, static::AES_KEY));
+    return bin2hex(openssl_encrypt($this->_mail,
+                                   'aes-128-cbc',
+                                   Lekiosk_Config::getInstance()->getAdminVar('AES_KEY'),
+                                   true,
+                                   Lekiosk_Config::getInstance()->getAdminVar('AES_KEY')));
   }
 }
 ?>
\ No newline at end of file
diff --git a/library/digital_resources/Lekiosk/Service.php b/library/digital_resources/Lekiosk/Service.php
index 24f8fe8db23..6411ddacd73 100644
--- a/library/digital_resources/Lekiosk/Service.php
+++ b/library/digital_resources/Lekiosk/Service.php
@@ -1,4 +1,3 @@
-
 <?php
 /**
  * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
diff --git a/library/digital_resources/Lekiosk/tests/LekioskTest.php b/library/digital_resources/Lekiosk/tests/LekioskTest.php
index e0ddb360028..7c727e0607e 100644
--- a/library/digital_resources/Lekiosk/tests/LekioskTest.php
+++ b/library/digital_resources/Lekiosk/tests/LekioskTest.php
@@ -15,7 +15,7 @@
  * 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
+ * along with BOKEH; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
@@ -23,9 +23,11 @@
 class LekioskAdminVars {
 
   public static function activate() {
-    Class_AdminVar::set('Lekiosk_ID', '29');
-    Class_AdminVar::set('Lekiosk_FTP_LOGIN', 'FOIX');
+    Class_AdminVar::set('Lekiosk_ID', '66');
+    Class_AdminVar::set('Lekiosk_FTP_LOGIN', 'POIS');
     Class_AdminVar::set('Lekiosk_FTP_PASSWORD', 'PWD');
+    Class_AdminVar::set('Lekiosk_AES_KEY', '12FA88sE3V5UKr3K');
+    Class_AdminVar::set('Lekiosk_SHA1_KEY', '976ABWQo231');
   }
 
 
@@ -33,6 +35,8 @@ class LekioskAdminVars {
     Class_AdminVar::set('Lekiosk_ID', '');
     Class_AdminVar::set('Lekiosk_FTP_LOGIN', '');
     Class_AdminVar::set('Lekiosk_FTP_PASSWORD', '');
+    Class_AdminVar::set('Lekiosk_AES_KEY', '');
+    Class_AdminVar::set('Lekiosk_SHA1_KEY', '');
   }
 }
 
@@ -61,7 +65,7 @@ abstract class LekioskLinkModeLinkTestCase extends ModelTestCase {
 class LekioskLinkModeLinkTest extends LekioskLinkModeLinkTestCase {
   /** @test */
   public function urlForMyemailAtLekioskDotComShouldContainsEncryptedEmail() {
-    $expected = 'https://pros.lekiosk.com/login/accesshash?email=1671f18f515f49271985280397c1c2bc48e1bfa31a3b638cb22e510e4953d65e&id=29&AccessHash=4eef094aacc80db2698f841214bba28f8b5d001a';
+    $expected = 'https://pros.lekiosk.com/login/accesshash?email=a9be7374efd20f652cc1206da2d721f58420bf24f5b6febd143643d402f0cf39&id=66&AccessHash=6750ec2389df54aff5ae952b7e03a521e3f2a5d5';
     $this->assertEquals(
                         $expected,
                         (new Lekiosk_Link('myemail@lekiosk.com'))->url()
@@ -71,7 +75,7 @@ class LekioskLinkModeLinkTest extends LekioskLinkModeLinkTestCase {
 
   /** @test */
   public function withoutMailShouldBeNotContainsEmailKey() {
-    $expected = 'https://pros.lekiosk.com/login/accesshash?email=18ca3d8ad40255ce09d5d20debc1e069&id=29&AccessHash=69436bc8e1ea7a85b3a7c9d2d764077e3519a6c5';
+    $expected = 'https://pros.lekiosk.com/login/accesshash?email=a0dc2568ae735ff737ffc8b9bf2e4fb8&id=66&AccessHash=92a485f29b5000e908fef0815c00487b1aa759a1';
     $this->assertEquals($expected, (new Lekiosk_Link(''))->url());
   }
 
@@ -79,7 +83,7 @@ class LekioskLinkModeLinkTest extends LekioskLinkModeLinkTestCase {
   /** @test */
   public function withEmptyUserMailShouldGetSiteOrProfileMail() {
     Class_Profil::find(1)->setMailSite('toto@example.com');
-    $expected = 'https://pros.lekiosk.com/login/accesshash?email=76903fe54055ab757db99c2370d89970e25c5b33b5a69cafc108c0031685af88&id=29&AccessHash=5db96ac3eb21187f2a7622ebbfa255321c7f32c1';
+    $expected = 'https://pros.lekiosk.com/login/accesshash?email=bd612092eb8f12afc609f161d641ba9a4ac6b6e45bfae616f4994f9205f50a7d&id=66&AccessHash=4c09021c872852de07b4e5e89a9fc1659a3c293c';
     $this->assertEquals($expected, (new Lekiosk_Link(''))->url());
   }
 }
@@ -104,7 +108,7 @@ class LekioskLinkModeSSOTest extends LekioskLinkModeLinkTestCase {
   public function linkShouldBeCasUrlWithLekioskId() {
     $url = 'https://apipros.lekiosk.com/login/cas?'
       .'cas_fournisseur=' . urlencode(Class_Url::rootUrl() . BASE_URL . '/cas-server-v10')
-      .'&id=29'
+      .'&id=66'
       .'&returnUrl=';
 
     $this->assertEquals($url,
@@ -259,7 +263,7 @@ abstract class LekioskServiceTestCase extends AbstractControllerTestCase {
 
     $file_system = $this->mock()
                         ->whenCalled('file_get_contents')
-                        ->with('ftp://FOIX:PWD@ftp.lekiosk.com/lekiosque_06022017.xml')
+                        ->with('ftp://POIS:PWD@ftp.lekiosk.com/lekiosque_06022017.xml')
                         ->answers($catalogue_xml);
 
     $http_client = $this->mock()
@@ -423,7 +427,7 @@ class LekioskRenderAlbumFromRecordTest extends LekioskServiceTestCase {
     $this->_dispatchAlbum();
     $url = 'https://apipros.lekiosk.com/login/cas?'
       .'cas_fournisseur=' . urlencode(Class_Url::absolute('/cas-server-v10'))
-      .'&id=29'
+      .'&id=66'
       .'&returnUrl=Le-10-Sport-National-z1962566.aspx';
 
     $this->assertXPath('//a[@href="' . $url . '"]', $this->_response->getBody());
@@ -435,9 +439,9 @@ class LekioskRenderAlbumFromRecordTest extends LekioskServiceTestCase {
     Class_AdminVar::set('Lekiosk_SSO_MODE', '');
     $this->_dispatchAlbum();
     $url = 'https://pros.lekiosk.com/login/accesshash?'
-      . 'email=18ca3d8ad40255ce09d5d20debc1e069'
-      . '&id=29'
-      . '&AccessHash=69436bc8e1ea7a85b3a7c9d2d764077e3519a6c5'
+      . 'email=a0dc2568ae735ff737ffc8b9bf2e4fb8'
+      . '&id=66'
+      . '&AccessHash=92a485f29b5000e908fef0815c00487b1aa759a1'
       . '&ReturnUrl=Le-10-Sport-National-z1962566.aspx';
     $this->assertXPath('//a[@href="' . $url . '"]', $this->_response->getBody());
   }
@@ -547,10 +551,12 @@ abstract class LekioskServiceHttpHarvestingTestCase extends AbstractControllerTe
   public function setUp() {
     parent::setUp();
 
-    Class_AdminVar::set('Lekiosk_ID', '29');
-    Class_AdminVar::set('Lekiosk_HTTP_LOGIN', 'FOIX');
+    Class_AdminVar::set('Lekiosk_ID', '66');
+    Class_AdminVar::set('Lekiosk_HTTP_LOGIN', 'POIS');
     Class_AdminVar::set('Lekiosk_HTTP_PASSWORD', 'PWD');
     Class_AdminVar::set('Lekiosk_HARVEST_URL', 'https://apipros.lekiosk.com');
+    Class_AdminVar::set('Lekiosk_AES_KEY', '12FA88sE3V5UKr3K');
+    Class_AdminVar::set('Lekiosk_SHA1_KEY', '976ABWQo231');
 
     $token_json = file_get_contents(__DIR__. '/token.json');
     $catalogue_xml = file_get_contents(__DIR__. '/catalogue_from_http.xml');
@@ -558,7 +564,7 @@ abstract class LekioskServiceHttpHarvestingTestCase extends AbstractControllerTe
     $http_client = $this->mock()
                         ->whenCalled('postRawData')
                         ->with('https://apipros.lekiosk.com/login',
-                               '{"username":"FOIX","userpwd":"PWD"}','application/json')
+                               '{"username":"POIS","userpwd":"PWD"}','application/json')
                         ->answers($token_json)
 
                         ->whenCalled('open_url')
@@ -592,7 +598,7 @@ class LekioskServiceHttpUpdateHarvestingTest extends LekioskServiceHttpHarvestin
     $http_client = $this->mock()
                         ->whenCalled('postRawData')
                         ->with('https://apipros.lekiosk.com/login',
-                               '{"username":"FOIX","userpwd":"PWD"}','application/json')
+                               '{"username":"POIS","userpwd":"PWD"}','application/json')
                         ->answers($token_json)
 
                         ->whenCalled('open_url')
@@ -698,7 +704,7 @@ class LekioskServiceHttpHarvestingNoticeAjaxTest extends LekioskServiceHttpHarve
     $this->_dispatchAlbum();
     $url = 'https://apipros.lekiosk.com/login/cas?'
       .'cas_fournisseur=' . urlencode(Class_Url::absolute('/cas-server-v10'))
-      .'&id=29'
+      .'&id=66'
       .'&returnUrl='. urlencode('/fr/pageproduct/851749/2052615');
 
     $this->assertXPath('//a[@href="' . $url . '"]', $this->_response->getBody());
@@ -710,9 +716,9 @@ class LekioskServiceHttpHarvestingNoticeAjaxTest extends LekioskServiceHttpHarve
     Class_AdminVar::set('Lekiosk_SSO_MODE', '');
     $this->_dispatchAlbum();
     $url = 'https://pros.lekiosk.com/login/accesshash?'
-      . 'email=18ca3d8ad40255ce09d5d20debc1e069'
-      . '&id=29'
-      . '&AccessHash=69436bc8e1ea7a85b3a7c9d2d764077e3519a6c5'
+      . 'email=a0dc2568ae735ff737ffc8b9bf2e4fb8'
+      . '&id=66'
+      . '&AccessHash=92a485f29b5000e908fef0815c00487b1aa759a1'
       . '&ReturnUrl='.urlencode('/fr/pageproduct/851749/2052615');
     $this->assertXPath('//a[@href="' . $url . '"]', $this->_response->getBody());
   }
@@ -728,11 +734,13 @@ class LekioskPluginTest extends Admin_AbstractControllerTestCase {
 
   public function setUp() {
     parent::setUp();
-    Class_AdminVar::set('Lekiosk_ID', '29');
+    Class_AdminVar::set('Lekiosk_ID', '66');
 
     Class_AdminVar::set('Lekiosk_HARVEST_URL', 'http://lekiosk.org/oai');
     Class_AdminVar::set('Lekiosk_HTTP_LOGIN', 'lekiosk');
     Class_AdminVar::set('Lekiosk_HTTP_PASSWORD', 'PWD+456');
+    Class_AdminVar::set('Lekiosk_AES_KEY', '12FA88sE3V5UKr3K');
+    Class_AdminVar::set('Lekiosk_SHA1_KEY', '976ABWQo231');
 
     $group = $this->fixture('Class_UserGroup',
                             ['id' => 1,
-- 
GitLab