Add federation profile endpoints
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user