diff options
Diffstat (limited to 'module/plugins/crypter/NCryptIn.py')
-rw-r--r-- | module/plugins/crypter/NCryptIn.py | 203 |
1 files changed, 102 insertions, 101 deletions
diff --git a/module/plugins/crypter/NCryptIn.py b/module/plugins/crypter/NCryptIn.py index 593e9b506..d483be323 100644 --- a/module/plugins/crypter/NCryptIn.py +++ b/module/plugins/crypter/NCryptIn.py @@ -5,14 +5,15 @@ import re from Crypto.Cipher import AES -from module.plugins.Crypter import Crypter -from module.plugins.internal.ReCaptcha import ReCaptcha +from module.plugins.internal.Crypter import Crypter +from module.plugins.captcha.ReCaptcha import ReCaptcha class NCryptIn(Crypter): __name__ = "NCryptIn" __type__ = "crypter" - __version__ = "1.35" + __version__ = "1.37" + __status__ = "testing" __pattern__ = r'http://(?:www\.)?ncrypt\.in/(?P<TYPE>folder|link|frame)-([^/\?]+)' __config__ = [("use_subfolder" , "bool", "Save package to subfolder" , True), @@ -32,62 +33,62 @@ class NCryptIn(Crypter): def setup(self): self.package = None - self.cleanedHtml = None + self.cleaned_html = None self.links_source_order = ["cnl2", "rsdf", "ccf", "dlc", "web"] self.protection_type = None def decrypt(self, pyfile): - # Init + #: Init self.package = pyfile.package() package_links = [] package_name = self.package.name folder_name = self.package.folder - # Deal with single links - if self.isSingleLink(): - package_links.extend(self.handleSingleLink()) + #: Deal with single links + if self.is_single_link(): + package_links.extend(self.handle_single_link()) - # Deal with folders + #: Deal with folders else: - # Request folder home - self.html = self.requestFolderHome() - self.cleanedHtml = self.removeHtmlCrap(self.html) - if not self.isOnline(): + #: Request folder home + self.html = self.request_folder_home() + self.cleaned_html = self.remove_html_crap(self.html) + if not self.is_online(): self.offline() - # Check for folder protection - if self.isProtected(): - self.html = self.unlockProtection() - self.cleanedHtml = self.removeHtmlCrap(self.html) - self.handleErrors() + #: Check for folder protection + if self.is_protected(): + self.html = self.unlock_protection() + self.cleaned_html = self.remove_html_crap(self.html) + self.handle_errors() - # Prepare package name and folder - (package_name, folder_name) = self.getPackageInfo() + #: Prepare package name and folder + (package_name, folder_name) = self.get_package_info() - # Extract package links + #: Extract package links for link_source_type in self.links_source_order: - package_links.extend(self.handleLinkSource(link_source_type)) - if package_links: # use only first source which provides links + package_links.extend(self.handle_link_source(link_source_type)) + if package_links: #: Use only first source which provides links break package_links = set(package_links) - # Pack and return links + #: Pack and return links if package_links: self.packages = [(package_name, package_links, folder_name)] - def isSingleLink(self): + def is_single_link(self): link_type = re.match(self.__pattern__, self.pyfile.url).group('TYPE') return link_type in ("link", "frame") - def requestFolderHome(self): - return self.load(self.pyfile.url, decode=True) + def request_folder_home(self): + return self.load(self.pyfile.url) - def removeHtmlCrap(self, content): + def remove_html_crap(self, content): patterns = (r'(type="hidden".*?(name=".*?")?.*?value=".*?")', r'display:none;">(.*?)</(div|span)>', r'<div\s+class="jdownloader"(.*?)</div>', @@ -99,148 +100,148 @@ class NCryptIn(Crypter): return content - def isOnline(self): - if "Your folder does not exist" in self.cleanedHtml: - self.logDebug("File not m") + def is_online(self): + if "Your folder does not exist" in self.cleaned_html: + self.log_debug("File not m") return False return True - def isProtected(self): - form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleanedHtml, re.S) + def is_protected(self): + form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleaned_html, re.S) if form: content = form.group(1) for keyword in ("password", "captcha"): if keyword in content: self.protection_type = keyword - self.logDebug("Links are %s protected" % self.protection_type) + self.log_debug("Links are %s protected" % self.protection_type) return True return False - def getPackageInfo(self): + def get_package_info(self): m = re.search(self.NAME_PATTERN, self.html) if m: name = folder = m.group('N').strip() - self.logDebug("Found name [%s] and folder [%s] in package info" % (name, folder)) + self.log_debug("Found name [%s] and folder [%s] in package info" % (name, folder)) else: name = self.package.name folder = self.package.folder - self.logDebug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) + self.log_debug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) return name, folder - def unlockProtection(self): + def unlock_protection(self): postData = {} - form = re.search(r'<form name="protected"(.*?)</form>', self.cleanedHtml, re.S).group(1) + form = re.search(r'<form name="protected"(.*?)</form>', self.cleaned_html, re.S).group(1) - # Submit package password + #: Submit package password if "password" in form: - password = self.getPassword() - self.logDebug("Submitting password [%s] for protected links" % password) + password = self.get_password() + self.log_debug("Submitting password [%s] for protected links" % password) postData['password'] = password - # Resolve anicaptcha + #: Resolve anicaptcha if "anicaptcha" in form: - self.logDebug("Captcha protected") + self.log_debug("Captcha protected") captchaUri = re.search(r'src="(/temp/anicaptcha/.+?)"', form).group(1) - captcha = self.decryptCaptcha("http://ncrypt.in" + captchaUri) - self.logDebug("Captcha resolved [%s]" % captcha) + captcha = self.captcha.decrypt("http://ncrypt.in" + captchaUri) + self.log_debug("Captcha resolved [%s]" % captcha) postData['captcha'] = captcha - # Resolve recaptcha + #: Resolve recaptcha if "recaptcha" in form: - self.logDebug("ReCaptcha protected") + self.log_debug("ReCaptcha protected") captcha_key = re.search(r'\?k=(.*?)"', form).group(1) - self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key) + self.log_debug("Resolving ReCaptcha with key [%s]" % captcha_key) recaptcha = ReCaptcha(self) response, challenge = recaptcha.challenge(captcha_key) postData['recaptcha_challenge_field'] = challenge postData['recaptcha_response_field'] = response - # Resolve circlecaptcha + #: Resolve circlecaptcha if "circlecaptcha" in form: - self.logDebug("CircleCaptcha protected") + self.log_debug("CircleCaptcha protected") captcha_img_url = "http://ncrypt.in/classes/captcha/circlecaptcha.php" - coords = self.decryptCaptcha(captcha_img_url, forceUser=True, imgtype="png", result_type='positional') - self.logDebug("Captcha resolved, coords [%s]" % str(coords)) + coords = self.captcha.decrypt(captcha_img_url, input_type="png", output_type='positional', ocr="CircleCaptcha") + self.log_debug("Captcha resolved, coords [%s]" % str(coords)) postData['circle.x'] = coords[0] postData['circle.y'] = coords[1] - # Unlock protection + #: Unlock protection postData['submit_protected'] = 'Continue to folder' - return self.load(self.pyfile.url, post=postData, decode=True) + return self.load(self.pyfile.url, post=postData) - def handleErrors(self): + def handle_errors(self): if self.protection_type == "password": - if "This password is invalid!" in self.cleanedHtml: - self.logDebug("Incorrect password, please set right password on 'Edit package' form and retry") + if "This password is invalid!" in self.cleaned_html: + self.log_debug("Incorrect password, please set right password on 'Edit package' form and retry") self.fail(_("Incorrect password, please set right password on 'Edit package' form and retry")) if self.protection_type == "captcha": - if "The securitycheck was wrong!" in self.cleanedHtml: - self.invalidCaptcha() + if "The securitycheck was wrong!" in self.cleaned_html: + self.captcha.invalid() self.retry() else: - self.correctCaptcha() + self.captcha.correct() - def handleLinkSource(self, link_source_type): - # Check for JS engine + def handle_link_source(self, link_source_type): + #: Check for JS engine require_js_engine = link_source_type in ("cnl2", "rsdf", "ccf", "dlc") if require_js_engine and not self.js: - self.logDebug("No JS engine available, skip %s links" % link_source_type) + self.log_debug("No JS engine available, skip %s links" % link_source_type) return [] - # Select suitable handler - if link_source_type == 'single': - return self.handleSingleLink() - if link_source_type == 'cnl2': - return self.handleCNL2() + #: Select suitable handler + if link_source_type == "single": + return self.handle_single_link() + if link_source_type == "cnl2": + return self.handle_CNL2() elif link_source_type in ("rsdf", "ccf", "dlc"): - return self.handleContainer(link_source_type) + return self.handle_container(link_source_type) elif link_source_type == "web": - return self.handleWebLinks() + return self.handle_web_links() else: self.error(_('Unknown source type "%s"') % link_source_type) - def handleSingleLink(self): - self.logDebug("Handling Single link") + def handle_single_link(self): + self.log_debug("Handling Single link") package_links = [] - # Decrypt single link - decrypted_link = self.decryptLink(self.pyfile.url) + #: Decrypt single link + decrypted_link = self.decrypt_link(self.pyfile.url) if decrypted_link: package_links.append(decrypted_link) return package_links - def handleCNL2(self): - self.logDebug("Handling CNL2 links") + def handle_CNL2(self): + self.log_debug("Handling CNL2 links") package_links = [] - if 'cnl2_output' in self.cleanedHtml: + if 'cnl2_output' in self.cleaned_html: try: - (vcrypted, vjk) = self._getCipherParams() + (vcrypted, vjk) = self._get_cipher_params() for (crypted, jk) in zip(vcrypted, vjk): - package_links.extend(self._getLinks(crypted, jk)) + package_links.extend(self._get_links(crypted, jk)) except Exception: self.fail(_("Unable to decrypt CNL2 links")) return package_links - def handleContainers(self): - self.logDebug("Handling Container links") + def handle_containers(self): + self.log_debug("Handling Container links") package_links = [] pattern = r'/container/(rsdf|dlc|ccf)/(\w+)' containersLinks = re.findall(pattern, self.html) - self.logDebug("Decrypting %d Container links" % len(containersLinks)) + self.log_debug("Decrypting %d Container links" % len(containersLinks)) for containerLink in containersLinks: link = "http://ncrypt.in/container/%s/%s.%s" % (containerLink[0], containerLink[1], containerLink[0]) package_links.append(link) @@ -248,15 +249,15 @@ class NCryptIn(Crypter): return package_links - def handleWebLinks(self): - self.logDebug("Handling Web links") + def handle_web_links(self): + self.log_debug("Handling Web links") pattern = r'(http://ncrypt\.in/link-.*?=)' links = re.findall(pattern, self.html) package_links = [] - self.logDebug("Decrypting %d Web links" % len(links)) + self.log_debug("Decrypting %d Web links" % len(links)) for i, link in enumerate(links): - self.logDebug("Decrypting Web link %d, %s" % (i + 1, link)) + self.log_debug("Decrypting Web link %d, %s" % (i + 1, link)) decrypted_link = self.decrypt(link) if decrypted_link: package_links.append(decrypted_link) @@ -264,47 +265,47 @@ class NCryptIn(Crypter): return package_links - def decryptLink(self, link): + def decrypt_link(self, link): try: url = link.replace("link-", "frame-") link = self.load(url, just_header=True)['location'] return link except Exception, detail: - self.logDebug("Error decrypting link %s, %s" % (link, detail)) + self.log_debug("Error decrypting link %s, %s" % (link, detail)) - def _getCipherParams(self): + def _get_cipher_params(self): pattern = r'<input.*?name="%s".*?value="(.*?)"' - # Get jk + #: Get jk jk_re = pattern % NCryptIn.JK_KEY vjk = re.findall(jk_re, self.html) - # Get crypted + #: Get crypted crypted_re = pattern % NCryptIn.CRYPTED_KEY vcrypted = re.findall(crypted_re, self.html) - # Log and return - self.logDebug("Detected %d crypted blocks" % len(vcrypted)) + #: Log and return + self.log_debug("Detected %d crypted blocks" % len(vcrypted)) return vcrypted, vjk - def _getLinks(self, crypted, jk): - # Get key + def _get_links(self, crypted, jk): + #: Get key jreturn = self.js.eval("%s f()" % jk) - self.logDebug("JsEngine returns value [%s]" % jreturn) + self.log_debug("JsEngine returns value [%s]" % jreturn) key = binascii.unhexlify(jreturn) - # Decrypt + #: Decrypt Key = key IV = key obj = AES.new(Key, AES.MODE_CBC, IV) text = obj.decrypt(crypted.decode('base64')) - # Extract links + #: Extract links text = text.replace("\x00", "").replace("\r", "") links = filter(bool, text.split('\n')) - # Log and return - self.logDebug("Block has %d links" % len(links)) + #: Log and return + self.log_debug("Block has %d links" % len(links)) return links |