diff options
Diffstat (limited to 'module/plugins/crypter/NCryptIn.py')
-rw-r--r-- | module/plugins/crypter/NCryptIn.py | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/module/plugins/crypter/NCryptIn.py b/module/plugins/crypter/NCryptIn.py index 9a9d76f51..8b7214157 100644 --- a/module/plugins/crypter/NCryptIn.py +++ b/module/plugins/crypter/NCryptIn.py @@ -11,15 +11,19 @@ from module.plugins.internal.CaptchaService import ReCaptcha class NCryptIn(Crypter): - __name__ = "NCryptIn" - __version__ = "1.32" - __type__ = "crypter" + __name__ = "NCryptIn" + __type__ = "crypter" + __version__ = "1.33" - __pattern__ = r'http://(?:www\.)?ncrypt.in/(?P<type>folder|link|frame)-([^/\?]+)' + __pattern__ = r'http://(?:www\.)?ncrypt\.in/(?P<TYPE>folder|link|frame)-([^/\?]+)' + __config__ = [("use_subfolder", "bool", "Save package to subfolder", True), + ("subfolder_per_package", "bool", "Create a subfolder for each package", True)] __description__ = """NCrypt.in decrypter plugin""" - __author_name__ = ("fragonib", "stickell") - __author_mail__ = ("fragonib[AT]yahoo[DOT]es", "l.stickell@yahoo.it") + __license__ = "GPLv3" + __authors__ = [("fragonib", "fragonib[AT]yahoo[DOT]es"), + ("stickell", "l.stickell@yahoo.it")] + JK_KEY = "jk" CRYPTED_KEY = "crypted" @@ -29,11 +33,11 @@ class NCryptIn(Crypter): def setup(self): self.package = None - self.html = None self.cleanedHtml = None self.links_source_order = ["cnl2", "rsdf", "ccf", "dlc", "web"] self.protection_type = None + def decrypt(self, pyfile): # Init self.package = pyfile.package() @@ -54,7 +58,7 @@ class NCryptIn(Crypter): if not self.isOnline(): self.offline() - # Check for folder protection + # Check for folder protection if self.isProtected(): self.html = self.unlockProtection() self.cleanedHtml = self.removeHtmlCrap(self.html) @@ -71,17 +75,19 @@ class NCryptIn(Crypter): package_links = set(package_links) # Pack and return links - if not package_links: - self.fail('Could not extract any links') - self.packages = [(package_name, package_links, folder_name)] + if package_links: + self.packages = [(package_name, package_links, folder_name)] + def isSingleLink(self): - link_type = re.match(self.__pattern__, self.pyfile.url).group('type') + 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 removeHtmlCrap(self, content): patterns = (r'(type="hidden".*?(name=".*?")?.*?value=".*?")', r'display:none;">(.*?)</(div|span)>', @@ -89,18 +95,20 @@ class NCryptIn(Crypter): r'<table class="global">(.*?)</table>', r'<iframe\s+style="display:none(.*?)</iframe>') for pattern in patterns: - rexpr = re.compile(pattern, re.DOTALL) + rexpr = re.compile(pattern, re.S) content = re.sub(rexpr, "", content) return content + def isOnline(self): if "Your folder does not exist" in self.cleanedHtml: self.logDebug("File not m") return False return True + def isProtected(self): - form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleanedHtml, re.DOTALL) + form = re.search(r'<form.*?name.*?protected.*?>(.*?)</form>', self.cleanedHtml, re.S) if form is not None: content = form.group(1) for keyword in ("password", "captcha"): @@ -110,6 +118,7 @@ class NCryptIn(Crypter): return True return False + def getPackageInfo(self): m = re.search(self.NAME_PATTERN, self.html) if m: @@ -121,11 +130,11 @@ class NCryptIn(Crypter): self.logDebug("Package info not m, defaulting to pyfile name [%s] and folder [%s]" % (name, folder)) return name, folder - def unlockProtection(self): + def unlockProtection(self): postData = {} - form = re.search(r'<form name="protected"(.*?)</form>', self.cleanedHtml, re.DOTALL).group(1) + form = re.search(r'<form name="protected"(.*?)</form>', self.cleanedHtml, re.S).group(1) # Submit package password if "password" in form: @@ -141,15 +150,15 @@ class NCryptIn(Crypter): self.logDebug("Captcha resolved [%s]" % captcha) postData['captcha'] = captcha - # Resolve recaptcha + # Resolve recaptcha if "recaptcha" in form: self.logDebug("ReCaptcha protected") captcha_key = re.search(r'\?k=(.*?)"', form).group(1) self.logDebug("Resolving ReCaptcha with key [%s]" % captcha_key) recaptcha = ReCaptcha(self) - challenge, code = recaptcha.challenge(captcha_key) + challenge, response = recaptcha.challenge(captcha_key) postData['recaptcha_challenge_field'] = challenge - postData['recaptcha_response_field'] = code + postData['recaptcha_response_field'] = response # Resolve circlecaptcha if "circlecaptcha" in form: @@ -164,20 +173,21 @@ class NCryptIn(Crypter): postData['submit_protected'] = 'Continue to folder' return self.load(self.pyfile.url, post=postData, decode=True) + def handleErrors(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") - self.fail("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.logDebug("Invalid captcha, retrying") self.invalidCaptcha() self.retry() else: self.correctCaptcha() + def handleLinkSource(self, link_source_type): # Check for JS engine require_js_engine = link_source_type in ("cnl2", "rsdf", "ccf", "dlc") @@ -195,10 +205,10 @@ class NCryptIn(Crypter): elif link_source_type == "web": return self.handleWebLinks() else: - self.fail('unknown source type "%s" (this is probably a bug)' % link_source_type) + self.error('Unknown source type "%s" (this is probably a bug)' % link_source_type) - def handleSingleLink(self): + def handleSingleLink(self): self.logDebug("Handling Single link") package_links = [] @@ -209,8 +219,8 @@ class NCryptIn(Crypter): return package_links - def handleCNL2(self): + def handleCNL2(self): self.logDebug("Handling CNL2 links") package_links = [] @@ -220,16 +230,16 @@ class NCryptIn(Crypter): for (crypted, jk) in zip(vcrypted, vjk): package_links.extend(self._getLinks(crypted, jk)) except: - self.fail("Unable to decrypt CNL2 links") + self.fail(_("Unable to decrypt CNL2 links")) return package_links - def handleContainers(self): + def handleContainers(self): self.logDebug("Handling Container links") package_links = [] - pattern = r"/container/(rsdf|dlc|ccf)/([a-z0-9]+)" + pattern = r'/container/(rsdf|dlc|ccf)/(\w+)' containersLinks = re.findall(pattern, self.html) self.logDebug("Decrypting %d Container links" % len(containersLinks)) for containerLink in containersLinks: @@ -238,10 +248,10 @@ class NCryptIn(Crypter): return package_links - def handleWebLinks(self): + def handleWebLinks(self): self.logDebug("Handling Web links") - pattern = r"(http://ncrypt\.in/link-.*?=)" + pattern = r'(http://ncrypt\.in/link-.*?=)' links = re.findall(pattern, self.html) package_links = [] @@ -254,6 +264,7 @@ class NCryptIn(Crypter): return package_links + def decryptLink(self, link): try: url = link.replace("link-", "frame-") @@ -262,8 +273,8 @@ class NCryptIn(Crypter): except Exception, detail: self.logDebug("Error decrypting link %s, %s" % (link, detail)) - def _getCipherParams(self): + def _getCipherParams(self): pattern = r'<input.*?name="%s".*?value="(.*?)"' # Get jk @@ -278,6 +289,7 @@ class NCryptIn(Crypter): self.logDebug("Detected %d crypted blocks" % len(vcrypted)) return vcrypted, vjk + def _getLinks(self, crypted, jk): # Get key jreturn = self.js.eval("%s f()" % jk) |