mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	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:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							d46b1a0ac9
						
					
				
				
					commit
					fc6cd9a966
				
			@@ -20,6 +20,12 @@ format used by the Zulip server that they are interacting with.
 | 
			
		||||
 | 
			
		||||
## Changes in Zulip 11.0
 | 
			
		||||
 | 
			
		||||
**Feature level 409**
 | 
			
		||||
 | 
			
		||||
* `PATCH /realm`, [`POST /register`](/api/register-queue),
 | 
			
		||||
  [`GET /events`](/api/get-events): Added a new
 | 
			
		||||
  `require_e2ee_push_notifications` realm setting.
 | 
			
		||||
 | 
			
		||||
**Feature level 407**
 | 
			
		||||
 | 
			
		||||
* [`GET /users/me/subscriptions`](/api/get-subscriptions),
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ DESKTOP_WARNING_VERSION = "5.9.3"
 | 
			
		||||
# new level means in api_docs/changelog.md, as well as "**Changes**"
 | 
			
		||||
# entries in the endpoint's documentation in `zulip.yaml`.
 | 
			
		||||
 | 
			
		||||
API_FEATURE_LEVEL = 408
 | 
			
		||||
API_FEATURE_LEVEL = 409
 | 
			
		||||
 | 
			
		||||
# Bump the minor PROVISION_VERSION to indicate that folks should provision
 | 
			
		||||
# only when going from an old version of the code to a newer version. Bump
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,9 @@ const admin_settings_label = {
 | 
			
		||||
    }),
 | 
			
		||||
    realm_inline_url_embed_preview: $t({defaultMessage: "Show previews of linked websites"}),
 | 
			
		||||
    realm_send_welcome_emails: $t({defaultMessage: "Send emails introducing Zulip to new users"}),
 | 
			
		||||
    realm_require_e2ee_push_notifications: $t({
 | 
			
		||||
        defaultMessage: "Require end-to-end encryption for push notification content",
 | 
			
		||||
    }),
 | 
			
		||||
    realm_message_content_allowed_in_email_notifications: $t({
 | 
			
		||||
        defaultMessage: "Allow message content in message notification emails",
 | 
			
		||||
    }),
 | 
			
		||||
@@ -194,6 +197,7 @@ export function build_page(): void {
 | 
			
		||||
        realm_topics_policy_values: settings_config.get_realm_topics_policy_values(),
 | 
			
		||||
        empty_string_topic_display_name: util.get_final_topic_display_name(""),
 | 
			
		||||
        realm_send_welcome_emails: realm.realm_send_welcome_emails,
 | 
			
		||||
        realm_require_e2ee_push_notifications: realm.realm_require_e2ee_push_notifications,
 | 
			
		||||
        realm_message_content_allowed_in_email_notifications:
 | 
			
		||||
            realm.realm_message_content_allowed_in_email_notifications,
 | 
			
		||||
        realm_enable_spectator_access: realm.realm_enable_spectator_access,
 | 
			
		||||
 
 | 
			
		||||
@@ -289,6 +289,7 @@ export function dispatch_normal_event(event) {
 | 
			
		||||
                require_unique_names: noop,
 | 
			
		||||
                send_welcome_emails: noop,
 | 
			
		||||
                topics_policy: noop,
 | 
			
		||||
                require_e2ee_push_notifications: noop,
 | 
			
		||||
                message_content_allowed_in_email_notifications: noop,
 | 
			
		||||
                enable_spectator_access: noop,
 | 
			
		||||
                signup_announcements_stream_id: noop,
 | 
			
		||||
 
 | 
			
		||||
@@ -426,6 +426,7 @@ export const realm_schema = z.object({
 | 
			
		||||
    realm_presence_disabled: z.boolean(),
 | 
			
		||||
    realm_push_notifications_enabled: z.boolean(),
 | 
			
		||||
    realm_push_notifications_enabled_end_timestamp: z.nullable(z.number()),
 | 
			
		||||
    realm_require_e2ee_push_notifications: z.boolean(),
 | 
			
		||||
    realm_require_unique_names: z.boolean(),
 | 
			
		||||
    realm_send_welcome_emails: z.boolean(),
 | 
			
		||||
    realm_signup_announcements_stream_id: z.number(),
 | 
			
		||||
 
 | 
			
		||||
@@ -70,6 +70,13 @@
 | 
			
		||||
                {{> settings_save_discard_widget section_name="notifications-security" }}
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="inline-block organization-settings-parent">
 | 
			
		||||
                {{> settings_checkbox
 | 
			
		||||
                  setting_name="realm_require_e2ee_push_notifications"
 | 
			
		||||
                  prefix="id_"
 | 
			
		||||
                  is_checked=realm_require_e2ee_push_notifications
 | 
			
		||||
                  label=admin_settings_label.realm_require_e2ee_push_notifications
 | 
			
		||||
                  help_link="/help/mobile-notifications"}}
 | 
			
		||||
 | 
			
		||||
                {{> settings_checkbox
 | 
			
		||||
                  setting_name="realm_message_content_allowed_in_email_notifications"
 | 
			
		||||
                  prefix="id_"
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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: |
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user