From ac7de5aa83499ff3420757dc552e86347f599763 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 22 Jan 2015 23:22:01 +0100 Subject: [DLC] Updated DLC decrypter --- module/plugins/container/DLC.py | 69 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 module/plugins/container/DLC.py (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py new file mode 100644 index 000000000..5af41ac94 --- /dev/null +++ b/module/plugins/container/DLC.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +import base64 +import re + +from Crypto.Cipher import AES +from xml.dom.minidom import parseString + +from module.plugins.Container import Container + + +class DLC(Container): + __name__ = "DLC" + __pattern__ = r'.*\.dlc$' + __version__ = "0.2" + __description__ = """DLC Container Decode Plugin""" + __author_name__ = ("RaNaN", "spoob", "mkaay", "Schnusch") + __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org", "mkaay@mkaay.de", "Schnusch@users.noreply.github.com") + + key = "cb99b5cbc24db398" + iv = "9bc24cb995cb8db3" + dlc_api_url = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=" + + def decrypt(self, pyfile): + infile = pyfile.url.replace("\n", "") + + dlc = open(infile, "r") + data = dlc.read().strip() + dlc.close() + if not data.endswith("=="): + if data.endswith("="): + data += "=" + else: + data += "==" + dlckey = data[-88:] + dlcdata = data[:-88] + dlcdata = base64.standard_b64decode(dlcdata) + rc = self.req.load(self.dlc_api_url + dlckey) + rc = re.search(r'(.+)', rc).group(1) + rc = base64.standard_b64decode(rc) + obj = AES.new(self.key, AES.MODE_CBC, self.iv) + dlckey = obj.decrypt(rc) + obj = AES.new(dlckey, AES.MODE_CBC, dlckey) + self.data = base64.standard_b64decode(obj.decrypt(dlcdata)) + for entry in self.getPackages(): + self.packages.append((entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name)) + + def createNewPackage(self): + return True + + def getPackages(self): + xml = parseString(self.data) + root = xml.documentElement + contentNode = root.getElementsByTagName("content")[0] + return self.parsePackages(contentNode) + + def parsePackages(self, startNode): + c = [] + for node in startNode.getElementsByTagName("package"): + c.append((base64.standard_b64decode(node.getAttribute("name")).decode("utf8", "replace"), self.parseLinks(node))) + + return c + + def parseLinks(self, startNode): + c = [] + for node in startNode.getElementsByTagName("file"): + c.append(base64.standard_b64decode(node.getElementsByTagName("url")[0].firstChild.data)) + + return c -- cgit v1.2.3 From 6022f5885243ef9589ab1296ff758f98a4002aa5 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 23 Jan 2015 00:50:06 +0100 Subject: [DLC] Cleanup --- module/plugins/container/DLC.py | 85 +++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 42 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index 5af41ac94..446e96221 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -1,69 +1,70 @@ # -*- coding: utf-8 -*- -import base64 +from __future__ import with_statement + import re +import xml +from base64 import standard_b64decode from Crypto.Cipher import AES -from xml.dom.minidom import parseString from module.plugins.Container import Container class DLC(Container): __name__ = "DLC" - __pattern__ = r'.*\.dlc$' - __version__ = "0.2" - __description__ = """DLC Container Decode Plugin""" - __author_name__ = ("RaNaN", "spoob", "mkaay", "Schnusch") - __author_mail__ = ("RaNaN@pyload.org", "spoob@pyload.org", "mkaay@mkaay.de", "Schnusch@users.noreply.github.com") + __version__ = "0.20" + __pattern__ = r'.+\.dlc$' + + __description__ = """DLC container decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("RaNaN", "RaNaN@pyload.org"), + ("spoob", "spoob@pyload.org"), + ("mkaay", "mkaay@mkaay.de"), + ("Schnusch", "Schnusch@users.noreply.github.com")] + + + def setup(self): + self.key = "cb99b5cbc24db398" + self.iv = "9bc24cb995cb8db3" + self.api_url = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=" - key = "cb99b5cbc24db398" - iv = "9bc24cb995cb8db3" - dlc_api_url = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=" def decrypt(self, pyfile): - infile = pyfile.url.replace("\n", "") + with open(pyfile.url.replace("\n", "")) as dlc: + data = dlc.read().strip() - dlc = open(infile, "r") - data = dlc.read().strip() - dlc.close() if not data.endswith("=="): - if data.endswith("="): - data += "=" - else: - data += "==" - dlckey = data[-88:] + data += "=" if data.endswith("=") else "==" + + dlckey = data[-88:] dlcdata = data[:-88] - dlcdata = base64.standard_b64decode(dlcdata) - rc = self.req.load(self.dlc_api_url + dlckey) + dlcdata = standard_b64decode(dlcdata) + + rc = self.req.load(self.api_url + dlckey) rc = re.search(r'(.+)', rc).group(1) - rc = base64.standard_b64decode(rc) - obj = AES.new(self.key, AES.MODE_CBC, self.iv) + rc = standard_b64decode(rc) + + obj = AES.new(self.key, AES.MODE_CBC, self.iv) dlckey = obj.decrypt(rc) - obj = AES.new(dlckey, AES.MODE_CBC, dlckey) - self.data = base64.standard_b64decode(obj.decrypt(dlcdata)) - for entry in self.getPackages(): - self.packages.append((entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name)) + obj = AES.new(dlckey, AES.MODE_CBC, dlckey) + + self.data = standard_b64decode(obj.decrypt(dlcdata)) + self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ + for entry in self.getPackages()] - def createNewPackage(self): - return True def getPackages(self): - xml = parseString(self.data) - root = xml.documentElement - contentNode = root.getElementsByTagName("content")[0] - return self.parsePackages(contentNode) + root = xml.dom.minidom.parseString(self.data).documentElement + content = root.getElementsByTagName("content")[0] + return self.parsePackages(content) + def parsePackages(self, startNode): - c = [] - for node in startNode.getElementsByTagName("package"): - c.append((base64.standard_b64decode(node.getAttribute("name")).decode("utf8", "replace"), self.parseLinks(node))) + return [(standard_b64decode(node.getAttribute("name")).decode("utf8", "replace"), self.parseLinks(node)) \ + for node in startNode.getElementsByTagName("package")] - return c def parseLinks(self, startNode): - c = [] - for node in startNode.getElementsByTagName("file"): - c.append(base64.standard_b64decode(node.getElementsByTagName("url")[0].firstChild.data)) - - return c + return [standard_b64decode(node.getElementsByTagName("url")[0].firstChild.data) \ + for node in startNode.getElementsByTagName("file")] -- cgit v1.2.3 From dd28d119cfed07388f687d05cd6479aa4850469f Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 25 Jan 2015 02:28:56 +0100 Subject: [DLC] Fix https://github.com/pyload/pyload/issues/1074 --- module/plugins/container/DLC.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index 446e96221..f3fd4b808 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -3,7 +3,7 @@ from __future__ import with_statement import re -import xml +import xml.dom.minidom from base64 import standard_b64decode from Crypto.Cipher import AES @@ -13,7 +13,7 @@ from module.plugins.Container import Container class DLC(Container): __name__ = "DLC" - __version__ = "0.20" + __version__ = "0.21" __pattern__ = r'.+\.dlc$' __description__ = """DLC container decrypter plugin""" @@ -55,7 +55,7 @@ class DLC(Container): def getPackages(self): - root = xml.dom.minidom.parseString(self.data).documentElement + root = xml.dom.minidom.parseString(self.data).documentElement content = root.getElementsByTagName("content")[0] return self.parsePackages(content) -- cgit v1.2.3 From 7a0c370482142b113ab70fa1bb1446223a707c62 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 27 Jan 2015 18:10:23 +0100 Subject: [DLC] Improve --- module/plugins/container/DLC.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index f3fd4b808..53349c5c7 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -9,11 +9,12 @@ from base64 import standard_b64decode from Crypto.Cipher import AES from module.plugins.Container import Container +from module.utils import decode class DLC(Container): __name__ = "DLC" - __version__ = "0.21" + __version__ = "0.22" __pattern__ = r'.+\.dlc$' __description__ = """DLC container decrypter plugin""" @@ -21,7 +22,8 @@ class DLC(Container): __authors__ = [("RaNaN", "RaNaN@pyload.org"), ("spoob", "spoob@pyload.org"), ("mkaay", "mkaay@mkaay.de"), - ("Schnusch", "Schnusch@users.noreply.github.com")] + ("Schnusch", "Schnusch@users.noreply.github.com"), + ("Walter Purcaro", "vuolter@gmail.com")] def setup(self): @@ -34,14 +36,13 @@ class DLC(Container): with open(pyfile.url.replace("\n", "")) as dlc: data = dlc.read().strip() - if not data.endswith("=="): - data += "=" if data.endswith("=") else "==" + data += '=' * (-len(data) % 4) dlckey = data[-88:] dlcdata = data[:-88] dlcdata = standard_b64decode(dlcdata) - rc = self.req.load(self.api_url + dlckey) + rc = self.load(self.api_url + dlckey) rc = re.search(r'(.+)', rc).group(1) rc = standard_b64decode(rc) @@ -61,7 +62,7 @@ class DLC(Container): def parsePackages(self, startNode): - return [(standard_b64decode(node.getAttribute("name")).decode("utf8", "replace"), self.parseLinks(node)) \ + return [(standard_b64decode(decode(node.getAttribute("name"))), self.parseLinks(node)) \ for node in startNode.getElementsByTagName("package")] -- cgit v1.2.3 From cb9e67a5437ddfafd6a93f5a208b9faf3f2d5575 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 29 Jan 2015 15:56:57 +0100 Subject: Some file encoding fixup + optimizations --- module/plugins/container/DLC.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index 53349c5c7..184a7b25a 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -9,13 +9,15 @@ from base64 import standard_b64decode from Crypto.Cipher import AES from module.plugins.Container import Container -from module.utils import decode +from module.utils import decode, fs_encode class DLC(Container): - __name__ = "DLC" - __version__ = "0.22" - __pattern__ = r'.+\.dlc$' + __name__ = "DLC" + __type__ = "container" + __version__ = "0.23" + + __pattern__ = r'.+\.dlc$' __description__ = """DLC container decrypter plugin""" __license__ = "GPLv3" @@ -26,31 +28,33 @@ class DLC(Container): ("Walter Purcaro", "vuolter@gmail.com")] - def setup(self): - self.key = "cb99b5cbc24db398" - self.iv = "9bc24cb995cb8db3" - self.api_url = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=" + KEY = "cb99b5cbc24db398" + IV = "9bc24cb995cb8db3" + API_URL = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=%s" def decrypt(self, pyfile): - with open(pyfile.url.replace("\n", "")) as dlc: + file = fs_encode(pyfile.url.strip()) + with open(file) as dlc: data = dlc.read().strip() data += '=' * (-len(data) % 4) dlckey = data[-88:] - dlcdata = data[:-88] - dlcdata = standard_b64decode(dlcdata) + dlcdata = standard_b64decode(data[:-88]) + + try: + rc = re.search(r'(.+)', self.load(self.API_URL % dlckey)).group(1) + + except Exception: + self.fail(_("DLC file is corrupted")) - rc = self.load(self.api_url + dlckey) - rc = re.search(r'(.+)', rc).group(1) - rc = standard_b64decode(rc) + else: + rc = standard_b64decode(rc) - obj = AES.new(self.key, AES.MODE_CBC, self.iv) - dlckey = obj.decrypt(rc) - obj = AES.new(dlckey, AES.MODE_CBC, dlckey) + dlckey = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) - self.data = standard_b64decode(obj.decrypt(dlcdata)) + self.data = standard_b64decode(AES.new(dlckey, AES.MODE_CBC, dlckey).decrypt(dlcdata)) self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ for entry in self.getPackages()] -- cgit v1.2.3 From 79725268402043906f619f7c09e848e02ab8a17b Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 31 Jan 2015 22:00:59 +0100 Subject: Spare code cosmetics --- module/plugins/container/DLC.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index 184a7b25a..589beab4e 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -5,7 +5,6 @@ from __future__ import with_statement import re import xml.dom.minidom -from base64 import standard_b64decode from Crypto.Cipher import AES from module.plugins.Container import Container @@ -41,20 +40,17 @@ class DLC(Container): data += '=' * (-len(data) % 4) dlckey = data[-88:] - dlcdata = standard_b64decode(data[:-88]) + dlcdata = data[:-88].decode('base64') try: - rc = re.search(r'(.+)', self.load(self.API_URL % dlckey)).group(1) + rc = re.search(r'(.+)', self.load(self.API_URL % dlckey)).group(1).decode('base64') except Exception: self.fail(_("DLC file is corrupted")) - else: - rc = standard_b64decode(rc) - dlckey = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) - self.data = standard_b64decode(AES.new(dlckey, AES.MODE_CBC, dlckey).decrypt(dlcdata)) + self.data = AES.new(dlckey, AES.MODE_CBC, dlckey).decrypt(dlcdata).decode('base64') self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ for entry in self.getPackages()] @@ -66,10 +62,10 @@ class DLC(Container): def parsePackages(self, startNode): - return [(standard_b64decode(decode(node.getAttribute("name"))), self.parseLinks(node)) \ + return [(decode(node.getAttribute("name")).decode('base64'), self.parseLinks(node)) \ for node in startNode.getElementsByTagName("package")] def parseLinks(self, startNode): - return [standard_b64decode(node.getElementsByTagName("url")[0].firstChild.data) \ + return [node.getElementsByTagName("url")[0].firstChild.data.decode('base64') \ for node in startNode.getElementsByTagName("file")] -- cgit v1.2.3 From 193cb8dbe1b24c24fb919461f16b2215e85da739 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 3 Feb 2015 16:09:13 +0100 Subject: Update container plugins --- module/plugins/container/DLC.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index 589beab4e..b01e3098c 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -14,7 +14,7 @@ from module.utils import decode, fs_encode class DLC(Container): __name__ = "DLC" __type__ = "container" - __version__ = "0.23" + __version__ = "0.24" __pattern__ = r'.+\.dlc$' @@ -39,18 +39,19 @@ class DLC(Container): data += '=' * (-len(data) % 4) - dlckey = data[-88:] - dlcdata = data[:-88].decode('base64') + dlc_key = data[-88:] + dlc_data = data[:-88].decode('base64') + dlc_content = self.load(self.API_URL % dlc_key) try: - rc = re.search(r'(.+)', self.load(self.API_URL % dlckey)).group(1).decode('base64') + rc = re.search(r'(.+)', dlc_content, re.S).group(1).decode('base64') - except Exception: - self.fail(_("DLC file is corrupted")) + except AttributeError: + self.fail(_("Container is corrupted")) - dlckey = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) + cipher = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) - self.data = AES.new(dlckey, AES.MODE_CBC, dlckey).decrypt(dlcdata).decode('base64') + self.data = AES.new(cipher, AES.MODE_CBC, cipher).decrypt(dlc_data).decode('base64') self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ for entry in self.getPackages()] -- cgit v1.2.3 From bc4f746e241a819bb5678125bbb96cb9a1272d82 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Tue, 24 Feb 2015 03:49:00 +0100 Subject: [RSDF] Fix https://github.com/pyload/pyload/issues/1204 --- module/plugins/container/DLC.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index b01e3098c..d1c34ef50 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -49,9 +49,9 @@ class DLC(Container): except AttributeError: self.fail(_("Container is corrupted")) - cipher = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) + key = iv = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) - self.data = AES.new(cipher, AES.MODE_CBC, cipher).decrypt(dlc_data).decode('base64') + self.data = AES.new(key, AES.MODE_CBC, iv).decrypt(dlc_data).decode('base64') self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ for entry in self.getPackages()] -- cgit v1.2.3 From c039d5822c4c53661813b6fd8e2252a3b633532e Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Fri, 27 Feb 2015 04:39:45 +0100 Subject: [container] Code cosmetics --- module/plugins/container/DLC.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'module/plugins/container/DLC.py') diff --git a/module/plugins/container/DLC.py b/module/plugins/container/DLC.py index d1c34ef50..ff2f0104a 100644 --- a/module/plugins/container/DLC.py +++ b/module/plugins/container/DLC.py @@ -33,8 +33,8 @@ class DLC(Container): def decrypt(self, pyfile): - file = fs_encode(pyfile.url.strip()) - with open(file) as dlc: + fs_filename = fs_encode(pyfile.url.strip()) + with open(fs_filename) as dlc: data = dlc.read().strip() data += '=' * (-len(data) % 4) @@ -52,8 +52,8 @@ class DLC(Container): key = iv = AES.new(self.KEY, AES.MODE_CBC, self.IV).decrypt(rc) self.data = AES.new(key, AES.MODE_CBC, iv).decrypt(dlc_data).decode('base64') - self.packages = [(entry[0] if entry[0] else pyfile.name, entry[1], entry[0] if entry[0] else pyfile.name) \ - for entry in self.getPackages()] + self.packages = [(name or pyfile.name, links, name or pyfile.name) \ + for name, links in self.getPackages()] def getPackages(self): -- cgit v1.2.3