Fix Mega Server

This commit is contained in:
Alhaziel
2019-10-15 18:27:27 +02:00
parent 0aba0a833a
commit f50e460e33
3 changed files with 32 additions and 29 deletions

View File

@@ -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())

View File

@@ -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("}"):

View File

@@ -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)
self.decode(str(0)*rest)