import time from encryptedscreenshot import EncryptedScreenshot, Signer from hashderive import HashDerivedKey import getpass, os, sys from PythonQt.QtGui import QInputDialog from PythonQt.QtCore import QSettings from seafapi import * class Processor: def configure(self,parent): pass def is_configured(self): return True def upload(self,file): pass class DummyProcessor(Processor): def is_configured(self): return False class DefaultProcessor(Processor): 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 __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() settings.beginGroup("uploaders") settings.beginGroup("seafile") 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.beginGroup("uploaders") settings.beginGroup("seafile") 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 "")) 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