This repository has been archived on 2023-02-02. You can view files and clone it, but cannot push or open issues or pull requests.
barkshark-web/barkshark_web/extensions.py

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))