2018-11-23 16:53:09 +01:00

124 lines
3.6 KiB
Python

import time
from encryptedscreenshot import EncryptedScreenshot, Signer
from hashderive import HashDerivedKey
import getpass
import os
import sys
from PythonQt.QtGui import QInputDialog
from PythonQt.QtCore import QSettings
from seafapi import *
class Processor:
def name(self):
pass
def configure(self, parent):
pass
def is_configured(self):
return True
def load_settings(self, settings):
pass
def save_settings(self, settings):
pass
def upload(self, file, name):
pass
class DummyProcessor(Processor):
def name(self):
return None
def is_configured(self):
return False
class DefaultProcessor(Processor):
def name(self):
return "default"
def __init__(self, seaf_lib, lib_path):
self.seaf_lib = seaf_lib
self.lib_path = lib_path
def upload(self, file, name):
return self.seaf_lib.upload(file, name, self.lib_path).share()
class EncryptedProcessor(Processor):
def name(self):
return "enc"
def __init__(self, seaf_lib, lib_path):
self.seaf_lib = seaf_lib
self.lib_path = lib_path
self.host = None
self.derived_key = HashDerivedKey(os.urandom(32))
self.load_settings()
def load_settings(self, settings=QSettings()):
self.host = settings.value("encscreen-url", None)
if settings.value("encscreen-derived-key", None):
self.derived_key = HashDerivedKey.from_hex(
settings.value("encscreen-derived-key", None))
settings.endGroup()
settings.endGroup()
def save_settings(self, settings=QSettings()):
settings.setValue("encscreen-url", self.host)
if self.derived_key:
settings.setValue(self.derived_key.master_hex())
settings.endGroup()
settings.endGroup()
def is_configured(self):
return self.host is not None and self.host != ""
def configure(self, parent):
self.host = QInputDialog.getText(parent, 'Encscreen Server Setup', 'Enter server url (ex. https://servertld/s#%id%key):',
text=(self.host or "https://screens.shimun.net/s#%id%key"))
master = QInputDialog.getText(parent, 'Encscreen Master Key Setup', 'Enter master key (hex encoded):', text=(
self.derived_key.master_hex() if self.derived_key else "<random>"))
try:
self.derived_key = HashDerivedKey.from_hex(master)
except:
self.derived_key = HashDerivedKey(os.urandom(32))
self.save_settings()
def upload(self, file, name):
def derive():
seed = os.urandom(16)
(_, key_meta) = self.derived_key.derive_metadata(seed)
return (self.derived_key.derive_hex(seed)[0:16], key_meta)
(key, key_meta) = derive()
enrypted = EncryptedScreenshot(metadata={
"owner": getpass.getuser(),
"format": str(file).split('.')[-1],
"title": name,
"timestamp": int(time.time() * 1000),
"size": os.stat(file).st_size,
"public": key_meta
}, password=key, signer=Signer.default())
tmpHandle = open(file + "c", 'wb')
tmpHandle.write(enrypted.assemble(file))
tmpHandle.close()
seaf_file = self.seaf_lib.upload(
file + "c", name + ".enc", self.lib_path)
if not seaf_file:
return
seaf_link = seaf_file.share()
if seaf_link:
id = str(seaf_link).split('/')[-2]
return self.host.replace('%id', id).replace('%key', "%s" % enrypted.password)
else:
return False