From f50e460e33d2d528557b3649d50c6272cc1170da Mon Sep 17 00:00:00 2001 From: Alhaziel Date: Tue, 15 Oct 2019 18:27:27 +0200 Subject: [PATCH] Fix Mega Server --- core/servertools.py | 2 +- lib/megaserver/client.py | 40 ++++++++++++++++++++-------------------- lib/megaserver/cursor.py | 19 +++++++++++-------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/core/servertools.py b/core/servertools.py index 925dd10d..1b2b3d12 100644 --- a/core/servertools.py +++ b/core/servertools.py @@ -318,7 +318,7 @@ def resolve_video_urls_for_playing(server, url, video_password="", muestra_dialo video_urls.extend(response) except: logger.error("Error al obtener la url en modo free") - error_messages.append("Se ha producido un error en %s" % server_name) + error_messages.append(config.get_localized_string(60006) % server_name) import traceback logger.error(traceback.format_exc()) diff --git a/lib/megaserver/client.py b/lib/megaserver/client.py index 0afe49b8..239f5158 100644 --- a/lib/megaserver/client.py +++ b/lib/megaserver/client.py @@ -84,17 +84,31 @@ class Client(object): def get_files(self): files = [] + enc_url = None if self.files: for file in self.files: n = file.name.encode("utf8") u = "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(n) s = file.size file_id = file.file_id + enc_url = file.url files.append({"name":n,"url":u,"size":s, "id": file_id}) + if len(self.files) == 1: + try: + code = httptools.downloadpage(enc_url, only_headers=True).code + if code > 300: + return code + else: + return files + + except: + print(traceback.format_exc()) + pass + return files def add_url(self, url): - url = url.split("/#")[1] + url = url.split("#")[1] id_video = None if "|" in url: url, id_video = url.split("|") @@ -135,7 +149,8 @@ class Client(object): def api_req(self, req, get=""): seqno = random.randint(0, 0xFFFFFFFF) url = 'https://g.api.mega.co.nz/cs?id=%d%s' % (seqno, get) - return json.loads(self.post(url, json.dumps([req])))[0] + page = httptools.downloadpage(url, post=json.dumps([req])).data + return json.loads(page)[0] def base64urldecode(self,data): data += '=='[(2 - len(data) * 3) % 4:] @@ -165,12 +180,11 @@ class Client(object): def aes_cbc_decrypt(self, data, key): try: + from Cryptodome.Cipher import AES + decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16) + except: from Crypto.Cipher import AES decryptor = AES.new(key, AES.MODE_CBC, '\0' * 16) - #decryptor = aes.AESModeOfOperationCBC(key, iv='\0' * 16) - except: - import jscrypto - decryptor = jscrypto.new(key, jscrypto.MODE_CBC, '\0' * 16) return decryptor.decrypt(data) def aes_cbc_decrypt_a32(self,data, key): @@ -179,20 +193,6 @@ class Client(object): def decrypt_key(self,a, key): return sum((self.aes_cbc_decrypt_a32(a[i:i+4], key) for i in xrange(0, len(a), 4)), ()) - def post(self, url, data): - return httptools.downloadpage(url, data).data - import ssl - from functools import wraps - def sslwrap(func): - @wraps(func) - def bar(*args, **kw): - kw['ssl_version'] = ssl.PROTOCOL_TLSv1 - return func(*args, **kw) - return bar - - ssl.wrap_socket = sslwrap(ssl.wrap_socket) - return urllib.urlopen(url, data).read() - def dec_attr(self, attr, key): attr = self.aes_cbc_decrypt(attr, self.a32_to_str(key)).rstrip('\0') if not attr.endswith("}"): diff --git a/lib/megaserver/cursor.py b/lib/megaserver/cursor.py index ec01c2ba..37eeab2b 100644 --- a/lib/megaserver/cursor.py +++ b/lib/megaserver/cursor.py @@ -1,4 +1,5 @@ import urllib2 +import traceback class Cursor(object): def __init__(self, file): @@ -21,9 +22,11 @@ class Cursor(object): req.headers['Range'] = 'bytes=%s-' % (offset) try: self.conn = urllib2.urlopen(req) - self.prepare_decoder(offset) + try: + self.prepare_decoder(offset) + except: + print(traceback.format_exc()) except: - #La url del archivo expira transcurrido un tiempo, si da error 403, reintenta volviendo a solicitar la url mediante la API self.mega_request(offset, True) def read(self,n=None): @@ -35,7 +38,6 @@ class Cursor(object): self.pos+=len(res) return res - def seek(self,n): if n>self._file.size: n=self._file.size @@ -53,20 +55,21 @@ class Cursor(object): def __exit__(self,exc_type, exc_val, exc_tb): self._file.cursors.remove(self) if len(self._file.cursors) == 0: self._file.cursor = False - + def decode(self, data): return self.decryptor.decrypt(data) def prepare_decoder(self,offset): initial_value = self.initial_value + int(offset/16) try: + from Cryptodome.Cipher import AES + from Cryptodome.Util import Counter + self.decryptor = AES.new(self._file._client.a32_to_str(self.k), AES.MODE_CTR, counter = Counter.new(128, initial_value = initial_value)) + except: from Crypto.Cipher import AES from Crypto.Util import Counter self.decryptor = AES.new(self._file._client.a32_to_str(self.k), AES.MODE_CTR, counter = Counter.new(128, initial_value = initial_value)) - except: - from pyaes import aes - self.decryptor = aes.AESModeOfOperationCTR(f=self,key=self._client.a32_to_str(self.k),counter=aes.Counter(initial_value=initial_value)) rest = offset - int(offset/16)*16 if rest: - self.decode(str(0)*rest) \ No newline at end of file + self.decode(str(0)*rest)