kopia lustrzana https://github.com/dsblank/activitypub
refactored tornado so handler does it all
rodzic
1ff85976f8
commit
c502fe0982
6
LICENSE
6
LICENSE
|
@ -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
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Ładowanie…
Reference in New Issue