diff --git a/synapse/api/filtering.py b/synapse/api/filtering.py
index 8bc95aa394..7e239138b7 100644
--- a/synapse/api/filtering.py
+++ b/synapse/api/filtering.py
@@ -12,6 +12,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
+from twisted.internet import defer
from synapse.api.errors import SynapseError
from synapse.types import UserID, RoomID
@@ -59,19 +60,21 @@ class Filtering(object):
# replace_user_filter at some point? There's no REST API specified for
# them however
+ @defer.inlineCallbacks
def _filter_on_key(self, events, user, filter_id, keys):
- filter_json = self.get_user_filter(user.localpart, filter_id)
+ filter_json = yield self.get_user_filter(user.localpart, filter_id)
if not filter_json:
- return events
+ defer.returnValue(events)
try:
# extract the right definition from the filter
definition = filter_json
for key in keys:
definition = definition[key]
- return self._filter_with_definition(events, definition)
+ defer.returnValue(self._filter_with_definition(events, definition))
except KeyError:
- return events # return all events if definition isn't specified.
+ # return all events if definition isn't specified.
+ defer.returnValue(events)
def _filter_with_definition(self, events, definition):
return [e for e in events if self._passes_definition(definition, e)]
diff --git a/tests/api/test_filtering.py b/tests/api/test_filtering.py
index 380dd97937..97fb9758e9 100644
--- a/tests/api/test_filtering.py
+++ b/tests/api/test_filtering.py
@@ -24,7 +24,7 @@ from tests.utils import (
)
from synapse.server import HomeServer
-
+from synapse.types import UserID
user_localpart = "test_user"
MockEvent = namedtuple("MockEvent", "sender type room_id")
@@ -353,6 +353,58 @@ class FilteringTestCase(unittest.TestCase):
)
@defer.inlineCallbacks
+ def test_filter_public_user_data_match(self):
+ user_filter = {
+ "public_user_data": {
+ "types": ["m.*"]
+ }
+ }
+ user = UserID.from_string("@" + user_localpart + ":test")
+ filter_id = yield self.datastore.add_user_filter(
+ user_localpart=user_localpart,
+ user_filter=user_filter,
+ )
+ event = MockEvent(
+ sender="@foo:bar",
+ type="m.profile",
+ room_id="!foo:bar"
+ )
+ events = [event]
+
+ results = yield self.filtering.filter_public_user_data(
+ events=events,
+ user=user,
+ filter_id=filter_id
+ )
+ self.assertEquals(events, results)
+
+ @defer.inlineCallbacks
+ def test_filter_public_user_data_no_match(self):
+ user_filter = {
+ "public_user_data": {
+ "types": ["m.*"]
+ }
+ }
+ user = UserID.from_string("@" + user_localpart + ":test")
+ filter_id = yield self.datastore.add_user_filter(
+ user_localpart=user_localpart,
+ user_filter=user_filter,
+ )
+ event = MockEvent(
+ sender="@foo:bar",
+ type="custom.avatar.3d.crazy",
+ room_id="!foo:bar"
+ )
+ events = [event]
+
+ results = yield self.filtering.filter_public_user_data(
+ events=events,
+ user=user,
+ filter_id=filter_id
+ )
+ self.assertEquals([], results)
+
+ @defer.inlineCallbacks
def test_add_filter(self):
user_filter = {
"room": {
|