summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/handlers/_base.py10
-rw-r--r--synapse/storage/roommember.py34
2 files changed, 41 insertions, 3 deletions
diff --git a/synapse/handlers/_base.py b/synapse/handlers/_base.py
index 6519f183df..95bb06395a 100644
--- a/synapse/handlers/_base.py
+++ b/synapse/handlers/_base.py
@@ -92,7 +92,15 @@ class BaseHandler(object):
 
             membership_event = state.get((EventTypes.Member, user_id), None)
             if membership_event:
-                membership = membership_event.membership
+                was_forgotten_at_event = yield self.store.was_forgotten_at(
+                    membership_event.user_id,
+                    membership_event.room_id,
+                    membership_event.event_id
+                )
+                if was_forgotten_at_event:
+                    membership = None
+                else:
+                    membership = membership_event.membership
             else:
                 membership = None
 
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index 183855ba40..5e92cdc811 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -271,6 +271,7 @@ class RoomMemberStore(SQLBaseStore):
         defer.returnValue(ret)
 
     def forget(self, user_id, room_id):
+        """Indicate that user_id wishes to discard history for room_id."""
         def f(txn):
             sql = (
                 "UPDATE"
@@ -287,6 +288,9 @@ class RoomMemberStore(SQLBaseStore):
 
     @defer.inlineCallbacks
     def did_forget(self, user_id, room_id):
+        """Returns whether user_id has elected to discard history for room_id.
+
+        Returns False if they have since re-joined."""
         def f(txn):
             sql = (
                 "SELECT"
@@ -298,10 +302,36 @@ class RoomMemberStore(SQLBaseStore):
                 " AND"
                 "  room_id = ?"
                 " AND"
-                "  forgotten = 1"
+                "  forgotten = 0"
             )
             txn.execute(sql, (user_id, room_id))
             rows = txn.fetchall()
             return rows[0][0]
         count = yield self.runInteraction("did_forget_membership", f)
-        defer.returnValue(count > 0)
+        defer.returnValue(count == 0)
+
+    @defer.inlineCallbacks
+    def was_forgotten_at(self, user_id, room_id, event_id):
+        """Returns whether user_id has elected to discard history for room_id at event_id.
+
+        event_id must be a membership event."""
+        def f(txn):
+            sql = (
+                "SELECT"
+                "  COUNT(*)"
+                "FROM"
+                "  room_memberships"
+                " WHERE"
+                "  user_id = ?"
+                " AND"
+                "  room_id = ?"
+                " AND"
+                "  event_id = ?"
+                " AND"
+                "  forgotten = 1"
+            )
+            txn.execute(sql, (user_id, room_id, event_id))
+            rows = txn.fetchall()
+            return rows[0][0]
+        count = yield self.runInteraction("did_forget_membership_at", f)
+        defer.returnValue(count == 1)