From af2e5a87e0951b574cbd8e0a485a6574f1d00cd5 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 9 Nov 2014 17:36:27 +0100 Subject: New crypter LinkCryptWs --- module/plugins/crypter/LinkCryptWs.py | 343 ++++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 module/plugins/crypter/LinkCryptWs.py (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py new file mode 100644 index 000000000..23a8a6512 --- /dev/null +++ b/module/plugins/crypter/LinkCryptWs.py @@ -0,0 +1,343 @@ +# -*- coding: utf-8 -*- + +import base64 +import binascii +import re + +import pycurl + +from Crypto.Cipher import AES + +from module.plugins.Crypter import Crypter +from module.utils import html_unescape + + +class LinkCryptWs(Crypter): + __name__ = "LinkCryptWs" + __type__ = "crypter" + __version__ = "0.04" + + __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P\w+)' + + __description__ = """LinkCrypt.ws decrypter plugin""" + __license__ = "GPLv3" + __authors__ = [("kagenoshin", "kagenoshin[AT]gmx[DOT]ch"), + ("glukgluk", None)] + + + JK_KEY = "jk" + CRYPTED_KEY = "crypted" + + + def setup(self): + self.html = None + self.fileid = None + self.captcha = False + self.package = None + + self.preferred_sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf', ] #['cnl', 'rsdf', 'ccf', 'dlc', 'web'] + + + def prepare(): + # Init + self.package = pyfile.package() + self.fileid = re.match(self.__pattern__, pyfile.url).group('ID') + + self.req.cj.setCookie(".linkcrypt.ws", "language", "en") + + # Request package + self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko") #better chance to not get those key-captchas + self.html = self.load(self.pyfile.url) + + + def decrypt(self, pyfile): + #check if we have js + if not self.js: + self.fail(_("Missing JS Engine")) + + package_found = None + + self.prepare() + + if not self.isOnline(): + self.offline() + + if self.isKeyCaptchaProtected(): + self.retry(4, 30, _("Can't handle Key-Captcha")) + + if self.isCaptchaProtected(): + self.captcha = True + self.unlockCaptchaProtection() + self.handleCaptchaErrors() + + # Check for protection + if self.isPasswordProtected(): + self.unlockPasswordProtection() + self.handleErrors() + + # get unrar password + self.getunrarpw() + + # Get package name and folder + package_name, folder_name = self.getPackageInfo() + + #get the container definitions from script section + self.get_container_html() + + # Extract package links + package_links = [] + + for type_ in self.preferred_sources: + links = self.handleLinkSource(type_) + if links: + if isinstance(links, list): + package_links.extend(links) + else: + package_found = True + break + + package_links = set(package_links) + + # Pack + if package_links: + self.packages = [(package_name, package_links, folder_name)] + + elif package_found: + self.core.api.deletePackages([self.package.id]) + + + def isOnline(self): + if "Linkcrypt.ws // Error 404" in self.html: + self.logDebug("folder doesen't exist anymore") + return False + else: + return True + + + def isPasswordProtected(self): + if "Authorizing" in self.html: + self.logDebug("Links are password protected") + return True + else: + return False + + + def isCaptchaProtected(self): + if 'id="captcha">' in self.html: + self.logDebug("Links are captcha protected") + return True + else: + return False + + + def isKeyCaptchaProtected(self): + if re.search(r'Key[ -]', self.html, re.I): + return True + else: + return False + + + def unlockPasswordProtection(self): + password = self.getPassword() + + if password: + self.logDebug("Submitting password [%s] for protected links" % password) + self.html = self.load(self.pyfile.url, post={"password": password, 'x': "0", 'y': "0"}) + else: + self.fail(_("Folder is password protected")) + + + def unlockCaptchaProtection(self): + captcha_url = re.search(r']*?>.*?<\s*?input.*?src="([^"]*?)"', self.html, re.I | re.S).group(1) + captcha_code = self.decryptCaptcha(captcha_url, forceUser=True, imgtype="gif", result_type='positional') + + self.html = self.load(self.pyfile.url, post={"x": captcha_code[0], "y": captcha_code[1]}) + + + def getPackageInfo(self): + name = self.pyfile.package().name + folder = self.pyfile.package().folder + + self.logDebug("Defaulting to pyfile name [%s] and folder [%s] for package" % (name, folder)) + + return name, folder + + + def getunrarpw(self): + sitein = self.html + indexi = sitein.find("|source|") + 8 + indexe = sitein.find("|",indexi) + + unrarpw = sitein[indexi:indexe] + + if not (unrarpw == "Password" or "Dateipasswort") : + self.logDebug("File password set to: [%s]"% unrarpw) + self.pyfile.package().password = unrarpw + + + def handleErrors(self): + if self.isPasswordProtected(): + self.fail(_("Incorrect password")) + + + def handleCaptchaErrors(self): + if self.captcha: + if "Your choice was wrong!" in self.html: + self.invalidCaptcha() + self.retry() + else: + self.correctCaptcha() + + + def handleLinkSource(self, type_): + if type_ is 'cnl': + return self.handleCNL2() + + elif type_ is 'web': + return self.handleWebLinks() + + elif type_ in ('rsdf', 'ccf', 'dlc'): + return self.handleContainer(type_) + + else: + self.error(_("Unknown source type: %s") % type_) + + + def handleWebLinks(self): + self.logDebug("Search for Web links ") + + package_links = [] + pattern = r'
]*?>.*?]*?value="([^"]*?)"[^>]*?name="file"' + ids = re.findall(pattern, self.html, re.I | re.S) + + self.logDebug("Decrypting %d Web links" % len(ids)) + + for idx, weblink_id in enumerate(ids): + try: + self.logDebug("Decrypting Web link %d, %s" % (idx + 1, weblink_id)) + + response = self.load("http://linkcrypt.ws/out.html", post = {'file':weblink_id}) + + indexs = response.find("window.location =") + 19 + indexe = response.find('"', indexs) + + link2= response[indexs:indexe] + + self.logDebug(link2) + + link2 = html_unescape(link2) + package_links.append(link2) + + except Exception, detail: + self.logDebug("Error decrypting Web link %s, %s" % (weblink_id, detail)) + + return package_links + + + def get_container_html(self): + self.container_html = [] + + script = re.search(r']*?>(.*?) Date: Mon, 10 Nov 2014 00:19:51 +0100 Subject: Code cosmetics --- module/plugins/crypter/LinkCryptWs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index 23a8a6512..67b1a3f02 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -216,12 +216,12 @@ class LinkCryptWs(Crypter): try: self.logDebug("Decrypting Web link %d, %s" % (idx + 1, weblink_id)) - response = self.load("http://linkcrypt.ws/out.html", post = {'file':weblink_id}) + res = self.load("http://linkcrypt.ws/out.html", post = {'file':weblink_id}) - indexs = response.find("window.location =") + 19 - indexe = response.find('"', indexs) + indexs = res.find("window.location =") + 19 + indexe = res.find('"', indexs) - link2= response[indexs:indexe] + link2 = res[indexs:indexe] self.logDebug(link2) -- cgit v1.2.3 From 5f150f8c284178ba55cce3ecdf347131cc61ad1a Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sat, 15 Nov 2014 01:59:37 +0100 Subject: [LinkCryptWs] Fix typo --- module/plugins/crypter/LinkCryptWs.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index 67b1a3f02..b90e18490 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -15,7 +15,7 @@ from module.utils import html_unescape class LinkCryptWs(Crypter): __name__ = "LinkCryptWs" __type__ = "crypter" - __version__ = "0.04" + __version__ = "0.05" __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P\w+)' @@ -38,7 +38,7 @@ class LinkCryptWs(Crypter): self.preferred_sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf', ] #['cnl', 'rsdf', 'ccf', 'dlc', 'web'] - def prepare(): + def prepare(self): # Init self.package = pyfile.package() self.fileid = re.match(self.__pattern__, pyfile.url).group('ID') @@ -46,7 +46,7 @@ class LinkCryptWs(Crypter): self.req.cj.setCookie(".linkcrypt.ws", "language", "en") # Request package - self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko") #better chance to not get those key-captchas + self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko") #: better chance to not get those key-captchas self.html = self.load(self.pyfile.url) @@ -96,8 +96,6 @@ class LinkCryptWs(Crypter): package_found = True break - package_links = set(package_links) - # Pack if package_links: self.packages = [(package_name, package_links, folder_name)] -- cgit v1.2.3 From 17f00c79d9be1d087cee8da32f0cb8515004c321 Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Thu, 20 Nov 2014 22:07:41 +0100 Subject: [LinkCryptWs] Fix (thx NETHeader) --- module/plugins/crypter/LinkCryptWs.py | 65 ++++++++++++++--------------------- 1 file changed, 25 insertions(+), 40 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index b90e18490..578595228 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -15,7 +15,7 @@ from module.utils import html_unescape class LinkCryptWs(Crypter): __name__ = "LinkCryptWs" __type__ = "crypter" - __version__ = "0.05" + __version__ = "0.06" __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P\w+)' @@ -25,25 +25,21 @@ class LinkCryptWs(Crypter): ("glukgluk", None)] - JK_KEY = "jk" CRYPTED_KEY = "crypted" + JK_KEY = "jk" def setup(self): - self.html = None - self.fileid = None self.captcha = False - self.package = None - - self.preferred_sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf', ] #['cnl', 'rsdf', 'ccf', 'dlc', 'web'] + self.links = [] + self.sources = ['cnl', 'web', 'dlc', 'rsdf', 'ccf'] def prepare(self): # Init - self.package = pyfile.package() self.fileid = re.match(self.__pattern__, pyfile.url).group('ID') - self.req.cj.setCookie(".linkcrypt.ws", "language", "en") + self.req.cj.setCookie("linkcrypt.ws", "language", "en") # Request package self.req.http.c.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko") #: better chance to not get those key-captchas @@ -51,12 +47,9 @@ class LinkCryptWs(Crypter): def decrypt(self, pyfile): - #check if we have js if not self.js: self.fail(_("Missing JS Engine")) - package_found = None - self.prepare() if not self.isOnline(): @@ -85,23 +78,15 @@ class LinkCryptWs(Crypter): self.get_container_html() # Extract package links - package_links = [] + for type in self.sources: + links = self.handleLinkSource(type) - for type_ in self.preferred_sources: - links = self.handleLinkSource(type_) if links: - if isinstance(links, list): - package_links.extend(links) - else: - package_found = True + self.links.extend(links) break - # Pack - if package_links: - self.packages = [(package_name, package_links, folder_name)] - - elif package_found: - self.core.api.deletePackages([self.package.id]) + if self.links: + self.packages = [(package_name, self.links, folder_name)] def isOnline(self): @@ -187,18 +172,18 @@ class LinkCryptWs(Crypter): self.correctCaptcha() - def handleLinkSource(self, type_): - if type_ is 'cnl': + def handleLinkSource(self, type): + if type == 'cnl': return self.handleCNL2() - elif type_ is 'web': + elif type == 'web': return self.handleWebLinks() - elif type_ in ('rsdf', 'ccf', 'dlc'): - return self.handleContainer(type_) + elif type in ('rsdf', 'ccf', 'dlc'): + return self.handleContainer(type) else: - self.error(_("Unknown source type: %s") % type_) + self.fail(_("Unknown source type: %s") % type) #@TODO: Replace with self.error in 0.4.10 def handleWebLinks(self): @@ -247,17 +232,17 @@ class LinkCryptWs(Crypter): return self.js.eval(line.replace('{}))',"{}).replace('document.open();document.write','').replace(';document.close();',''))")) - def handleContainer(self, type_): + def handleContainer(self, type): package_links = [] - type_ = type_.lower() + type = type.lower() - self.logDebug('Search for %s Container links' % type_.upper()) + self.logDebug('Search for %s Container links' % type.upper()) - if not type_.isalnum(): # check to prevent broken re-pattern (cnl2,rsdf,ccf,dlc,web are all alpha-numeric) - self.error(_("unknown container type: %s") % type_) + if not type.isalnum(): # check to prevent broken re-pattern (cnl2,rsdf,ccf,dlc,web are all alpha-numeric) + self.fail(_("Unknown container type: %s") % type) #@TODO: Replace with self.error in 0.4.10 for line in self.container_html: - if(type_ in line): + if type in line: jseval = self.handle_javascript(line) clink = re.search(r'href=["\']([^"\']*?)["\']',jseval,re.I) @@ -267,8 +252,8 @@ class LinkCryptWs(Crypter): self.logDebug("clink avaible") package_name, folder_name = self.getPackageInfo() - self.logDebug("Added package with name %s.%s and container link %s" %( package_name, type_, clink.group(1))) - self.core.api.uploadContainer( "%s.%s" %(package_name, type_), self.load(clink.group(1))) + self.logDebug("Added package with name %s.%s and container link %s" %( package_name, type, clink.group(1))) + self.core.api.uploadContainer( "%s.%s" %(package_name, type), self.load(clink.group(1))) return "Found it" return package_links @@ -281,7 +266,7 @@ class LinkCryptWs(Crypter): cnl_line = None for line in self.container_html: - if("cnl" in line): + if "cnl" in line: cnl_line = line break -- cgit v1.2.3 From a059d5df038f2cb1ba4be32c782aa3878e849555 Mon Sep 17 00:00:00 2001 From: Gummibaer Date: Wed, 26 Nov 2014 12:33:40 +0100 Subject: Fix Error [LinkCryptWs.py] Error: global name 'pyfile' is not defined --- module/plugins/crypter/LinkCryptWs.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index 578595228..835a549b2 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -15,14 +15,15 @@ from module.utils import html_unescape class LinkCryptWs(Crypter): __name__ = "LinkCryptWs" __type__ = "crypter" - __version__ = "0.06" + __version__ = "0.07" __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P\w+)' __description__ = """LinkCrypt.ws decrypter plugin""" __license__ = "GPLv3" __authors__ = [("kagenoshin", "kagenoshin[AT]gmx[DOT]ch"), - ("glukgluk", None)] + ("glukgluk", None), + ("Gummibaer", None)] CRYPTED_KEY = "crypted" @@ -37,7 +38,7 @@ class LinkCryptWs(Crypter): def prepare(self): # Init - self.fileid = re.match(self.__pattern__, pyfile.url).group('ID') + self.fileid = re.match(self.__pattern__, self.pyfile.url).group('ID') self.req.cj.setCookie("linkcrypt.ws", "language", "en") -- cgit v1.2.3 From 30c5ee2d8d69c59ca15ca1700b34be73a89a59ee Mon Sep 17 00:00:00 2001 From: Gummibaer Date: Sat, 27 Dec 2014 23:32:31 +0100 Subject: Update LinkCryptWs.py key captcha recognition improved (works faster) --- module/plugins/crypter/LinkCryptWs.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index 835a549b2..a2afce4dc 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -15,7 +15,7 @@ from module.utils import html_unescape class LinkCryptWs(Crypter): __name__ = "LinkCryptWs" __type__ = "crypter" - __version__ = "0.07" + __version__ = "0.08" __pattern__ = r'http://(?:www\.)?linkcrypt\.ws/(dir|container)/(?P\w+)' @@ -57,7 +57,7 @@ class LinkCryptWs(Crypter): self.offline() if self.isKeyCaptchaProtected(): - self.retry(4, 30, _("Can't handle Key-Captcha")) + self.retry(8, 15, _("Can't handle Key-Captcha")) if self.isCaptchaProtected(): self.captcha = True @@ -115,10 +115,9 @@ class LinkCryptWs(Crypter): def isKeyCaptchaProtected(self): - if re.search(r'Key[ -]', self.html, re.I): + if(re.search(r'
If the folder does not open after klick on Enter Folder', self.html, re.I)): return True - else: - return False + return False def unlockPasswordProtection(self): -- cgit v1.2.3 From b8ad0c72e6b7b309806be3ea55111b42f733dc9b Mon Sep 17 00:00:00 2001 From: Walter Purcaro Date: Sun, 28 Dec 2014 01:38:03 +0100 Subject: [LinkCryptWs] Tiny code cosmetic --- module/plugins/crypter/LinkCryptWs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'module/plugins/crypter/LinkCryptWs.py') diff --git a/module/plugins/crypter/LinkCryptWs.py b/module/plugins/crypter/LinkCryptWs.py index a2afce4dc..996a92c7b 100644 --- a/module/plugins/crypter/LinkCryptWs.py +++ b/module/plugins/crypter/LinkCryptWs.py @@ -115,9 +115,10 @@ class LinkCryptWs(Crypter): def isKeyCaptchaProtected(self): - if(re.search(r'
If the folder does not open after klick on Enter Folder', self.html, re.I)): + if re.search(r'>If the folder does not open after klick on <', self.html, re.I): return True - return False + else: + return False def unlockPasswordProtection(self): -- cgit v1.2.3