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.pull/116/head
parent
3470cb36a8
commit
cf1fa59f4b
|
@ -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):
|
||||||
|
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
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))
|
||||||
|
|
Loading…
Reference in New Issue