diff --git a/oml/changelog.py b/oml/changelog.py index e65505d..e52ea40 100644 --- a/oml/changelog.py +++ b/oml/changelog.py @@ -55,6 +55,7 @@ class Changelog(db.Model): c.revision = cls.query.filter_by(user_id=user.id).count() c.data = json.dumps([action] + list(args)) _data = str(c.revision) + str(c.timestamp) + c.data + _data = _data.encode('utf-8') c.sig = settings.sk.sign(_data, encoding='base64') state.db.session.add(c) state.db.session.commit() @@ -79,6 +80,7 @@ class Changelog(db.Model): next_revision = last.revision + 1 if last else 0 if revision == next_revision: _data = str(revision) + str(timestamp) + data + _data = _data.encode('utf-8') if rebuild: sig = settings.sk.sign(_data, encoding='base64') if valid(user.id, _data, sig): @@ -110,12 +112,14 @@ class Changelog(db.Model): def verify(self): _data = str(self.revision) + str(self.timestamp) + self.data + _data = _data.encode('utf-8') return valid(self.user_id, _data, self.sig) @classmethod def _rebuild(cls): for c in cls.query.filter_by(user_id=settings.USER_ID): _data = str(c.revision) + str(c.timestamp) + c.data + _data = _data.encode('utf-8') c.sig = settings.sk.sign(_data, encoding='base64') state.db.session.add(c) state.db.session.commit() diff --git a/oml/directory.py b/oml/directory.py index 6e5cdac..30889bc 100644 --- a/oml/directory.py +++ b/oml/directory.py @@ -16,8 +16,8 @@ logger = logging.getLogger('oml.directory') base = settings.server['directory_service'] def get(vk): - id = vk.to_ascii(encoding='base64') - url ='%s/%s' % (base, id) + id = vk.to_ascii(encoding='base64').decode() + url = '%s/%s' % (base, id) headers = { 'User-Agent': settings.USER_AGENT } @@ -36,7 +36,7 @@ def get(vk): return data def put(sk, data): - id = sk.get_verifying_key().to_ascii(encoding='base64') + id = sk.get_verifying_key().to_ascii(encoding='base64').decode() data = json.dumps(data).encode('utf-8') sig = sk.sign(data, encoding='base64') url ='%s/%s' % (base, id) diff --git a/oml/item/models.py b/oml/item/models.py index 4d2f530..732bc7e 100644 --- a/oml/item/models.py +++ b/oml/item/models.py @@ -3,7 +3,7 @@ from datetime import datetime -from io import StringIO +from io import StringIO, BytesIO import base64 import hashlib import json @@ -164,7 +164,7 @@ class Item(db.Model): def add(k, v): f = Find(item_id=self.id, key=k) - if isinstance(v, str): + if isinstance(v, bytes): v = v.decode('utf-8') f.findvalue = unicodedata.normalize('NFKD', v).lower() f.value = v @@ -290,7 +290,7 @@ class Item(db.Model): def update_icons(self): def get_ratio(data): - img = Image.open(StringIO(data)) + img = Image.open(BytesIO(data)) return img.size[0]/img.size[1] key = 'cover:%s'%self.id cover = None diff --git a/oml/localnodes.py b/oml/localnodes.py index bdea185..5da89c1 100644 --- a/oml/localnodes.py +++ b/oml/localnodes.py @@ -57,7 +57,7 @@ class LocalNodesBase(Thread): 'port': server['node_port'], 'cert': server['cert'] }) - sig = sk.sign(message.encode('utf-8'), encoding='base64') + sig = sk.sign(message.encode('utf-8'), encoding='base64').decode('utf-8') packet = json.dumps([sig, USER_ID, message]).encode('utf-8') else: packet = None diff --git a/oml/media/epub.py b/oml/media/epub.py index 7762093..1860353 100644 --- a/oml/media/epub.py +++ b/oml/media/epub.py @@ -85,7 +85,7 @@ def info(epub): return data def extract_text(path): - data = '' + data = b'' z = zipfile.ZipFile(path) for f in z.filelist: if f.filename.endswith('html'): diff --git a/oml/nodes.py b/oml/nodes.py index 4bcc5ee..c7f158b 100644 --- a/oml/nodes.py +++ b/oml/nodes.py @@ -44,7 +44,7 @@ class Node(Thread): def __init__(self, nodes, user): self._nodes = nodes self.user_id = user.id - key = str(user.id) + key = user.id.encode() self.vk = ed25519.VerifyingKey(key, encoding=ENCODING) logger.debug('new Node %s online=%s', self.user_id, self.online) self._q = Queue() @@ -126,7 +126,7 @@ class Node(Thread): self.online = False return None content = json.dumps([action, args]).encode('utf-8') - sig = settings.sk.sign(content, encoding=ENCODING) + sig = settings.sk.sign(content, encoding=ENCODING).decode() headers = { 'User-Agent': settings.USER_AGENT, 'X-Node-Protocol': settings.NODE_PROTOCOL, @@ -137,6 +137,7 @@ class Node(Thread): 'X-Ed25519-Signature': sig, } self._opener.addheaders = list(zip(list(headers.keys()), list(headers.values()))) + logger.debug('headers: %s', self._opener.addheaders) try: self._opener.timeout = self.TIMEOUT r = self._opener.open(url, data=content) @@ -161,6 +162,7 @@ class Node(Thread): self.online = False return None data = r.read() + logger.debug('response data: %s', data) if r.headers.get('content-encoding', None) == 'gzip': data = gzip.GzipFile(fileobj=StringIO(data)).read() @@ -178,9 +180,12 @@ class Node(Thread): else: logger.debug('invalid signature %s', data) response = None + logger.debug('response: %s', response) return response def _valid(self, data, sig): + if isinstance(data, str): + data = data.encode('utf-8') try: self.vk.verify(sig, data, encoding=ENCODING) #except ed25519.BadSignatureError: @@ -307,9 +312,10 @@ class Node(Thread): if r.headers.get('content-encoding', None) == 'gzip': content = gzip.GzipFile(fileobj=r).read() else: - content = '' + content = b'' ct = datetime.utcnow() - for chunk in iter(lambda: r.read(16*1024), ''): + ''' + for chunk in iter(lambda: r.read(16*1024), b''): content += chunk if (datetime.utcnow() - ct).total_seconds() > 1: ct = datetime.utcnow() @@ -319,9 +325,10 @@ class Node(Thread): trigger_event('transfer', { 'id': item.id, 'progress': t.progress }) + ''' content = r.read() - ''' + logger.debug('download done %s', item.id) t2 = datetime.utcnow() duration = (t2-t1).total_seconds() diff --git a/oml/settings.py b/oml/settings.py index 86c5b42..2ff14e6 100644 --- a/oml/settings.py +++ b/oml/settings.py @@ -62,7 +62,7 @@ else: fd.write(sk.to_bytes()) os.chmod(key_path, 0o400) -USER_ID = vk.to_ascii(encoding='base64') +USER_ID = vk.to_ascii(encoding='base64').decode() OML_UPDATE_KEY='K55EZpPYbP3X+3mA66cztlw1sSaUMqGwfTDKQyP2qOU' if 'modules' in release and 'openmedialibrary' in release['modules']: