forked from soutade/libgourou
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f60abf04d8 | |||
| 0d77cf55e1 | |||
| 86a79cc381 | |||
| 68bf982b6f | |||
| ef8c2644ca |
@@ -1,16 +1,16 @@
|
|||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
|
||||||
libgourou is a free implementation of Adobe's ADEPT protocol used to add DRM on ePub/PDF files. It overcome the lacks of Adobe support for Linux platforms.
|
libgourou is a free implementation of Adobe's ADEPT protocol used to add DRM on ePub/PDF files. It overcomes the lack of Adobe support for Linux platforms.
|
||||||
|
|
||||||
|
|
||||||
Architecture
|
Architecture
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Like RMSDK, libgourou has a client/server scheme. All platform specific functions (crypto, network...) has to be implemented in a client class (that derives from DRMProcessorClient) while server implements ADEPT protocol.
|
Like RMSDK, libgourou has a client/server scheme. All platform specific functions (crypto, network...) have to be implemented in a client class (that derives from DRMProcessorClient) while server implements ADEPT protocol.
|
||||||
A reference implementation using cURL, OpenSSL and libzip is provided (in _utils_ directory).
|
A reference implementation using cURL, OpenSSL and libzip is provided (in _utils_ directory).
|
||||||
|
|
||||||
Main fucntions to use from gourou::DRMProcessor are :
|
Main functions to use from gourou::DRMProcessor are:
|
||||||
|
|
||||||
* Get an ePub from an ACSM file : _fulfill()_ and _download()_
|
* Get an ePub from an ACSM file : _fulfill()_ and _download()_
|
||||||
* Create a new device : _createDRMProcessor()_
|
* Create a new device : _createDRMProcessor()_
|
||||||
@@ -23,11 +23,11 @@ You can import configuration from (at least) :
|
|||||||
* Kobo device : .adept/device.xml, .adept/devicesalt and .adept/activation.xml
|
* Kobo device : .adept/device.xml, .adept/devicesalt and .adept/activation.xml
|
||||||
* Bookeen device : .adobe-digital-editions/device.xml, root/devkey.bin and .adobe-digital-editions/activation.xml
|
* Bookeen device : .adobe-digital-editions/device.xml, root/devkey.bin and .adobe-digital-editions/activation.xml
|
||||||
|
|
||||||
Or create a new one. Be careful : there is a limited number of devices that can be created bye one account.
|
Or create a new one. Be careful: there is a limited number of devices that can be created by one account.
|
||||||
|
|
||||||
ePub are encrypted using a shared key: one account / multiple devices, so you can create and register a device into your computer and read downloaded (and encrypted) ePub file with your eReader configured using the same AdobeID account.
|
ePub are encrypted using a shared key: one account / multiple devices, so you can create and register a device into your computer and read downloaded (and encrypted) ePub file with your eReader configured using the same AdobeID account.
|
||||||
|
|
||||||
For those who wants to remove DRM without adept_remove, you can export your private key and import it within [Calibre](https://calibre-ebook.com/) an its DeDRM plugin.
|
For those who want to remove DRM without adept_remove, you can export your private key and import it within [Calibre](https://calibre-ebook.com/) an its DeDRM plugin.
|
||||||
|
|
||||||
|
|
||||||
Dependencies
|
Dependencies
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@
|
|||||||
#define ACS_SERVER "http://adeactivate.adobe.com/adept"
|
#define ACS_SERVER "http://adeactivate.adobe.com/adept"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LIBGOUROU_VERSION "0.8.3"
|
#define LIBGOUROU_VERSION "0.8.6"
|
||||||
|
|
||||||
namespace gourou
|
namespace gourou
|
||||||
{
|
{
|
||||||
|
|||||||
+5
-1
@@ -1317,6 +1317,7 @@ namespace gourou
|
|||||||
std::vector<uPDFParser::Object*> objects = parser.objects();
|
std::vector<uPDFParser::Object*> objects = parser.objects();
|
||||||
std::vector<uPDFParser::Object*>::iterator it;
|
std::vector<uPDFParser::Object*>::iterator it;
|
||||||
std::vector<uPDFParser::Object*>::reverse_iterator rIt;
|
std::vector<uPDFParser::Object*>::reverse_iterator rIt;
|
||||||
|
std::vector<uPDFParser::Object*> ebxObjects;
|
||||||
unsigned char decryptedKey[16];
|
unsigned char decryptedKey[16];
|
||||||
int ebxId;
|
int ebxId;
|
||||||
|
|
||||||
@@ -1375,7 +1376,7 @@ namespace gourou
|
|||||||
|
|
||||||
if (object->objectId() == ebxId)
|
if (object->objectId() == ebxId)
|
||||||
{
|
{
|
||||||
// object->deleteKey("Filter");
|
ebxObjects.push_back(object);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1485,6 +1486,9 @@ namespace gourou
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(it = ebxObjects.begin(); it != ebxObjects.end(); it++)
|
||||||
|
parser.removeObject(*it);
|
||||||
|
|
||||||
uPDFParser::Object& trailer = parser.getTrailer();
|
uPDFParser::Object& trailer = parser.getTrailer();
|
||||||
trailer.deleteKey("Encrypt");
|
trailer.deleteKey("Encrypt");
|
||||||
|
|
||||||
|
|||||||
@@ -298,14 +298,15 @@ std::string DRMProcessorClientImpl::sendHTTPRequest(const std::string& URL, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
curl_slist_free_all(list);
|
curl_slist_free_all(list);
|
||||||
|
|
||||||
|
long http_code = 400;
|
||||||
|
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||||
|
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
if (res != CURLE_OK)
|
if (res != CURLE_OK)
|
||||||
EXCEPTION(gourou::CLIENT_NETWORK_ERROR, "Error " << curl_easy_strerror(res));
|
EXCEPTION(gourou::CLIENT_NETWORK_ERROR, "Error " << curl_easy_strerror(res));
|
||||||
|
|
||||||
long http_code = 400;
|
|
||||||
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
|
|
||||||
|
|
||||||
if (http_code >= 400)
|
if (http_code >= 400)
|
||||||
EXCEPTION(gourou::CLIENT_HTTP_ERROR, "HTTP Error code " << http_code);
|
EXCEPTION(gourou::CLIENT_HTTP_ERROR, "HTTP Error code " << http_code);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user