Compare commits

...

4 Commits

Author SHA1 Message Date
Will Hunt
212d4abeab Add unit tests 2018-06-27 17:11:13 +01:00
Will Hunt
2df75cec69 event.event_id => event.sender 2018-06-27 16:04:33 +01:00
Will Hunt
ae6eb102b1 Make flake happy 2018-06-25 17:24:00 +01:00
Will Hunt
8d926d78ff Add app_service_server_blacklist option 2018-06-25 17:16:01 +01:00
3 changed files with 59 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ from synapse.types import UserID
import yaml
import logging
import re
from six import string_types
from six.moves.urllib import parse as urlparse
@@ -31,6 +32,18 @@ class AppServiceConfig(Config):
def read_config(self, config):
self.app_service_config_files = config.get("app_service_config_files", [])
self.notify_appservices = config.get("notify_appservices", True)
s_blacklist = config.get(
"app_service_server_blacklist", []
)
try:
self.app_service_server_blacklist = [
re.compile(x) for x in s_blacklist
]
except re.error as ex:
raise ConfigError(
"Could not compile regex in app_service_server_blacklist: %s",
ex.message
)
def default_config(cls, **kwargs):
return """\

View File

@@ -23,6 +23,8 @@ from synapse.util.metrics import Measure
from synapse.util.logcontext import (
make_deferred_yieldable, run_in_background,
)
from synapse.types import get_domain_from_id
from prometheus_client import Counter
import logging
@@ -52,6 +54,7 @@ class ApplicationServicesHandler(object):
self.scheduler = hs.get_application_service_scheduler()
self.started_scheduler = False
self.clock = hs.get_clock()
self.server_blacklist = hs.config.app_service_server_blacklist
self.notify_appservices = hs.config.notify_appservices
self.current_max = 0
@@ -93,6 +96,15 @@ class ApplicationServicesHandler(object):
@defer.inlineCallbacks
def handle_event(event):
ev_domain = get_domain_from_id(event.sender)
if any(srv_re.match(ev_domain) is not None
for srv_re in self.server_blacklist):
logger.info(
"Ignoring %s from %s, matches server blacklist",
event.sender,
ev_domain
)
return
# Gather interested services
services = yield self._get_services_for_event(event)
if len(services) == 0:

View File

@@ -20,6 +20,7 @@ from tests.utils import MockClock
from synapse.handlers.appservice import ApplicationServicesHandler
from mock import Mock
import re
class AppServiceHandlerTestCase(unittest.TestCase):
@@ -32,9 +33,14 @@ class AppServiceHandlerTestCase(unittest.TestCase):
hs = Mock()
hs.get_datastore = Mock(return_value=self.mock_store)
self.mock_store.get_received_ts.return_value = 0
self.mock_store.app_service_server_blacklist = []
hs.get_application_service_api = Mock(return_value=self.mock_as_api)
hs.get_application_service_scheduler = Mock(return_value=self.mock_scheduler)
hs.get_clock.return_value = MockClock()
hs.config.app_service_server_blacklist = [
re.compile("evilplaceofevil"),
re.compile("bad.placeof..*")
]
self.handler = ApplicationServicesHandler(hs)
@defer.inlineCallbacks
@@ -64,6 +70,34 @@ class AppServiceHandlerTestCase(unittest.TestCase):
interested_service, event
)
@defer.inlineCallbacks
def test_ignore_blacklisted_services(self):
interested_service = self._mkservice(is_interested=True)
services = [
interested_service,
]
self.mock_store.get_app_services = Mock(return_value=services)
self.mock_store.get_user_by_id = Mock(return_value=[])
eventLiteral = Mock(
sender="@someone:evilplaceofevil",
type="m.room.message",
room_id="!foo:bar"
)
eventMatched = Mock(
sender="@someone:bad.placeof.bad",
type="m.room.message",
room_id="!foo:bar"
)
self.mock_store.get_new_events_for_appservice.side_effect = [
(0, [eventLiteral]),
(0, [eventMatched])
]
self.mock_as_api.push = Mock()
yield self.handler.notify_interested_services(0)
assert self.mock_scheduler.submit_event_for_as.called is False
@defer.inlineCallbacks
def test_query_user_exists_unknown_user(self):
user_id = "@someone:anywhere"