summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/api/filtering.py11
-rw-r--r--tests/api/test_filtering.py54
2 files changed, 60 insertions, 5 deletions
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": {