settings: Add require_e2ee_push_notifications realm setting.

This commit adds a realm setting:
"Require end-to-end encryption for push notification content".

This commit just involves backend & UI changes to add the setting,
the impact of this setting is in the next commit.

Fixes part of #35370.
This commit is contained in:
Prakhar Pratyush
2025-07-24 18:50:54 +05:30
committed by Tim Abbott
parent d46b1a0ac9
commit fc6cd9a966
11 changed files with 116 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
# Generated by Django 5.2.4 on 2025-07-28 18:58
from django.conf import settings
from django.db import migrations, models
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.db.migrations.state import StateApps
def update_require_e2ee_push_notifications(
apps: StateApps, schema_editor: BaseDatabaseSchemaEditor
) -> None:
Realm = apps.get_model("zerver", "Realm")
# We use 'getattr' with a default value to allow this migration
# to run in development environment when PUSH_NOTIFICATION_REDACT_CONTENT
# setting is removed in the future.
require_e2ee = getattr(settings, "PUSH_NOTIFICATION_REDACT_CONTENT", False)
if require_e2ee:
Realm.objects.update(require_e2ee_push_notifications=require_e2ee)
class Migration(migrations.Migration):
dependencies = [
("zerver", "0742_usermessage_zerver_usermessage_is_private_unread_message_id"),
]
operations = [
migrations.AddField(
model_name="realm",
name="require_e2ee_push_notifications",
field=models.BooleanField(db_default=False, default=False),
),
migrations.RunPython(
update_require_e2ee_push_notifications,
elidable=True,
reverse_code=migrations.RunPython.noop,
),
]

View File

@@ -191,6 +191,7 @@ class Realm(models.Model):
# cease to be the case.
push_notifications_enabled = models.BooleanField(default=False, db_index=True)
push_notifications_enabled_end_timestamp = models.DateTimeField(default=None, null=True)
require_e2ee_push_notifications = models.BooleanField(default=False, db_default=False)
date_created = models.DateTimeField(default=timezone_now)
scheduled_deletion_date = models.DateTimeField(default=None, db_index=True, null=True)
@@ -726,6 +727,7 @@ class Realm(models.Model):
name=str,
name_changes_disabled=bool,
push_notifications_enabled=bool,
require_e2ee_push_notifications=bool,
require_unique_names=bool,
send_welcome_emails=bool,
topics_policy=RealmTopicsPolicyEnum,

View File

@@ -5402,6 +5402,32 @@ paths:
indicated timestamp is near.
**Changes**: New in Zulip 8.0 (feature level 231).
require_e2ee_push_notifications:
type: boolean
description: |
Whether this realm is configured to disallow sending mobile
push notifications with message content through the legacy
mobile push notifications APIs. The new API uses end-to-end
encryption to protect message content and metadata from
being accessible to the push bouncer service, APNs, and
FCM. Clients that support the new E2EE API will use it
automatically regardless of this setting.
If `true`, mobile push notifications sent to clients that
lack support for E2EE push notifications will always have
"New message" as their content. Note that these legacy
mobile notifications will still contain metadata, which may
include the message's ID, the sender's name, email address,
and avatar.
In a future release, once the official mobile apps have
implemented fully validated their E2EE protocol support,
this setting will become strict, and disable the legacy
protocol entirely.
**Changes**: New in Zulip 11.0 (feature level 409). Previously,
this behavior was available only via the
`PUSH_NOTIFICATION_REDACT_CONTENT` global server setting.
require_unique_names:
type: boolean
description: |
@@ -18953,6 +18979,34 @@ paths:
Present if `realm` is present in `fetch_event_types`.
The name of the organization, used in login pages etc.
realm_require_e2ee_push_notifications:
type: boolean
description: |
Present if `realm` is present in `fetch_event_types`.
Whether this realm is configured to disallow sending mobile
push notifications with message content through the legacy
mobile push notifications APIs. The new API uses end-to-end
encryption to protect message content and metadata from
being accessible to the push bouncer service, APNs, and
FCM. Clients that support the new E2EE API will use it
automatically regardless of this setting.
If `true`, mobile push notifications sent to clients that
lack support for E2EE push notifications will always have
"New message" as their content. Note that these legacy
mobile notifications will still contain metadata, which may
include the message's ID, the sender's name, email address,
and avatar.
In a future release, once the official mobile apps have
implemented fully validated their E2EE protocol support,
this setting will become strict, and disable the legacy
protocol entirely.
**Changes**: New in Zulip 11.0 (feature level 409). Previously,
this behavior was available only via the
`PUSH_NOTIFICATION_REDACT_CONTENT` global server setting.
realm_require_unique_names:
type: boolean
description: |

View File

@@ -208,6 +208,7 @@ class HomeTest(ZulipTestCase):
"realm_presence_disabled",
"realm_push_notifications_enabled",
"realm_push_notifications_enabled_end_timestamp",
"realm_require_e2ee_push_notifications",
"realm_require_unique_names",
"realm_send_welcome_emails",
"realm_signup_announcements_stream_id",

View File

@@ -178,6 +178,7 @@ def update_realm(
name_changes_disabled: Json[bool] | None = None,
new_stream_announcements_stream_id: Json[int] | None = None,
org_type: Json[OrgTypeEnum] | None = None,
require_e2ee_push_notifications: Json[bool] | None = None,
require_unique_names: Json[bool] | None = None,
send_welcome_emails: Json[bool] | None = None,
signup_announcements_stream_id: Json[int] | None = None,