124 lines
3.6 KiB
Python
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
|