Skip to content
Snippets Groups Projects
Commit cf1fa59f authored by Kegan Dougal's avatar Kegan Dougal
Browse files

Use a sender localpart instead of a user ID.

Form the user ID at runtime instead, This gives less room for error in AS
config files since they cannot specify the domain of another HS.
parent 3470cb36
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,7 @@ from twisted.internet import defer ...@@ -21,6 +21,7 @@ from twisted.internet import defer
from synapse.api.constants import Membership from synapse.api.constants import Membership
from synapse.appservice import ApplicationService, AppServiceTransaction from synapse.appservice import ApplicationService, AppServiceTransaction
from synapse.storage.roommember import RoomsForUser from synapse.storage.roommember import RoomsForUser
from synapse.types import UserID
from ._base import SQLBaseStore from ._base import SQLBaseStore
...@@ -31,6 +32,7 @@ class ApplicationServiceStore(SQLBaseStore): ...@@ -31,6 +32,7 @@ class ApplicationServiceStore(SQLBaseStore):
def __init__(self, hs): def __init__(self, hs):
super(ApplicationServiceStore, self).__init__(hs) super(ApplicationServiceStore, self).__init__(hs)
self.hostname = hs.hostname
self.services_cache = [] self.services_cache = []
self._populate_appservice_cache( self._populate_appservice_cache(
hs.config.app_service_config_files hs.config.app_service_config_files
...@@ -200,11 +202,16 @@ class ApplicationServiceStore(SQLBaseStore): ...@@ -200,11 +202,16 @@ class ApplicationServiceStore(SQLBaseStore):
return service_list return service_list
def _load_appservice(self, as_info): def _load_appservice(self, as_info):
required_string_fields = ["url", "as_token", "hs_token", "sender"] required_string_fields = [
"url", "as_token", "hs_token", "sender_localpart"
]
for field in required_string_fields: for field in required_string_fields:
if not isinstance(as_info.get(field), basestring): if not isinstance(as_info.get(field), basestring):
raise KeyError("Required string field: '%s'", field) raise KeyError("Required string field: '%s'", field)
user = UserID(as_info["sender_localpart"], self.hostname)
user_id = user.to_string()
# namespace checks # namespace checks
if not isinstance(as_info.get("namespaces"), dict): if not isinstance(as_info.get("namespaces"), dict):
raise KeyError("Requires 'namespaces' object.") raise KeyError("Requires 'namespaces' object.")
...@@ -231,7 +238,7 @@ class ApplicationServiceStore(SQLBaseStore): ...@@ -231,7 +238,7 @@ class ApplicationServiceStore(SQLBaseStore):
url=as_info["url"], url=as_info["url"],
namespaces=as_info["namespaces"], namespaces=as_info["namespaces"],
hs_token=as_info["hs_token"], hs_token=as_info["hs_token"],
sender=as_info["sender"], sender=user_id,
id=as_info["as_token"] # the token is the only unique thing here id=as_info["as_token"] # the token is the only unique thing here
) )
......
...@@ -60,7 +60,7 @@ class ApplicationServiceStoreTestCase(unittest.TestCase): ...@@ -60,7 +60,7 @@ class ApplicationServiceStoreTestCase(unittest.TestCase):
def _add_appservice(self, as_token, url, hs_token, sender): def _add_appservice(self, as_token, url, hs_token, sender):
as_yaml = dict(url=url, as_token=as_token, hs_token=hs_token, as_yaml = dict(url=url, as_token=as_token, hs_token=hs_token,
sender=sender, namespaces={}) sender_localpart=sender, namespaces={})
# use the token as the filename # use the token as the filename
with open(as_token, 'w') as outfile: with open(as_token, 'w') as outfile:
outfile.write(yaml.dump(as_yaml)) outfile.write(yaml.dump(as_yaml))
...@@ -138,7 +138,7 @@ class ApplicationServiceTransactionStoreTestCase(unittest.TestCase): ...@@ -138,7 +138,7 @@ class ApplicationServiceTransactionStoreTestCase(unittest.TestCase):
def _add_service(self, url, as_token): def _add_service(self, url, as_token):
as_yaml = dict(url=url, as_token=as_token, hs_token="something", as_yaml = dict(url=url, as_token=as_token, hs_token="something",
sender="a_sender", namespaces={}) sender_localpart="a_sender", namespaces={})
# use the token as the filename # use the token as the filename
with open(as_token, 'w') as outfile: with open(as_token, 'w') as outfile:
outfile.write(yaml.dump(as_yaml)) outfile.write(yaml.dump(as_yaml))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment