Refactor for new webserver Managers

master
Douglas Blank 2018-07-21 08:07:43 -04:00
rodzic 88e1881cda
commit cab30dae3b
7 zmienionych plików z 91 dodań i 15 usunięć

Wyświetl plik

@ -1,3 +1,2 @@
from .manager import Manager
from .classes import * from .classes import *
from ._version import __version__, VERSION from ._version import __version__, VERSION

Wyświetl plik

@ -147,7 +147,7 @@ class ObjectId(object):
>>> import datetime >>> import datetime
>>> gen_time = datetime.datetime(2010, 1, 1) >>> gen_time = datetime.datetime(2010, 1, 1)
>>> early = ObjectId.from_datetime(gen_time) >>> early = ObjectId.from_datetime(gen_time)
>>> from activitypub import Manager >>> from activitypub.manager import Manager
>>> from activitypub.database import DummyDatabase >>> from activitypub.database import DummyDatabase
>>> m = Manager(database=DummyDatabase()) >>> m = Manager(database=DummyDatabase())
>>> n = m.Note(_id=early, attributedTo="alyssa") >>> n = m.Note(_id=early, attributedTo="alyssa")

Wyświetl plik

@ -46,12 +46,12 @@ class ActivityPubBase():
if attr is None: if attr is None:
raise Exception("variable depends on field that is empty: %s" % attr_name) raise Exception("variable depends on field that is empty: %s" % attr_name)
if isinstance(attr, str) and "$" in attr: if isinstance(attr, str) and "$" in attr:
setattr(self, attr_name, self.manager.expand_defaults(attr)) setattr(self, attr_name, self.manager.expand_defaults(attr, self))
def topological_sort(self, data): def topological_sort(self, data):
""" """
>>> from activitypub import Manager >>> from activitypub.manager import Manager
>>> manager = Manager() >>> manager = Manager()
>>> manager.Person(id="alyssa").to_dict() >>> manager.Person(id="alyssa").to_dict()
{'@context': 'https://www.w3.org/ns/activitystreams', 'endpoints': {}, 'followers': 'https://example.com/alyssa/followers', 'following': 'https://example.com/alyssa/following', 'id': 'https://example.com/alyssa', 'inbox': 'https://example.com/alyssa/inbox', 'liked': 'https://example.com/alyssa/liked', 'likes': 'https://example.com/alyssa/likes', 'outbox': 'https://example.com/alyssa/outbox', 'type': 'Person', 'url': 'https://example.com/alyssa'} {'@context': 'https://www.w3.org/ns/activitystreams', 'endpoints': {}, 'followers': 'https://example.com/alyssa/followers', 'following': 'https://example.com/alyssa/following', 'id': 'https://example.com/alyssa', 'inbox': 'https://example.com/alyssa/inbox', 'liked': 'https://example.com/alyssa/liked', 'likes': 'https://example.com/alyssa/likes', 'outbox': 'https://example.com/alyssa/outbox', 'type': 'Person', 'url': 'https://example.com/alyssa'}
@ -184,7 +184,7 @@ class Organization(Actor):
class Person(Actor): class Person(Actor):
""" """
>>> from activitypub import Manager >>> from activitypub.manager import Manager
>>> m = Manager() >>> m = Manager()
>>> p = m.Person() >>> p = m.Person()
>>> p.icon = "image.svg" >>> p.icon = "image.svg"

Wyświetl plik

@ -0,0 +1,4 @@
from .base import Manager
from .flaskman import FlaskManager
from .tornadoman import TornadoManager

Wyświetl plik

@ -1,3 +1,5 @@
import binascii
import os
import uuid import uuid
class Manager(): class Manager():
@ -5,7 +7,7 @@ class Manager():
Manager class that ties together ActivityPub objects, defaults, Manager class that ties together ActivityPub objects, defaults,
and a database. and a database.
>>> from activitypub import Manager >>> from activitypub.manager import Manager
>>> from activitypub.database import DummyDatabase >>> from activitypub.database import DummyDatabase
>>> db = DummyDatabase() >>> db = DummyDatabase()
>>> manager = Manager(database=db) >>> manager = Manager(database=db)
@ -14,7 +16,7 @@ class Manager():
app_name = "activitypub" app_name = "activitypub"
version = "1.0.0" version = "1.0.0"
def __init__(self, context=None, defaults=None, database=None): def __init__(self, context=None, defaults=None, database=None):
from .classes import ActivityPubBase from ..classes import ActivityPubBase
self.callback = lambda box, activity_id: None self.callback = lambda box, activity_id: None
self.context = context self.context = context
self.defaults = defaults or self.make_defaults() self.defaults = defaults or self.make_defaults()
@ -61,7 +63,7 @@ class Manager():
self.version, self.version,
self.expand_defaults("$SCHEME/$HOST")) self.expand_defaults("$SCHEME/$HOST"))
def expand_defaults(self, obj, string): def expand_defaults(self, string, obj=None):
""" """
Expand a string with defaults. Expand a string with defaults.
""" """
@ -71,18 +73,19 @@ class Manager():
string = string.replace(key, self.defaults[key]()) string = string.replace(key, self.defaults[key]())
else: else:
string = string.replace(key, self.defaults[key]) string = string.replace(key, self.defaults[key])
for key in self.parse(string): if obj:
if key.startswith("$"): for key in self.parse(string):
if getattr(obj, "ap_" + key[1:]) is None: if key.startswith("$"):
raise Exception("expansion requires %s" % key[1:]) if getattr(obj, "ap_" + key[1:]) is None:
string = string.replace(key, getattr(obj, "ap_" + key[1:])) raise Exception("expansion requires %s" % key[1:])
string = string.replace(key, getattr(obj, "ap_" + key[1:]))
return string return string
def parse(self, string): def parse(self, string):
""" """
Parse a string delimited by non-alpha, non-$ symbols. Parse a string delimited by non-alpha, non-$ symbols.
>>> from activitypub import Manager >>> from activitypub.manager import Manager
>>> m = Manager() >>> m = Manager()
>>> m.parse("apple/banana/$variable") >>> m.parse("apple/banana/$variable")
['apple', 'banana', '$variable'] ['apple', 'banana', '$variable']
@ -104,7 +107,7 @@ class Manager():
return retval return retval
def from_dict(self, data): def from_dict(self, data):
from .classes import ActivityPubBase from ..classes import ActivityPubBase
return ActivityPubBase.from_dict(data) return ActivityPubBase.from_dict(data)
def to_list(self, item): def to_list(self, item):
@ -193,3 +196,45 @@ class Manager():
response.raise_for_status() response.raise_for_status()
return response.json() return response.json()
def get_secret_key(self, name):
filename = "%s.key" % name
if not os.path.exists():
key = binascii.hexlify(os.urandom(32)).decode("utf-8")
with open(filename, "w+") as f:
f.write(key)
return key
else:
with open(key_path) as f:
return f.read()
def get_rsa_key(self, owner, user, domain):
""""
Loads or generates an RSA key.
"""
k = Key(owner)
user = user.replace(".", "_")
domain = domain.replace(".", "_")
key_path = os.path.join(KEY_DIR, f"key_{user}_{domain}.pem")
if os.path.isfile(key_path):
with open(key_path) as f:
privkey_pem = f.read()
k.load(privkey_pem)
else:
k.new()
with open(key_path, "w") as f:
f.write(k.privkey_pem)
return k
def after_request(self, f):
"""
Decorator
"""
return f
def template_filter(self):
"""
Decorator
"""
def decorator(f):
return f
return decorator

Wyświetl plik

@ -0,0 +1,22 @@
from flask import (Flask, Response)
from .base import Manager
class FlaskManager(Manager):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.app = Flask(__name__)
def after_request(self, f):
"""
Decorator
"""
self.app.after_request(f)
def template_filter(self):
"""
Decorator
"""
def decorator(f):
self.app.template_filter()(f)
return decorator

Wyświetl plik

@ -0,0 +1,6 @@
from .base import Manager
class TornadoManager(Manager):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
#self.app = Flask(__name__)