mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
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 <anders@zulip.com>
This commit is contained in:
committed by
Tim Abbott
parent
dc22b5d4bf
commit
cb0560d734
@@ -502,6 +502,8 @@ def has_channel_content_access_helper(
|
||||
|
||||
Does not consider the implicit permissions associated with web-public
|
||||
or public channels; callers are responsible for that.
|
||||
|
||||
This logic is mirrored in zerver.lib.narrow.get_base_query_for_search.
|
||||
"""
|
||||
if is_subscribed is None:
|
||||
assert stream.recipient_id is not None
|
||||
@@ -729,6 +731,7 @@ def bulk_access_stream_messages_query(
|
||||
QuerySet if the user has access to no messages (for instance, for
|
||||
a private stream which the user is not subscribed to).
|
||||
|
||||
This logic is mirrored in zerver.lib.narrow.get_base_query_for_search.
|
||||
"""
|
||||
|
||||
assert stream.recipient_id is not None
|
||||
|
@@ -19,7 +19,6 @@ from sqlalchemy.sql import (
|
||||
column,
|
||||
false,
|
||||
func,
|
||||
join,
|
||||
literal,
|
||||
literal_column,
|
||||
not_,
|
||||
@@ -58,6 +57,7 @@ from zerver.lib.topic_sqlalchemy import (
|
||||
topic_match_sa,
|
||||
)
|
||||
from zerver.lib.types import Validator
|
||||
from zerver.lib.user_groups import get_recursive_membership_groups
|
||||
from zerver.lib.user_topics import exclude_stream_and_topic_mutes
|
||||
from zerver.lib.validator import (
|
||||
check_bool,
|
||||
@@ -1078,6 +1078,14 @@ def get_base_query_for_search(
|
||||
return (query, inner_msg_id_col)
|
||||
|
||||
assert user_profile is not None
|
||||
user_recursive_group_ids = []
|
||||
# We ignore group membership for guests; see the TODO comment in
|
||||
# has_channel_content_access_helper.
|
||||
if not user_profile.is_guest:
|
||||
user_recursive_group_ids = sorted(
|
||||
get_recursive_membership_groups(user_profile).values_list("id", flat=True)
|
||||
)
|
||||
|
||||
query = (
|
||||
select(column("message_id", Integer))
|
||||
# We don't limit by realm_id despite the join to
|
||||
@@ -1085,15 +1093,65 @@ 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),
|
||||
)
|
||||
# Mirror the restrictions in 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.
|
||||
.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, or the user is a non-guest
|
||||
# belonging to a group granting access to the stream.
|
||||
select()
|
||||
.select_from(table("zerver_stream"))
|
||||
.where(
|
||||
literal_column("zerver_stream.recipient_id", Integer)
|
||||
== literal_column("zerver_recipient.id", Integer)
|
||||
)
|
||||
.where(
|
||||
or_(
|
||||
and_(
|
||||
not_(literal_column("zerver_stream.invite_only", Boolean)),
|
||||
not_(literal_column("zerver_stream.is_in_zephyr_realm", Boolean)),
|
||||
user_profile.can_access_public_streams(),
|
||||
),
|
||||
literal_column("zerver_stream.can_subscribe_group_id").in_(
|
||||
user_recursive_group_ids
|
||||
),
|
||||
literal_column("zerver_stream.can_add_subscribers_group_id").in_(
|
||||
user_recursive_group_ids
|
||||
),
|
||||
)
|
||||
)
|
||||
.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)
|
||||
|
||||
|
@@ -52,6 +52,7 @@ from zerver.lib.topic import MATCH_TOPIC, RESOLVED_TOPIC_PREFIX, TOPIC_NAME, mes
|
||||
from zerver.lib.types import UserDisplayRecipient
|
||||
from zerver.lib.upload import create_attachment
|
||||
from zerver.lib.url_encoding import near_message_url
|
||||
from zerver.lib.user_groups import get_recursive_membership_groups
|
||||
from zerver.lib.user_topics import set_topic_visibility_policy
|
||||
from zerver.models import (
|
||||
Attachment,
|
||||
@@ -1931,6 +1932,9 @@ class GetOldMessagesTest(ZulipTestCase):
|
||||
query_ids["realm_id"] = hamlet_user.realm_id
|
||||
query_ids["scotland_recipient"] = scotland_channel.recipient_id
|
||||
query_ids["hamlet_id"] = hamlet_user.id
|
||||
query_ids["hamlet_groups"] = repr(
|
||||
tuple(sorted(get_recursive_membership_groups(hamlet_user).values_list("id", flat=True)))
|
||||
)
|
||||
query_ids["othello_id"] = othello_user.id
|
||||
query_ids["hamlet_recipient"] = hamlet_user.recipient_id
|
||||
query_ids["othello_recipient"] = othello_user.recipient_id
|
||||
@@ -4408,12 +4412,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:
|
||||
@@ -4457,10 +4459,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")
|
||||
@@ -4693,8 +4695,12 @@ AND NOT (recipient_id = %(recipient_id_4)s AND upper(subject) = upper(%(param_3)
|
||||
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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4702,8 +4708,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4711,8 +4721,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4721,8 +4735,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4731,8 +4749,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4741,11 +4763,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4758,7 +4788,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4770,7 +4809,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4782,7 +4830,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4794,13 +4852,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4812,21 +4890,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4838,13 +4938,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4857,7 +4973,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4869,7 +4995,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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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(
|
||||
{
|
||||
@@ -4892,8 +5028,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, '</ts-match>') - 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 = <ts-match>, StopSel = </ts-match>'), '<ts-match>')) 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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
@@ -4930,8 +5070,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, '</ts-match>') - 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 = <ts-match>, StopSel = </ts-match>'), '<ts-match>')) 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 zerver_stream.can_subscribe_group_id IN {hamlet_groups} OR zerver_stream.can_add_subscribers_group_id IN {hamlet_groups}))) 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)
|
||||
|
Reference in New Issue
Block a user