refactored tornado so handler does it all

master
Douglas Blank 2018-07-27 18:09:58 -04:00
rodzic 1ff85976f8
commit c502fe0982
3 zmienionych plików z 99 dodań i 30 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
This activitypub Python library is licensed under the MPL 2.0 (see
below). In addition, there may be other code licensed under slightly
different, but compatible, licenses. Each such compatible file will
contain its own license.
==================================
Mozilla Public License Version 2.0 Mozilla Public License Version 2.0
================================== ==================================

Wyświetl plik

@ -285,6 +285,52 @@ def route_webfinger(self):
return self.error(404) return self.error(404)
""" """
From: https://github.com/tootsuite/mastodon/blob/master/spec/fixtures/requests/activitypub-webfinger.txt
HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/jrd+json; charset=utf-8
X-Content-Type-Options: nosniff
Date: Sun, 17 Sep 2017 06:22:50 GMT
{"subject":"acct:foo@ap.example.com","aliases":["https://ap.example.com/@foo","https://ap.example.com/users/foo"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ap.example.com/@foo"},{"rel":"http://schemas.google.com/g/2010#updates-from","type":"application/atom+xml","href":"https://ap.example.com/users/foo.atom"},{"rel":"self","type":"application/activity+json","href":"https://ap.example.com/users/foo"},{"rel":"salmon","href":"https://ap.example.com/api/salmon/1"},{"rel":"magic-public-key","href":"data:application/magic-public-key,RSA.u3L4vnpNLzVH31MeWI394F0wKeJFsLDAsNXGeOu0QF2x-h1zLWZw_agqD2R3JPU9_kaDJGPIV2Sn5zLyUA9S6swCCMOtn7BBR9g9sucgXJmUFB0tACH2QSgHywMAybGfmSb3LsEMNKsGJ9VsvYoh8lDET6X4Pyw-ZJU0_OLo_41q9w-OrGtlsTm_PuPIeXnxa6BLqnDaxC-4IcjG_FiPahNCTINl_1F_TgSSDZ4Taf4U9XFEIFw8wmgploELozzIzKq-t8nhQYkgAkt64euWpva3qL5KD1mTIZQEP-LZvh3s2WHrLi3fhbdRuwQ2c0KkJA2oSTFPDpqqbPGZ3QvuHQ==.AQAB"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ap.example.com/authorize_follow?acct={uri}"}]}
From: https://mastodon.social/.well-known/webfinger?resource=acct:dsblank@mastodon.social
{"subject": "acct:dsblank@mastodon.social",
"aliases": ["https://mastodon.social/@dsblank",
"https://mastodon.social/users/dsblank"],
"links": [ {"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://mastodon.social/@dsblank"},
{"rel": "http://schemas.google.com/g/2010#updates-from",
"type":"application/atom+xml",
"href":"https://mastodon.social/users/dsblank.atom"},
{"rel":"self",
"type":"application/activity+json",
"href":"https://mastodon.social/users/dsblank"},
{"rel":"salmon",
"href":"https://mastodon.social/api/salmon/368878"},
{"rel":"magic-public-key",
"href":"data:application/magic-public-key,RSA.3L4-ufnddoOSl-YS6pel0q-tz01cjutYsl6sVM3QkJBX9T3Mp9MCarbbh5xEfttxIPCzZZAv1Yv_VRyOsexPi7CfF8z2pOjaZ-HD7KrwovhgiiL8YIwd_6o3qc5eCUibE56DyemUfqxWWNcvJH64D57cF0sMaZpx95DSQ5JKkcIq2M_M1Wm5AQZH5NIKnVyR55eOH7zN09mvZrK_S93b5DYaeBIjNwgtTBRDj4qqNtRtF5SM3_XmdWskA_KArP586W7CI4ZK538WbnT09JNA3d7TJQrwLXwkXJMX1nQARKQfyjbRbg2lXJcdHV_0pJqnJa9p24O0ysOtPN6LqL6v5w==.AQAB"},
{"rel":"http://ostatus.org/schema/1.0/subscribe",
"template":"https://mastodon.social/authorize_follow?acct={uri}"}
]
}
From: https://a4.io/.well-known/webfinger?resource=acct:t@a4.io
{"subject": "acct:t@a4.io",
"aliases": ["https://a4.io"],
"links": [{"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html", "href": "https://a4.io"},
{"rel": "self", "type": "application/activity+json", "href": "https://a4.io"},
{"rel": "http://ostatus.org/schema/1.0/subscribe", "template": "https://a4.io/authorize_follow?profile={uri}"},
{"rel": "magic-public-key", "href": "data:application/magic-public-key,RSA.zTYvKgiDIanj3XnpoGPdVmwq0A_FPqcoJXqMpNcIOVzWcOGK1WkxLeOnCcXhnxNnKpnXQIjU8MRz2y1tOfVEZHmII_hnOh2hcS3K5Sd_yHWnQkPgfnSBzn46mx3m8Nwi49qOZ0--ARGzVhOaBJhuUX2MvBrHl2A2GRjRtTnzACqFxB-ezZNGG6Ymvzv7CTCPXKUlygNqDy0Hi48SM_2LSmgotz5L0Vng3q33c9XeGR3YAiUlCevCDTyvIAkzN4hlP5zYezp_Bp7CkoY3teIvCaxZS5n92I_Oj2Xyq60v0MeXiqyXioGNPnUB8QtFV20kEhdwJik0_DubiRP_2Iy65w==.AQAB"},
{"href": "https://sos-ch-dk-2.exo.io/hexaninja/hexaninja-alpha.png", "rel": "http://webfinger.net/rel/avatar", "type": "image/png"}]
}
From https://willnorris.com/.well-known/webfinger?resource=acct:will@willnorris.com:
{ {
"subject": "acct:will@willnorris.com", "subject": "acct:will@willnorris.com",

Wyświetl plik

@ -10,6 +10,10 @@ import re
from .base import Manager, wrap_function, app from .base import Manager, wrap_function, app
from ..classes import ActivityPubBase from ..classes import ActivityPubBase
class Container():
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def make_handler(f, manager, methods, route, kws): def make_handler(f, manager, methods, route, kws):
""" """
Make a Tornado Handler Make a Tornado Handler
@ -25,14 +29,47 @@ def make_handler(f, manager, methods, route, kws):
A handler that replicates some of the methods in Manager A handler that replicates some of the methods in Manager
so that developers don't need to know. so that developers don't need to know.
""" """
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._filters = None
manager.template_env.filters.update(self.get_filters())
def get_template_namespace(self):
ns = super().get_template_namespace()
ns.update({
'config': 'John Doe',
})
return ns
def __getattr__(self, attr):
return getattr(manager, attr)
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
self.database = manager.database
for name in ActivityPubBase.CLASSES:
setattr(self, name, getattr(manager, name))
return f(self, *args, **kwargs) return f(self, *args, **kwargs)
def get_filters(self):
if self._filters is None:
self._filters = {f.__name__: wrap_function(self, f)
for f in app.get_filters()}
return self._filters
def _render_template(self, name, **kwargs):
tornado.log.logging.warning("kwargs: %s" % list(kwargs.keys()))
values = {
"request": Container(path=self.request.path,
args={k: self.get_argument(k) for k in self.request.arguments}),
"session": Container(logged_in=True),
"config": self.config,
}
for f in app.get_context_processors():
values.update(f(self))
values.update(kwargs)
template = manager.template_env.get_template(name)
tornado.log.logging.warning("values: %s" % list(values.keys()))
return template.render(**values)
def render_template(self, name, **kwargs): def render_template(self, name, **kwargs):
self.write(manager.render_template(name, **kwargs)) self.write(self._render_template(name, **kwargs))
def render_json(self, obj): def render_json(self, obj):
self.write(obj) # will set header to JSON mimetype self.write(obj) # will set header to JSON mimetype
@ -44,8 +81,13 @@ def make_handler(f, manager, methods, route, kws):
def url_for(self, name): def url_for(self, name):
return manager.url_for(name) return manager.url_for(name)
#@property
#def request(self):
# return Request("/test", {k: self.get_argument(k) for k in self.request.arguments})
# Get for free: # Get for free:
# * get_argument # * get_argument
# * request
return Handler return Handler
@ -56,35 +98,10 @@ class TornadoManager(Manager):
self.template_env = jinja2.Environment( self.template_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(self.get_template_folder())) loader=jinja2.FileSystemLoader(self.get_template_folder()))
def get_filters(self):
if self._filters is None:
self._filters = {f.__name__: wrap_function(self, f)
for f in app._data.filters}
return self._filters
def render_template(self, name, **kwargs):
values = {}
for f in app.get_context_processors():
values.update(f(self))
values.update(kwargs)
filters = self.get_filters()
tornado.log.logging.warning("%s" % list(filters.keys()))
self.template_env.filters.update(filters)
template = self.template_env.get_template(name)
return template.render(config=self.config, **values)
## TODO: move to app.Data
#def login_required():
# tornado.web.authenticated
@property
def request(self):
return request
def run(self): def run(self):
self.config["CSS"] = self.CSS self.config["CSS"] = self.CSS
routes = [] routes = []
for route, methods, f, kwargs in app._data.routes: for route, methods, f, kwargs in app.get_routes():
re_route = re.sub("\<[^\>]*\>", r"([^/]*)", route) re_route = re.sub("\<[^\>]*\>", r"([^/]*)", route)
routes.append((re_route, make_handler(f, self, methods, route, kwargs))) routes.append((re_route, make_handler(f, self, methods, route, kwargs)))
self.app = Application(routes) self.app = Application(routes)