From 7b10c787ad2b3d1a24edd1cbc5b57da2c0c8d2b7 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Mon, 4 Mar 2024 19:01:04 -0800 Subject: [PATCH] narrow: Add access restrictions to get_base_query_for_search. This mirrors the restrictions in zerver.lib.message.bulk_access_stream_messages_query, in order to prevent leftover UserMessage rows from granting access to messages the user was previously allowed to access but no longer is. Signed-off-by: Anders Kaseorg --- zerver/lib/narrow.py | 49 ++++++- zerver/tests/test_message_fetch.py | 220 +++++++++++++++++++++++------ 2 files changed, 222 insertions(+), 47 deletions(-) diff --git a/zerver/lib/narrow.py b/zerver/lib/narrow.py index d41d6e1a39..1bd73138be 100644 --- a/zerver/lib/narrow.py +++ b/zerver/lib/narrow.py @@ -19,7 +19,6 @@ from sqlalchemy.sql import ( column, false, func, - join, literal, literal_column, not_, @@ -1013,15 +1012,51 @@ def get_base_query_for_search( # usermessage is more selective, and the query planner # can't know about that cross-table correlation. .where(column("user_profile_id", Integer) == literal(user_profile.id)) - .select_from( - join( - table("zerver_usermessage"), - table("zerver_message"), - literal_column("zerver_usermessage.message_id", Integer) - == literal_column("zerver_message.id", Integer), + .select_from(table("zerver_usermessage")) + .join( + table("zerver_message"), + literal_column("zerver_usermessage.message_id", Integer) + == literal_column("zerver_message.id", Integer), + ) + .join( + table("zerver_recipient"), + literal_column("zerver_message.recipient_id", Integer) + == literal_column("zerver_recipient.id", Integer), + ) + .where( + or_( + # Include direct messages. + literal_column("zerver_recipient.type_id", Integer) != Recipient.STREAM, + # Include messages where the recipient is a public stream and + # the user can access public streams. + select() + .select_from(table("zerver_stream")) + .where( + literal_column("zerver_stream.recipient_id", Integer) + == literal_column("zerver_recipient.id", Integer) + ) + .where( + not_(literal_column("zerver_stream.invite_only", Boolean)), + not_(literal_column("zerver_stream.is_in_zephyr_realm", Boolean)), + user_profile.can_access_public_streams(), + ) + .exists(), + # Include messages where the user has an active subscription to + # the stream. + select() + .select_from(table("zerver_subscription")) + .where( + literal_column("zerver_subscription.user_profile_id", Integer) + == user_profile.id, + literal_column("zerver_subscription.recipient_id", Integer) + == literal_column("zerver_recipient.id", Integer), + literal_column("zerver_subscription.active", Boolean), + ) + .exists(), ) ) ) + inner_msg_id_col = column("message_id", Integer) return (query, inner_msg_id_col) diff --git a/zerver/tests/test_message_fetch.py b/zerver/tests/test_message_fetch.py index ba86ee6d70..c0987e6d7a 100644 --- a/zerver/tests/test_message_fetch.py +++ b/zerver/tests/test_message_fetch.py @@ -4167,12 +4167,10 @@ class GetOldMessagesTest(ZulipTestCase): self.assertNotIn(f"AND message_id = {LARGER_THAN_MAX_MESSAGE_ID}", sql) self.assertIn("ORDER BY message_id ASC", sql) - cond = ( - f"WHERE user_profile_id = {user_profile.id} AND message_id >= {first_unread_message_id}" - ) - self.assertIn(cond, sql) - cond = f"WHERE user_profile_id = {user_profile.id} AND message_id <= {first_unread_message_id - 1}" - self.assertIn(cond, sql) + self.assertIn(f"\nWHERE user_profile_id = {user_profile.id} ", sql) + self.assertIn(f" AND message_id >= {first_unread_message_id} ", sql) + self.assertIn(f"\nWHERE user_profile_id = {user_profile.id} ", sql) + self.assertIn(f" AND message_id <= {first_unread_message_id - 1} ", sql) self.assertIn("UNION", sql) def test_visible_messages_use_first_unread_anchor_with_some_unread_messages(self) -> None: @@ -4216,10 +4214,10 @@ class GetOldMessagesTest(ZulipTestCase): sql = queries[0].sql self.assertNotIn(f"AND message_id = {LARGER_THAN_MAX_MESSAGE_ID}", sql) self.assertIn("ORDER BY message_id ASC", sql) - cond = f"WHERE user_profile_id = {user_profile.id} AND message_id <= {first_unread_message_id - 1}" - self.assertIn(cond, sql) - cond = f"WHERE user_profile_id = {user_profile.id} AND message_id >= {first_visible_message_id}" - self.assertIn(cond, sql) + self.assertIn(f"\nWHERE user_profile_id = {user_profile.id} ", sql) + self.assertIn(f" AND message_id <= {first_unread_message_id - 1} ", sql) + self.assertIn(f"\nWHERE user_profile_id = {user_profile.id} ", sql) + self.assertIn(f" AND message_id >= {first_visible_message_id} ", sql) def test_use_first_unread_anchor_with_no_unread_messages(self) -> None: user_profile = self.example_user("hamlet") @@ -4420,8 +4418,12 @@ recipient_id = %(recipient_id_3)s AND upper(subject) = upper(%(param_2)s))\ sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) self.common_check_get_messages_query({"anchor": 0, "num_before": 0, "num_after": 0}, sql) @@ -4429,8 +4431,12 @@ WHERE user_profile_id = {hamlet_id} AND message_id = 0) AS anon_1 ORDER BY messa sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) self.common_check_get_messages_query({"anchor": 0, "num_before": 1, "num_after": 0}, sql) @@ -4438,8 +4444,12 @@ WHERE user_profile_id = {hamlet_id} AND message_id = 0) AS anon_1 ORDER BY messa sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} ORDER BY message_id ASC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) ORDER BY message_id ASC \n\ LIMIT 2) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) @@ -4448,8 +4458,12 @@ WHERE user_profile_id = {hamlet_id} ORDER BY message_id ASC \n\ sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} ORDER BY message_id ASC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) ORDER BY message_id ASC \n\ LIMIT 11) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) @@ -4458,8 +4472,12 @@ WHERE user_profile_id = {hamlet_id} ORDER BY message_id ASC \n\ sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DESC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND message_id <= 100 ORDER BY message_id DESC \n\ LIMIT 11) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) @@ -4468,11 +4486,19 @@ WHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DE sql_template = """\ SELECT anon_1.message_id, anon_1.flags \n\ FROM ((SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND message_id <= 99 ORDER BY message_id DESC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND message_id <= 99 ORDER BY message_id DESC \n\ LIMIT 10) UNION ALL (SELECT message_id, flags \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id ASC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND message_id >= 100 ORDER BY message_id ASC \n\ LIMIT 11)) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) @@ -4485,7 +4511,16 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS hamlet_email = self.example_user("hamlet").email othello_email = self.example_user("othello").email - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id = 0) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4497,7 +4532,16 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id = 0) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id = 0) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4509,7 +4553,17 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (flags & 2048) != 0 AND realm_id = {realm_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4521,13 +4575,33 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2) != 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (flags & 2) != 0 ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( {"anchor": 0, "num_before": 0, "num_after": 9, "narrow": '[["is", "starred"]]'}, sql ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {othello_id} ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND sender_id = {othello_id} ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4539,21 +4613,43 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE realm_id = 2 AND recipient_id = {scotland_recipient} ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id \n\ +FROM (SELECT id AS message_id \n\ +FROM zerver_message \n\ +WHERE realm_id = 2 AND recipient_id = {scotland_recipient} ORDER BY zerver_message.id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( {"anchor": 0, "num_before": 0, "num_after": 9, "narrow": '[["channel", "Scotland"]]'}, sql, ) - sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE realm_id = 2 AND recipient_id IN ({public_channels_recipients}) ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id \n\ +FROM (SELECT id AS message_id \n\ +FROM zerver_message \n\ +WHERE realm_id = 2 AND recipient_id IN ({public_channels_recipients}) ORDER BY zerver_message.id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( {"anchor": 0, "num_before": 0, "num_after": 9, "narrow": '[["channels", "public"]]'}, sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (recipient_id NOT IN ({public_channels_recipients})) ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (recipient_id NOT IN ({public_channels_recipients})) ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4565,13 +4661,29 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND upper(subject) = upper('blah') ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND upper(subject) = upper('blah') ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( {"anchor": 0, "num_before": 0, "num_after": 9, "narrow": '[["topic", "blah"]]'}, sql ) - sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE realm_id = 2 AND recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id \n\ +FROM (SELECT id AS message_id \n\ +FROM zerver_message \n\ +WHERE realm_id = 2 AND recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') ORDER BY zerver_message.id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4584,7 +4696,17 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS ) # Narrow to direct messages with yourself - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2048) != 0 AND realm_id = {realm_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (flags & 2048) != 0 AND realm_id = {realm_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4596,7 +4718,17 @@ WHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id AS sql, ) - sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" + sql_template = """\ +SELECT anon_1.message_id, anon_1.flags \n\ +FROM (SELECT message_id, flags \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 ORDER BY message_id ASC \n\ + LIMIT 10) AS anon_1 ORDER BY message_id ASC\ +""" sql = sql_template.format(**query_ids) self.common_check_get_messages_query( { @@ -4619,8 +4751,12 @@ FROM unnest(string_to_array(ts_headline('zulip.english_us_search', rendered_cont LIMIT ALL OFFSET 1)) AS content_matches, array((SELECT ARRAY[sum(length(anon_5) - 11) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) + 11, strpos(anon_5, '') - 1] AS anon_4 \n\ FROM unnest(string_to_array(ts_headline('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping'), 'HighlightAll = TRUE, StartSel = , StopSel = '), '')) AS anon_5\n\ LIMIT ALL OFFSET 1)) AS topic_matches \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) ORDER BY message_id ASC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) ORDER BY message_id ASC \n\ LIMIT 10) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids) @@ -4657,8 +4793,12 @@ FROM unnest(string_to_array(ts_headline('zulip.english_us_search', rendered_cont LIMIT ALL OFFSET 1)) AS content_matches, array((SELECT ARRAY[sum(length(anon_5) - 11) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) + 11, strpos(anon_5, '') - 1] AS anon_4 \n\ FROM unnest(string_to_array(ts_headline('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', '"jumping" quickly'), 'HighlightAll = TRUE, StartSel = , StopSel = '), '')) AS anon_5\n\ LIMIT ALL OFFSET 1)) AS topic_matches \n\ -FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \n\ -WHERE user_profile_id = {hamlet_id} AND (content ILIKE '%jumping%' OR subject ILIKE '%jumping%') AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', '"jumping" quickly')) ORDER BY message_id ASC \n\ +FROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id JOIN zerver_recipient ON zerver_message.recipient_id = zerver_recipient.id \n\ +WHERE user_profile_id = {hamlet_id} AND (zerver_recipient.type_id != 2 OR (EXISTS (SELECT \n\ +FROM zerver_stream \n\ +WHERE zerver_stream.recipient_id = zerver_recipient.id AND NOT zerver_stream.invite_only AND NOT zerver_stream.is_in_zephyr_realm)) OR (EXISTS (SELECT \n\ +FROM zerver_subscription \n\ +WHERE zerver_subscription.user_profile_id = {hamlet_id} AND zerver_subscription.recipient_id = zerver_recipient.id AND zerver_subscription.active))) AND (content ILIKE '%jumping%' OR subject ILIKE '%jumping%') AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', '"jumping" quickly')) ORDER BY message_id ASC \n\ LIMIT 10) AS anon_1 ORDER BY message_id ASC\ """ sql = sql_template.format(**query_ids)