From 878e4e7453e44a44bd7e83bf3f9e537fd1765be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Fri, 16 Jul 2021 20:38:32 +0200 Subject: [PATCH] ACSM data mut be unescaped before parsing Add a copy constructor to Exception Start an authentication when E_ADEPT_DISTRIBUTOR_AUTH error is received during fulfill Don't download external libraries if it already exists --- include/libgourou.h | 1 + include/libgourou_common.h | 8 +++++ scripts/setup.sh | 14 +++++---- src/libgourou.cpp | 60 ++++++++++++++++++++++++++++---------- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/include/libgourou.h b/include/libgourou.h index fc8164c..5473e67 100644 --- a/include/libgourou.h +++ b/include/libgourou.h @@ -188,6 +188,7 @@ namespace gourou void addNonce(pugi::xml_node& root); void buildAuthRequest(pugi::xml_document& authReq); void buildInitLicenseServiceRequest(pugi::xml_document& initLicReq, std::string operatorURL); + void doOperatorAuth(std::string operatorURL); void operatorAuth(std::string operatorURL); void buildFulfillRequest(pugi::xml_document& acsmDoc, pugi::xml_document& fulfillReq); void buildActivateReq(pugi::xml_document& activateReq); diff --git a/include/libgourou_common.h b/include/libgourou_common.h index c9fa486..d23ce9e 100644 --- a/include/libgourou_common.h +++ b/include/libgourou_common.h @@ -129,6 +129,14 @@ namespace gourou fullmessage = strdup(msg.str().c_str()); } + Exception(const Exception& other) + { + this->code = other.code; + this->line = line; + this->file = file; + this->fullmessage = strdup(other.fullmessage); + } + ~Exception() { free(fullmessage); diff --git a/scripts/setup.sh b/scripts/setup.sh index 3a0896d..a53779d 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -1,10 +1,14 @@ #!/bin/bash # Pugixml -git clone https://github.com/zeux/pugixml.git lib/pugixml -pushd lib/pugixml -git checkout latest -popd +if [ ! -d lib/pugixml ] ; then + git clone https://github.com/zeux/pugixml.git lib/pugixml + pushd lib/pugixml + git checkout latest + popd +fi # Base64 -git clone https://gist.github.com/f0fd86b6c73063283afe550bc5d77594.git lib/base64 +if [ ! -d lib/base64 ] ; then + git clone https://gist.github.com/f0fd86b6c73063283afe550bc5d77594.git lib/base64 +fi diff --git a/src/libgourou.cpp b/src/libgourou.cpp index ceb9c6d..226cdf6 100644 --- a/src/libgourou.cpp +++ b/src/libgourou.cpp @@ -368,6 +368,22 @@ namespace gourou appendTextElem(root, "adept:signature", signature); } + void DRMProcessor::doOperatorAuth(std::string operatorURL) + { + pugi::xml_document authReq; + buildAuthRequest(authReq); + std::string authURL = operatorURL; + unsigned int fulfillPos = authURL.rfind("Fulfill"); + if (fulfillPos == (authURL.size() - (sizeof("Fulfill")-1))) + authURL = authURL.substr(0, fulfillPos-1); + ByteArray replyData = sendRequest(authReq, authURL + "/Auth"); + + pugi::xml_document initLicReq; + std::string activationURL = user->getProperty("//adept:activationURL"); + buildInitLicenseServiceRequest(initLicReq, authURL); + sendRequest(initLicReq, activationURL + "/InitLicenseService"); + } + void DRMProcessor::operatorAuth(std::string operatorURL) { pugi::xpath_node_set operatorList = user->getProperties("//adept:operatorURL"); @@ -382,20 +398,9 @@ namespace gourou return; } } - - pugi::xml_document authReq; - buildAuthRequest(authReq); - std::string authURL = operatorURL; - int fulfillPos = authURL.rfind("Fulfill"); - if (fulfillPos == ((int)authURL.size() - 7)) - authURL = authURL.substr(0, fulfillPos-1); - ByteArray replyData = sendRequest(authReq, authURL + "/Auth"); - - pugi::xml_document initLicReq; - std::string activationURL = user->getProperty("//adept:activationURL"); - buildInitLicenseServiceRequest(initLicReq, authURL); - sendRequest(initLicReq, activationURL + "/InitLicenseService"); - + + doOperatorAuth(operatorURL); + // Add new operatorURL to list pugi::xml_document activationDoc; user->readActivation(activationDoc); @@ -455,7 +460,7 @@ namespace gourou pugi::xml_document acsmDoc; - if (!acsmDoc.load_file(ACSMFile.c_str(), pugi::parse_ws_pcdata_single)) + if (!acsmDoc.load_file(ACSMFile.c_str(), pugi::parse_ws_pcdata_single|pugi::parse_escapes)) EXCEPTION(FF_INVALID_ACSM_FILE, "Invalid ACSM file " << ACSMFile); GOUROU_LOG(INFO, "Fulfill " << ACSMFile); @@ -494,7 +499,30 @@ namespace gourou operatorAuth(operatorURL); - ByteArray replyData = sendRequest(fulfillReq, operatorURL); + ByteArray replyData; + + try + { + replyData = sendRequest(fulfillReq, operatorURL); + } + catch (gourou::Exception& e) + { + /* + Operator requires authentication even if it's already in + our operator list + */ + std::string errorMsg(e.what()); + if (e.getErrorCode() == GOUROU_ADEPT_ERROR && + errorMsg.find("E_ADEPT_DISTRIBUTOR_AUTH") != std::string::npos) + { + doOperatorAuth(operatorURL); + replyData = sendRequest(fulfillReq, operatorURL); + } + else + { + throw e; + } + } pugi::xml_document fulfillReply;