diff --git a/VERSIONS_HOTLINE/94528 b/VERSIONS_HOTLINE/94528 new file mode 100644 index 0000000000000000000000000000000000000000..771ad561aabf5d0b146153942e73ee71e1d277c1 --- /dev/null +++ b/VERSIONS_HOTLINE/94528 @@ -0,0 +1 @@ + - ticket #94528 : Arte VOD : Maintenance du connecteur \ No newline at end of file diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php index 76f61f05955a6de96a2f6ab405f037ecb3658c3c..f011c795fa9525f6dd2dff344e70c695145c64ef 100644 --- a/library/Class/AdminVar.php +++ b/library/Class/AdminVar.php @@ -183,9 +183,9 @@ class Class_AdminVarLoader extends Storm_Model_Loader { 'CYBERLIBRIS_URL' => Class_AdminVar_Meta::newDefault($this->_('Adresse du serveur OAI Cyberlibris'))->bePrivate(), 'CYBERLIBRIS_ID' => Class_AdminVar_Meta::newDefault($this->_('Identifiant SSO Cyberlibris'))->bePrivate(), - 'ARTE_VOD_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Login ARTE VOD'))->bePrivate(), - 'ARTE_VOD_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé ARTE VOD'))->bePrivate(), - 'ARTE_VOD_SSO_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé ARTE VOD Single Sign-On'))->bePrivate(), + 'ARTE_VOD_LOGIN' => Class_AdminVar_Meta::newDefault($this->_('Login utilisé pour générer l\'adresse https://vod.mediatheque-numerique.com/mediatheques/[ARTE VOD LOGIN]'))->bePrivate(), + 'ARTE_VOD_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé de moissonnage (optionelle)'))->bePrivate(), + 'ARTE_VOD_SSO_KEY' => Class_AdminVar_Meta::newDefault($this->_('Clé de cryptage lors du SSO'))->bePrivate(), 'NUMERIQUE_PREMIUM_URL' => Class_AdminVar_Meta::newDefault('')->bePrivate(), @@ -784,9 +784,9 @@ class Class_AdminVarLoader extends Storm_Model_Loader { * @return bool */ public function isArteVODEnabled() { - return (('' != Class_AdminVar::get('ARTE_VOD_LOGIN')) - && ('' != Class_AdminVar::get('ARTE_VOD_KEY')) - && ('' != Class_AdminVar::get('ARTE_VOD_SSO_KEY'))); + return + '' != Class_AdminVar::get('ARTE_VOD_LOGIN') + && '' != Class_AdminVar::get('ARTE_VOD_SSO_KEY'); } diff --git a/library/Class/ArteVodLink.php b/library/Class/ArteVodLink.php index e367e7fe5ddacca759825268993c722cb4eb3255..a28a27d604825d2789a4fcaed4b88c1406e5caeb 100644 --- a/library/Class/ArteVodLink.php +++ b/library/Class/ArteVodLink.php @@ -22,14 +22,15 @@ class Class_ArteVodLink { use Trait_TimeSource; - protected $_album; - protected $_user; const AUTH_URL = 'https://portal.mediatheque-numerique.com/sso_login', API_URL = 'https://vod.mediatheque-numerique.com', API_SUFFIX = '/api/v1/', MEDIATHEQUES_SUFFIX = '/mediatheques/'; + protected $_album; + protected $_user; + public static function forAlbumAndUser($album, $user) { return (new self())->setAlbum($album)->setUser($user); diff --git a/library/Class/WebService/BibNumerique/ArteVOD.php b/library/Class/WebService/BibNumerique/ArteVOD.php index 51a9e987aca7c4029489250ac267ccc68d54b51a..3dfb9dd735295b70b5e05c4e937f1775269bbd4e 100644 --- a/library/Class/WebService/BibNumerique/ArteVOD.php +++ b/library/Class/WebService/BibNumerique/ArteVOD.php @@ -39,8 +39,12 @@ class Class_WebService_BibNumerique_ArteVOD extends Class_WebService_BibNumeriqu public function open_authenticated_url($url) { - return $this->getWebClient()->open_url($url, ['auth' => ['user' => Class_AdminVar::get('ARTE_VOD_LOGIN'), - 'password' => Class_AdminVar::get('ARTE_VOD_KEY')]]); + $client = $this->getWebClient(); + + return ($user = trim(Class_AdminVar::get('ARTE_VOD_LOGIN'))) && ($password = trim(Class_AdminVar::get('ARTE_VOD_KEY'))) + ? $client->open_url($url, ['auth' => ['user' => $user, + 'password' => $password]]) + : $client->open_url($url); } @@ -67,9 +71,9 @@ class Class_WebService_BibNumerique_ArteVOD extends Class_WebService_BibNumeriqu } while (!empty($ress_numerique)); $this->_deleteNonHarvested(); - } + protected function _deleteNonHarvested() { if (0 < count($this->getHarvestedIds())) Class_Album::getLoader() @@ -81,6 +85,7 @@ class Class_WebService_BibNumerique_ArteVOD extends Class_WebService_BibNumeriqu return Class_ArteVodLink::API_URL . Class_ArteVodLink::API_SUFFIX; } + public function isEnabled() { return Class_AdminVar::isArteVODEnabled(); } diff --git a/tests/library/Class/ArteVodLinkTest.php b/tests/library/Class/ArteVodLinkTest.php index 21be0b9554cc035810057807f84379f9e943de24..566fc8feaf5a8282fef7cedd0cd57ab57027aa99 100644 --- a/tests/library/Class/ArteVodLinkTest.php +++ b/tests/library/Class/ArteVodLinkTest.php @@ -22,10 +22,7 @@ class ArteVodLinkBaseUrlWithoutAlbumTest extends ModelTestCase { public function setUp() { - $this->fixture('Class_AdminVar', - ['id' => 'ARTE_VOD_LOGIN', - 'valeur' => 'miiop' - ]); + Class_AdminVar::set('ARTE_VOD_LOGIN', 'miiop'); $this->_arte_vod_link = new Class_ArteVodLink(); } @@ -40,8 +37,10 @@ class ArteVodLinkBaseUrlWithoutAlbumTest extends ModelTestCase { class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { - protected $_james_bond; - protected $_arte_vod_link; + protected + $_sso_key = 'secret', + $_james_bond, + $_arte_vod_link; public function setUp() { parent::setUp(); @@ -57,27 +56,27 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { ->setMail('jbond@007.fr') ->setDateFin('2023-09-12'); + Class_AdminVar::set('ARTE_VOD_SSO_KEY', $this->_sso_key); + $this->_arte_vod_link = Class_ArteVodLink::forAlbumAndUser($entre_les_murs, $this->_james_bond); } /** @test */ - public function baseUrlForBondShouldBeMediathequeNumeriqueDotCom() { + public function baseUrlForBondShouldBeMediathequeNumeriqueDotComFilmEntreLesMurs() { $this->assertEquals('http://www.mediatheque-numerique.com/films/entre-les-murs', $this->_arte_vod_link->baseUrl()); } /** @test */ - public function withKeySECRETUrlShouldContainsEncryptedDate() { - Class_AdminVar::newInstanceWithId('ARTE_VOD_SSO_KEY')->setValeur('GOGO'); - + public function withKeyUrlShouldContainsEncryptedDate() { $this->assertEquals('https://portal.mediatheque-numerique.com/sso_login' .'?sso_id=afi' .'&id=45' - .'&id_encrypted='. hash('sha256', '45GOGO') - .'&d='. hash('sha256', date('dmY').'GOGO') + .'&id_encrypted='. hash('sha256', '45' . $this->_sso_key) + .'&d='. hash('sha256', date('dmY') . $this->_sso_key) .'&prenom=James' .'&nom=Bond' .'&email='.urlencode('jbond@007.fr') @@ -90,8 +89,6 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { /** @test */ public function userWithoutNomEmailAndPrenomUrlSSOShouldNotContainsNomEmailPrenom() { - Class_AdminVar::newInstanceWithId('ARTE_VOD_SSO_KEY')->setValeur('secret'); - $this->_james_bond ->setPrenom('') ->setNom('') @@ -100,8 +97,8 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { $this->assertEquals('https://portal.mediatheque-numerique.com/sso_login' .'?sso_id=afi' .'&id=45' - .'&id_encrypted='. hash('sha256', '45secret') - .'&d='. hash('sha256', date('dmY').'secret') + .'&id_encrypted='. hash('sha256', '45' . $this->_sso_key) + .'&d='. hash('sha256', date('dmY'). $this->_sso_key) .'&datout=2023-09-12' .'&return_url=' . urlencode('http://www.mediatheque-numerique.com/films/entre-les-murs'), $this->_arte_vod_link->url()); @@ -110,8 +107,6 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { /** @test */ public function userInviteShouldHaveUserIdInSSOLink() { - Class_AdminVar::newInstanceWithId('ARTE_VOD_SSO_KEY')->setValeur('secret'); - $this->_james_bond ->setPrenom('') ->setNom('') @@ -123,19 +118,16 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { $this->assertEquals('https://portal.mediatheque-numerique.com/sso_login' .'?sso_id=afi' .'&id=19' - .'&id_encrypted='. hash('sha256', '19secret') - .'&d='. hash('sha256', date('dmY').'secret') + .'&id_encrypted='. hash('sha256', '19' . $this->_sso_key) + .'&d='. hash('sha256', date('dmY') . $this->_sso_key) .'&return_url=' . urlencode('http://www.mediatheque-numerique.com/films/entre-les-murs'), $this->_arte_vod_link->url()); } - /** @test */ public function userWithDateNaissanceShouldContainsDnaissInUrl() { - Class_AdminVar::newInstanceWithId('ARTE_VOD_SSO_KEY')->setValeur('secret'); - $this->_james_bond ->setPrenom('') ->setNom('') @@ -146,8 +138,8 @@ class ArteVodLinkWithUserAndAlbumTest extends ModelTestCase { $this->assertEquals('https://portal.mediatheque-numerique.com/sso_login' .'?sso_id=afi' .'&id=45' - .'&id_encrypted='. hash('sha256', '45secret') - .'&d='. hash('sha256', date('dmY').'secret') + .'&id_encrypted='. hash('sha256', '45' . $this->_sso_key) + .'&d='. hash('sha256', date('dmY') . $this->_sso_key) .'&dnaiss=1975-01-01' .'&return_url=' . urlencode('http://www.mediatheque-numerique.com/films/entre-les-murs'), diff --git a/tests/library/Class/WebService/ArteVODTest.php b/tests/library/Class/WebService/ArteVODTest.php index 2279151d955bc3a053e0a97872ad94199c6fa3b9..a2961322ca9701a5bbf30ecae5d1f0ff221b9d1a 100644 --- a/tests/library/Class/WebService/ArteVODTest.php +++ b/tests/library/Class/WebService/ArteVODTest.php @@ -24,7 +24,6 @@ require_once 'ArteVODFixtures.php'; abstract class ArteVODHarverstingTestCase extends ModelTestCase { protected $_web_client; - protected $_storm_default_to_volatile = true; public function setUp() { parent::setUp(); @@ -32,7 +31,6 @@ abstract class ArteVODHarverstingTestCase extends ModelTestCase { $this->fixture('Class_CosmoVar', ['id' => 'types_docs', 'liste' => "1:cd\r\n200:non identifié\r\n201:livres\r\n202:bd"]); - Class_AdminVar::set('ARTE_VOD', '1'); Class_AdminVar::set('ARTE_VOD_LOGIN', 'user'); Class_AdminVar::set('ARTE_VOD_KEY', 'pass'); @@ -217,3 +215,73 @@ class ArteVODHarverstingFourFilmsInTwoPages extends ArteVODHarverstingTestCase { $this->assertNotEquals(null, $this->edouard->addAuthor('Cibien, Laurent', '005')); } } + + + + +class ArteVODHarvestingWithoutPasswordTest extends ArteVODHarverstingTestCase { + public function setUp() { + parent::setUp(); + + Class_AdminVar::set('ARTE_VOD_KEY', ''); + + $this->_web_client + ->whenCalled('open_url') + ->with('https://vod.mediatheque-numerique.com/api/v1/films?page_nb=1') + ->answers(ArteVODFixtures::emptyPage()); + + $this->_web_client->beStrict(); + + (new Class_WebService_BibNumerique_ArteVOD())->harvest(); + } + + + /** @test */ + public function shouldHaveHarvestedWithoutAuth() { + $this->assertTrue($this->_web_client->methodHasBeenCalled('open_url')); + } +} + + + + +class ArteVODHarverstingEnablingTest extends ArteVODHarverstingTestCase { + /** @test */ + public function withAllShouldBeEnabled() { + Class_AdminVar::set('ARTE_VOD_LOGIN', 'user'); + Class_AdminVar::set('ARTE_VOD_KEY', 'pass'); + Class_AdminVar::set('ARTE_VOD_SSO_KEY', 'key'); + + $this->assertTrue((new Class_WebService_BibNumerique_ArteVOD())->isEnabled()); + } + + + /** @test */ + public function withoutLoginShouldNotBeEnabled() { + Class_AdminVar::set('ARTE_VOD_LOGIN', ''); + Class_AdminVar::set('ARTE_VOD_KEY', 'pass'); + Class_AdminVar::set('ARTE_VOD_SSO_KEY', 'key'); + + $this->assertFalse((new Class_WebService_BibNumerique_ArteVOD())->isEnabled()); + } + + + /** @test */ + public function withoutHarvestKeyShouldBeEnabled() { + Class_AdminVar::set('ARTE_VOD_LOGIN', 'user'); + Class_AdminVar::set('ARTE_VOD_KEY', ''); + Class_AdminVar::set('ARTE_VOD_SSO_KEY', 'key'); + + $this->assertTrue((new Class_WebService_BibNumerique_ArteVOD())->isEnabled()); + } + + + /** @test */ + public function withoutSSOKeyShouldNotBeEnabled() { + Class_AdminVar::set('ARTE_VOD_LOGIN', 'user'); + Class_AdminVar::set('ARTE_VOD_KEY', 'pass'); + Class_AdminVar::set('ARTE_VOD_SSO_KEY', ''); + + $this->assertFalse((new Class_WebService_BibNumerique_ArteVOD())->isEnabled()); + } +} \ No newline at end of file