No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

213 líneas
6.9 KiB

  1. # Copyright 2014-2016 OpenMarket Ltd
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. """ This module contains REST servlets to do with profile: /profile/<paths> """
  15. from http import HTTPStatus
  16. from typing import TYPE_CHECKING, Tuple
  17. from synapse.api.errors import Codes, SynapseError
  18. from synapse.http.server import HttpServer
  19. from synapse.http.servlet import (
  20. RestServlet,
  21. parse_boolean,
  22. parse_json_object_from_request,
  23. )
  24. from synapse.http.site import SynapseRequest
  25. from synapse.rest.client._base import client_patterns
  26. from synapse.types import JsonDict, UserID
  27. if TYPE_CHECKING:
  28. from synapse.server import HomeServer
  29. def _read_propagate(hs: "HomeServer", request: SynapseRequest) -> bool:
  30. # This will always be set by the time Twisted calls us.
  31. assert request.args is not None
  32. propagate = True
  33. if hs.config.experimental.msc4069_profile_inhibit_propagation:
  34. do_propagate = request.args.get(b"org.matrix.msc4069.propagate")
  35. if do_propagate is not None:
  36. propagate = parse_boolean(
  37. request, "org.matrix.msc4069.propagate", default=False
  38. )
  39. return propagate
  40. class ProfileDisplaynameRestServlet(RestServlet):
  41. PATTERNS = client_patterns("/profile/(?P<user_id>[^/]*)/displayname", v1=True)
  42. CATEGORY = "Event sending requests"
  43. def __init__(self, hs: "HomeServer"):
  44. super().__init__()
  45. self.hs = hs
  46. self.profile_handler = hs.get_profile_handler()
  47. self.auth = hs.get_auth()
  48. async def on_GET(
  49. self, request: SynapseRequest, user_id: str
  50. ) -> Tuple[int, JsonDict]:
  51. requester_user = None
  52. if self.hs.config.server.require_auth_for_profile_requests:
  53. requester = await self.auth.get_user_by_req(request)
  54. requester_user = requester.user
  55. if not UserID.is_valid(user_id):
  56. raise SynapseError(
  57. HTTPStatus.BAD_REQUEST, "Invalid user id", Codes.INVALID_PARAM
  58. )
  59. user = UserID.from_string(user_id)
  60. await self.profile_handler.check_profile_query_allowed(user, requester_user)
  61. displayname = await self.profile_handler.get_displayname(user)
  62. ret = {}
  63. if displayname is not None:
  64. ret["displayname"] = displayname
  65. return 200, ret
  66. async def on_PUT(
  67. self, request: SynapseRequest, user_id: str
  68. ) -> Tuple[int, JsonDict]:
  69. requester = await self.auth.get_user_by_req(request, allow_guest=True)
  70. user = UserID.from_string(user_id)
  71. is_admin = await self.auth.is_server_admin(requester)
  72. content = parse_json_object_from_request(request)
  73. try:
  74. new_name = content["displayname"]
  75. except Exception:
  76. raise SynapseError(
  77. code=400,
  78. msg="Unable to parse name",
  79. errcode=Codes.BAD_JSON,
  80. )
  81. propagate = _read_propagate(self.hs, request)
  82. await self.profile_handler.set_displayname(
  83. user, requester, new_name, is_admin, propagate=propagate
  84. )
  85. return 200, {}
  86. class ProfileAvatarURLRestServlet(RestServlet):
  87. PATTERNS = client_patterns("/profile/(?P<user_id>[^/]*)/avatar_url", v1=True)
  88. CATEGORY = "Event sending requests"
  89. def __init__(self, hs: "HomeServer"):
  90. super().__init__()
  91. self.hs = hs
  92. self.profile_handler = hs.get_profile_handler()
  93. self.auth = hs.get_auth()
  94. async def on_GET(
  95. self, request: SynapseRequest, user_id: str
  96. ) -> Tuple[int, JsonDict]:
  97. requester_user = None
  98. if self.hs.config.server.require_auth_for_profile_requests:
  99. requester = await self.auth.get_user_by_req(request)
  100. requester_user = requester.user
  101. if not UserID.is_valid(user_id):
  102. raise SynapseError(
  103. HTTPStatus.BAD_REQUEST, "Invalid user id", Codes.INVALID_PARAM
  104. )
  105. user = UserID.from_string(user_id)
  106. await self.profile_handler.check_profile_query_allowed(user, requester_user)
  107. avatar_url = await self.profile_handler.get_avatar_url(user)
  108. ret = {}
  109. if avatar_url is not None:
  110. ret["avatar_url"] = avatar_url
  111. return 200, ret
  112. async def on_PUT(
  113. self, request: SynapseRequest, user_id: str
  114. ) -> Tuple[int, JsonDict]:
  115. requester = await self.auth.get_user_by_req(request)
  116. user = UserID.from_string(user_id)
  117. is_admin = await self.auth.is_server_admin(requester)
  118. content = parse_json_object_from_request(request)
  119. try:
  120. new_avatar_url = content["avatar_url"]
  121. except KeyError:
  122. raise SynapseError(
  123. 400, "Missing key 'avatar_url'", errcode=Codes.MISSING_PARAM
  124. )
  125. propagate = _read_propagate(self.hs, request)
  126. await self.profile_handler.set_avatar_url(
  127. user, requester, new_avatar_url, is_admin, propagate=propagate
  128. )
  129. return 200, {}
  130. class ProfileRestServlet(RestServlet):
  131. PATTERNS = client_patterns("/profile/(?P<user_id>[^/]*)", v1=True)
  132. CATEGORY = "Event sending requests"
  133. def __init__(self, hs: "HomeServer"):
  134. super().__init__()
  135. self.hs = hs
  136. self.profile_handler = hs.get_profile_handler()
  137. self.auth = hs.get_auth()
  138. async def on_GET(
  139. self, request: SynapseRequest, user_id: str
  140. ) -> Tuple[int, JsonDict]:
  141. requester_user = None
  142. if self.hs.config.server.require_auth_for_profile_requests:
  143. requester = await self.auth.get_user_by_req(request)
  144. requester_user = requester.user
  145. if not UserID.is_valid(user_id):
  146. raise SynapseError(
  147. HTTPStatus.BAD_REQUEST, "Invalid user id", Codes.INVALID_PARAM
  148. )
  149. user = UserID.from_string(user_id)
  150. await self.profile_handler.check_profile_query_allowed(user, requester_user)
  151. displayname = await self.profile_handler.get_displayname(user)
  152. avatar_url = await self.profile_handler.get_avatar_url(user)
  153. ret = {}
  154. if displayname is not None:
  155. ret["displayname"] = displayname
  156. if avatar_url is not None:
  157. ret["avatar_url"] = avatar_url
  158. return 200, ret
  159. def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
  160. ProfileDisplaynameRestServlet(hs).register(http_server)
  161. ProfileAvatarURLRestServlet(hs).register(http_server)
  162. ProfileRestServlet(hs).register(http_server)