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
This commit is contained in:
parent
1eebc88913
commit
878e4e7453
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Pugixml
|
||||
if [ ! -d lib/pugixml ] ; then
|
||||
git clone https://github.com/zeux/pugixml.git lib/pugixml
|
||||
pushd lib/pugixml
|
||||
git checkout latest
|
||||
popd
|
||||
fi
|
||||
|
||||
# Base64
|
||||
if [ ! -d lib/base64 ] ; then
|
||||
git clone https://gist.github.com/f0fd86b6c73063283afe550bc5d77594.git lib/base64
|
||||
fi
|
||||
|
|
|
@ -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");
|
||||
|
@ -383,18 +399,7 @@ namespace gourou
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user