152 lines
3.5 KiB
Python
152 lines
3.5 KiB
Python
import os, traceback
|
|
|
|
from izzylib.misc import import_from_path
|
|
from izzylib.enums import LogLevel
|
|
|
|
from .extension_api import BarksharkWebExtension
|
|
from .functions import get_app
|
|
|
|
|
|
class WebExtensions(ObjectBase):
|
|
def __init__(self, context):
|
|
super().__init__(
|
|
readonly_props = True,
|
|
context = context,
|
|
system = {},
|
|
user = {}
|
|
)
|
|
|
|
exts = [
|
|
ExtPasswordManager
|
|
]
|
|
|
|
for ext in exts:
|
|
self.load_extension(ext)
|
|
|
|
for name in os.listdir(self.app.path.extensions):
|
|
path = self.app.path.extensions.join(name)
|
|
|
|
if path.isdir and path.join('__init__.py').exists:
|
|
try:
|
|
self.load_extension(import_from_path(path).Extension, path)
|
|
except:
|
|
traceback.print_exc()
|
|
logging.error('Failed to load user extension:', path.name)
|
|
|
|
|
|
@property
|
|
def app(self):
|
|
return get_app()
|
|
|
|
|
|
@property
|
|
def db(self):
|
|
return self.app.db
|
|
|
|
|
|
@property
|
|
def window(self):
|
|
return self.app.window
|
|
|
|
|
|
def load_extension(self, ext, path=None):
|
|
extension = ext(path)
|
|
|
|
if not isinstance(extension, BarksharkWebExtension):
|
|
print(ext.__name__)
|
|
return
|
|
|
|
exttype = 'user' if path else 'system'
|
|
|
|
if None in [extension.manifest.name, extension.manifest.shortname, extension.manifest.author, extension.digest]:
|
|
raise ValueError('Missing name or author for extension')
|
|
|
|
with self.db.session as s:
|
|
if not s.get_extension(extension.digest):
|
|
options = {
|
|
'system': not path
|
|
}
|
|
|
|
if not s.put_extension(extension):
|
|
logging.error('put.extension: Extension already installed:', extension.manifest.name, 'by', extension.manifest.author)
|
|
return
|
|
|
|
getattr(self, exttype)[extension.manifest.shortname] = extension
|
|
logging.verbose(f'Loaded {exttype} extension:', extension.manifest.name)
|
|
|
|
|
|
def delete_extension(self, shortname):
|
|
extension = self.user[shortname].path.delete()
|
|
del self.user[shortname]
|
|
|
|
|
|
def handle_command(self, context, message):
|
|
cmd_name = message.get_name().lower().replace('-', '_')
|
|
|
|
assert message.get_name() not in ['command']
|
|
|
|
try:
|
|
func = getattr(self, f'parse_{cmd_name}')
|
|
|
|
except AttributeError:
|
|
return logging.error(f'Invalid command: {cmd_name}')
|
|
|
|
try:
|
|
args, kwargs = func(*message.get_parameters())
|
|
|
|
except:
|
|
traceback.print_exc()
|
|
logging.error('Error parsing data for signal:', cmd_name)
|
|
return
|
|
|
|
for ext in (*self.system.values(), *self.user.values()):
|
|
try:
|
|
getattr(ext, f'handle_{cmd_name}')(*args, **kwargs)
|
|
|
|
except:
|
|
traceback.print_exc()
|
|
logging.error('Error handling handle_form_sent for extension:', ext.name)
|
|
|
|
|
|
def parse_page_created(self, page_id):
|
|
return (page_id, ), {}
|
|
|
|
|
|
def parse_form_sent(self, stage, raw_data):
|
|
raw_data = DotDict(raw_data)
|
|
|
|
args = [
|
|
DotDict(dict(zip(raw_data['keys'], raw_data['values']))),
|
|
stage.replace('WEBKIT_FORM_SUBMISSION_WILL_', '')
|
|
]
|
|
|
|
return args, {}
|
|
|
|
|
|
def parse_console_message_sent(self, text, level, line):
|
|
log_level = level.replace('WEBKIT_CONSOLE_MESSAGE_LEVEL_', '').upper()
|
|
|
|
if log_level == 'LOG':
|
|
log_level = 'INFO'
|
|
|
|
return (text, level, line), {}
|
|
|
|
|
|
class ExtPasswordManager(BarksharkWebExtension):
|
|
def load_manifest(self):
|
|
return DotDict(
|
|
name = 'Password Manager',
|
|
shortname = 'PassMan',
|
|
description = 'Saves submitted passwords',
|
|
author = 'Zoey Mae',
|
|
website = 'https://barkshark.xyz/@izalia',
|
|
repo = 'https://git.barkshark.xyz/izaliamae/barkshark_web',
|
|
license = 'Non-Violent Public License v6+',
|
|
license_url = 'https://git.pixie.town/thufie/CNPL/raw/tag/CNPLv6/CNPL.txt'
|
|
)
|
|
|
|
|
|
def handle_form_sent(self, data, stage):
|
|
return
|
|
print(data.to_json(4))
|