Check users in our table aren't on a different domain to the one we're configured with to try & fix SYN-266

This commit is contained in:
David Baker 2015-04-24 18:11:21 +01:00
parent f46eee838a
commit a7b51f4539
2 changed files with 37 additions and 0 deletions

View File

@ -26,6 +26,7 @@ from synapse.server import HomeServer
from synapse.python_dependencies import check_requirements from synapse.python_dependencies import check_requirements
from twisted.internet import reactor from twisted.internet import reactor
from twisted.internet import defer
from twisted.application import service from twisted.application import service
from twisted.enterprise import adbapi from twisted.enterprise import adbapi
from twisted.web.resource import Resource from twisted.web.resource import Resource
@ -241,6 +242,22 @@ class SynapseHomeServer(HomeServer):
) )
logger.info("Metrics now running on 127.0.0.1 port %d", config.metrics_port) logger.info("Metrics now running on 127.0.0.1 port %d", config.metrics_port)
@defer.inlineCallbacks
def post_startup_check(self):
all_users_native = yield self.get_datastore().all_users_on_domain(
self.hostname
)
if not all_users_native:
sys.stderr.write(
"\n"
"******************************************************\n"
"Found users in database not native to %s!\n"
"You cannot changed a synapse server_name after it's been configured\n"
"******************************************************\n"
"\n"
)
reactor.stop()
def get_version_string(): def get_version_string():
try: try:
@ -399,6 +416,8 @@ def setup(config_options):
hs.get_datastore().start_profiling() hs.get_datastore().start_profiling()
hs.get_replication_layer().start_get_pdu_cache() hs.get_replication_layer().start_get_pdu_cache()
reactor.callWhenRunning(hs.post_startup_check)
return hs return hs

View File

@ -144,3 +144,21 @@ class RegistrationStore(SQLBaseStore):
return rows[0] return rows[0]
raise StoreError(404, "Token not found.") raise StoreError(404, "Token not found.")
@defer.inlineCallbacks
def all_users_on_domain(self, domain):
res = yield self.runInteraction(
"all_users_on_domain",
self._all_users_on_domain_txn,
domain
)
defer.returnValue(res)
def _all_users_on_domain_txn(self, txn, domain):
sql = "SELECT COUNT(*) FROM users WHERE name NOT LIKE ?"
pat = "%:"+domain
cursor = txn.execute(sql, (pat,))
num_not_matching = cursor.fetchall()[0][0]
if num_not_matching == 0:
return True
return False