Further improvements to requesting the public rooms list on a homeserver which has it set to private (#7368)
							parent
							
								
									b2dba06079
								
							
						
					
					
						commit
						2e8955f4a6
					
				|  | @ -0,0 +1 @@ | |||
| Improve error responses when accessing remote public room lists. | ||||
|  | @ -883,18 +883,37 @@ class FederationClient(FederationBase): | |||
| 
 | ||||
|     def get_public_rooms( | ||||
|         self, | ||||
|         destination, | ||||
|         limit=None, | ||||
|         since_token=None, | ||||
|         search_filter=None, | ||||
|         include_all_networks=False, | ||||
|         third_party_instance_id=None, | ||||
|         remote_server: str, | ||||
|         limit: Optional[int] = None, | ||||
|         since_token: Optional[str] = None, | ||||
|         search_filter: Optional[Dict] = None, | ||||
|         include_all_networks: bool = False, | ||||
|         third_party_instance_id: Optional[str] = None, | ||||
|     ): | ||||
|         if destination == self.server_name: | ||||
|             return | ||||
|         """Get the list of public rooms from a remote homeserver | ||||
| 
 | ||||
|         Args: | ||||
|             remote_server: The name of the remote server | ||||
|             limit: Maximum amount of rooms to return | ||||
|             since_token: Used for result pagination | ||||
|             search_filter: A filter dictionary to send the remote homeserver | ||||
|                 and filter the result set | ||||
|             include_all_networks: Whether to include results from all third party instances | ||||
|             third_party_instance_id: Whether to only include results from a specific third | ||||
|                 party instance | ||||
| 
 | ||||
|         Returns: | ||||
|             Deferred[Dict[str, Any]]: The response from the remote server, or None if | ||||
|             `remote_server` is the same as the local server_name | ||||
| 
 | ||||
|         Raises: | ||||
|             HttpResponseException: There was an exception returned from the remote server | ||||
|             SynapseException: M_FORBIDDEN when the remote server has disallowed publicRoom | ||||
|                 requests over federation | ||||
| 
 | ||||
|         """ | ||||
|         return self.transport_layer.get_public_rooms( | ||||
|             destination, | ||||
|             remote_server, | ||||
|             limit, | ||||
|             since_token, | ||||
|             search_filter, | ||||
|  |  | |||
|  | @ -15,13 +15,14 @@ | |||
| # limitations under the License. | ||||
| 
 | ||||
| import logging | ||||
| from typing import Any, Dict | ||||
| from typing import Any, Dict, Optional | ||||
| 
 | ||||
| from six.moves import urllib | ||||
| 
 | ||||
| from twisted.internet import defer | ||||
| 
 | ||||
| from synapse.api.constants import Membership | ||||
| from synapse.api.errors import Codes, HttpResponseException, SynapseError | ||||
| from synapse.api.urls import ( | ||||
|     FEDERATION_UNSTABLE_PREFIX, | ||||
|     FEDERATION_V1_PREFIX, | ||||
|  | @ -326,18 +327,25 @@ class TransportLayerClient(object): | |||
|     @log_function | ||||
|     def get_public_rooms( | ||||
|         self, | ||||
|         remote_server, | ||||
|         limit, | ||||
|         since_token, | ||||
|         search_filter=None, | ||||
|         include_all_networks=False, | ||||
|         third_party_instance_id=None, | ||||
|         remote_server: str, | ||||
|         limit: Optional[int] = None, | ||||
|         since_token: Optional[str] = None, | ||||
|         search_filter: Optional[Dict] = None, | ||||
|         include_all_networks: bool = False, | ||||
|         third_party_instance_id: Optional[str] = None, | ||||
|     ): | ||||
|         """Get the list of public rooms from a remote homeserver | ||||
| 
 | ||||
|         See synapse.federation.federation_client.FederationClient.get_public_rooms for | ||||
|         more information. | ||||
|         """ | ||||
|         if search_filter: | ||||
|             # this uses MSC2197 (Search Filtering over Federation) | ||||
|             path = _create_v1_path("/publicRooms") | ||||
| 
 | ||||
|             data = {"include_all_networks": "true" if include_all_networks else "false"} | ||||
|             data = { | ||||
|                 "include_all_networks": "true" if include_all_networks else "false" | ||||
|             }  # type: Dict[str, Any] | ||||
|             if third_party_instance_id: | ||||
|                 data["third_party_instance_id"] = third_party_instance_id | ||||
|             if limit: | ||||
|  | @ -347,9 +355,19 @@ class TransportLayerClient(object): | |||
| 
 | ||||
|             data["filter"] = search_filter | ||||
| 
 | ||||
|             response = yield self.client.post_json( | ||||
|                 destination=remote_server, path=path, data=data, ignore_backoff=True | ||||
|             ) | ||||
|             try: | ||||
|                 response = yield self.client.post_json( | ||||
|                     destination=remote_server, path=path, data=data, ignore_backoff=True | ||||
|                 ) | ||||
|             except HttpResponseException as e: | ||||
|                 if e.code == 403: | ||||
|                     raise SynapseError( | ||||
|                         403, | ||||
|                         "You are not allowed to view the public rooms list of %s" | ||||
|                         % (remote_server,), | ||||
|                         errcode=Codes.FORBIDDEN, | ||||
|                     ) | ||||
|                 raise | ||||
|         else: | ||||
|             path = _create_v1_path("/publicRooms") | ||||
| 
 | ||||
|  | @ -363,9 +381,19 @@ class TransportLayerClient(object): | |||
|             if since_token: | ||||
|                 args["since"] = [since_token] | ||||
| 
 | ||||
|             response = yield self.client.get_json( | ||||
|                 destination=remote_server, path=path, args=args, ignore_backoff=True | ||||
|             ) | ||||
|             try: | ||||
|                 response = yield self.client.get_json( | ||||
|                     destination=remote_server, path=path, args=args, ignore_backoff=True | ||||
|                 ) | ||||
|             except HttpResponseException as e: | ||||
|                 if e.code == 403: | ||||
|                     raise SynapseError( | ||||
|                         403, | ||||
|                         "You are not allowed to view the public rooms list of %s" | ||||
|                         % (remote_server,), | ||||
|                         errcode=Codes.FORBIDDEN, | ||||
|                     ) | ||||
|                 raise | ||||
| 
 | ||||
|         return response | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Andrew Morgan
						Andrew Morgan