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.
This commit is contained in:
Kegan Dougal 2015-03-31 13:48:03 +01:00
parent 3470cb36a8
commit cf1fa59f4b
2 changed files with 11 additions and 4 deletions

View file

@ -21,6 +21,7 @@ from twisted.internet import defer
from synapse.api.constants import Membership
from synapse.appservice import ApplicationService, AppServiceTransaction
from synapse.storage.roommember import RoomsForUser
from synapse.types import UserID
from ._base import SQLBaseStore
@ -31,6 +32,7 @@ class ApplicationServiceStore(SQLBaseStore):
def __init__(self, hs):
super(ApplicationServiceStore, self).__init__(hs)
self.hostname = hs.hostname
self.services_cache = []
self._populate_appservice_cache(
hs.config.app_service_config_files
@ -200,11 +202,16 @@ class ApplicationServiceStore(SQLBaseStore):
return service_list
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:
if not isinstance(as_info.get(field), basestring):
raise KeyError("Required string field: '%s'", field)
user = UserID(as_info["sender_localpart"], self.hostname)
user_id = user.to_string()
# namespace checks
if not isinstance(as_info.get("namespaces"), dict):
raise KeyError("Requires 'namespaces' object.")
@ -231,7 +238,7 @@ class ApplicationServiceStore(SQLBaseStore):
url=as_info["url"],
namespaces=as_info["namespaces"],
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
)

View file

@ -60,7 +60,7 @@ class ApplicationServiceStoreTestCase(unittest.TestCase):
def _add_appservice(self, as_token, url, hs_token, sender):
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
with open(as_token, 'w') as outfile:
outfile.write(yaml.dump(as_yaml))
@ -138,7 +138,7 @@ class ApplicationServiceTransactionStoreTestCase(unittest.TestCase):
def _add_service(self, url, as_token):
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
with open(as_token, 'w') as outfile:
outfile.write(yaml.dump(as_yaml))