Add federation profile endpoints

This commit is contained in:
Erik Johnston 2016-10-27 11:02:03 +01:00
parent f83e0c1a27
commit 60d8a877d0
6 changed files with 58 additions and 7 deletions

View file

@ -878,6 +878,10 @@ class FederationClient(FederationBase):
defer.returnValue(signed_events)
def get_profile(self, user_id, persona=None, key=None):
destination = get_domain_from_id(user_id)
return self.transport_layer.get_profile(destination, user_id, persona, key)
def event_from_pdu_json(self, pdu_json, outlier=False):
event = FrozenEvent(
pdu_json

View file

@ -442,6 +442,17 @@ class FederationServer(FederationBase):
"events": [ev.get_pdu_json(time_now) for ev in missing_events],
})
def on_profile_request(self, user_id, persona, key):
if not self.hs.is_mine_id(user_id):
raise SynapseError(400, "Not a local user")
if key is not None:
return self.store.get_profile_key(user_id, persona, key)
elif persona is not None:
return self.store.get_persona_profile(user_id, persona)
else:
return self.store.get_full_profile(user_id)
@log_function
def on_openid_userinfo(self, token):
ts_now_ms = self._clock.time_msec()

View file

@ -396,3 +396,13 @@ class TransportLayerClient(object):
)
defer.returnValue(content)
def get_profile(self, destination, user_id, persona=None, key=None):
if key:
path = PREFIX + "/profile/%s/%s/%s" % (user_id, persona, key)
elif persona:
path = PREFIX + "/profile/%s/%s/" % (user_id, persona)
else:
path = PREFIX + "/profile/%s/" % (user_id,)
return self.client.get_json(destination, path)

View file

@ -578,6 +578,19 @@ class FederationVersionServlet(BaseFederationServlet):
}))
class FederationProfileServlet(BaseFederationServlet):
# This matches all three of:
# - /profile/@foo:bar/
# - /profile/@foo:bar/default/
# - /profile/@foo:bar/default/m.displayname
PATH = "/profile/(?P<user_id>[^/]+)/((?P<persona>[^/]+)/(?P<key>[^/]+)?)?$"
@defer.inlineCallbacks
def on_GET(self, origin, content, query, user_id, persona, key):
profile = yield self.handler.on_profile_request(user_id, persona, key)
defer.returnValue((200, profile))
SERVLET_CLASSES = (
FederationSendServlet,
FederationPullServlet,
@ -602,6 +615,7 @@ SERVLET_CLASSES = (
OpenIdUserInfo,
PublicRoomList,
FederationVersionServlet,
FederationProfileServlet,
)

View file

@ -182,15 +182,27 @@ class ProfileHandler(BaseHandler):
)
def get_full_profile_for_user(self, user_id):
return self.store.get_full_profile(user_id)
if self.hs.is_mine_id(user_id):
return self.store.get_full_profile(user_id)
else:
return self.federation.get_profile(user_id)
def get_persona_profile_for_user(self, user_id, persona):
return self.store.get_persona_profile(user_id, persona)
if self.hs.is_mine_id(user_id):
return self.store.get_persona_profile(user_id, persona)
else:
return self.federation.get_profile(user_id, persona)
def get_profile_key_for_user(self, user_id, persona, key):
return self.store.get_profile_key(user_id, persona, key)
if self.hs.is_mine_id(user_id):
return self.store.get_profile_key(user_id, persona, key)
else:
return self.federation.get_profile(user_id, persona, key)
def update_profile_key(self, user_id, persona, key, content):
return self.store.update_profile_key(
user_id, persona, key, content
)
if self.hs.is_mine_id(user_id):
return self.store.update_profile_key(
user_id, persona, key, content
)
else:
raise AuthError("Cannot set a remote profile")

View file

@ -74,7 +74,7 @@ class ProfileStore(SQLBaseStore):
content = ujson.loads(row["content"])
personas.setdefault(
row["persona"], {"rows": {}}
)["entries"][row["key"]] = content
)["rows"][row["key"]] = content
defer.returnValue(profile)