|
|
@@ -40,6 +40,7 @@ from synapse.appservice import ( |
|
|
|
from synapse.events import EventBase |
|
|
|
from synapse.events.utils import SerializeEventConfig, serialize_event |
|
|
|
from synapse.http.client import SimpleHttpClient, is_unknown_endpoint |
|
|
|
from synapse.logging import opentracing |
|
|
|
from synapse.types import DeviceListUpdates, JsonDict, ThirdPartyInstanceID |
|
|
|
from synapse.util.caches.response_cache import ResponseCache |
|
|
|
|
|
|
@@ -125,6 +126,17 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
hs.get_clock(), "as_protocol_meta", timeout_ms=HOUR_IN_MS |
|
|
|
) |
|
|
|
|
|
|
|
def _get_headers(self, service: "ApplicationService") -> Dict[bytes, List[bytes]]: |
|
|
|
"""This makes sure we have always the auth header and opentracing headers set.""" |
|
|
|
|
|
|
|
# This is also ensured before in the functions. However this is needed to please |
|
|
|
# the typechecks. |
|
|
|
assert service.hs_token is not None |
|
|
|
|
|
|
|
headers = {b"Authorization": [b"Bearer " + service.hs_token.encode("ascii")]} |
|
|
|
opentracing.inject_header_dict(headers, check_destination=False) |
|
|
|
return headers |
|
|
|
|
|
|
|
async def query_user(self, service: "ApplicationService", user_id: str) -> bool: |
|
|
|
if service.url is None: |
|
|
|
return False |
|
|
@@ -136,10 +148,11 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
args = None |
|
|
|
if self.config.use_appservice_legacy_authorization: |
|
|
|
args = {"access_token": service.hs_token} |
|
|
|
|
|
|
|
response = await self.get_json( |
|
|
|
f"{service.url}{APP_SERVICE_PREFIX}/users/{urllib.parse.quote(user_id)}", |
|
|
|
args, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
if response is not None: # just an empty json object |
|
|
|
return True |
|
|
@@ -162,10 +175,11 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
args = None |
|
|
|
if self.config.use_appservice_legacy_authorization: |
|
|
|
args = {"access_token": service.hs_token} |
|
|
|
|
|
|
|
response = await self.get_json( |
|
|
|
f"{service.url}{APP_SERVICE_PREFIX}/rooms/{urllib.parse.quote(alias)}", |
|
|
|
args, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
if response is not None: # just an empty json object |
|
|
|
return True |
|
|
@@ -203,10 +217,11 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
**fields, |
|
|
|
b"access_token": service.hs_token, |
|
|
|
} |
|
|
|
|
|
|
|
response = await self.get_json( |
|
|
|
f"{service.url}{APP_SERVICE_PREFIX}/thirdparty/{kind}/{urllib.parse.quote(protocol)}", |
|
|
|
args=args, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
if not isinstance(response, list): |
|
|
|
logger.warning( |
|
|
@@ -243,10 +258,11 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
args = None |
|
|
|
if self.config.use_appservice_legacy_authorization: |
|
|
|
args = {"access_token": service.hs_token} |
|
|
|
|
|
|
|
info = await self.get_json( |
|
|
|
f"{service.url}{APP_SERVICE_PREFIX}/thirdparty/protocol/{urllib.parse.quote(protocol)}", |
|
|
|
args, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
|
|
|
|
if not _is_valid_3pe_metadata(info): |
|
|
@@ -283,7 +299,7 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
await self.post_json_get_json( |
|
|
|
uri=f"{service.url}{APP_SERVICE_PREFIX}/ping", |
|
|
|
post_json={"transaction_id": txn_id}, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
|
|
|
|
async def push_bulk( |
|
|
@@ -364,7 +380,7 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
f"{service.url}{APP_SERVICE_PREFIX}/transactions/{urllib.parse.quote(str(txn_id))}", |
|
|
|
json_body=body, |
|
|
|
args=args, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
if logger.isEnabledFor(logging.DEBUG): |
|
|
|
logger.debug( |
|
|
@@ -437,7 +453,7 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
response = await self.post_json_get_json( |
|
|
|
uri, |
|
|
|
body, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
except HttpResponseException as e: |
|
|
|
# The appservice doesn't support this endpoint. |
|
|
@@ -498,7 +514,7 @@ class ApplicationServiceApi(SimpleHttpClient): |
|
|
|
response = await self.post_json_get_json( |
|
|
|
uri, |
|
|
|
query, |
|
|
|
headers={"Authorization": [f"Bearer {service.hs_token}"]}, |
|
|
|
headers=self._get_headers(service), |
|
|
|
) |
|
|
|
except HttpResponseException as e: |
|
|
|
# The appservice doesn't support this endpoint. |
|
|
|