From 399eabc7d3ff70f3030827a15746d38108bd78de Mon Sep 17 00:00:00 2001 From: Ignat Remizov Date: Wed, 20 May 2026 00:12:13 +0300 Subject: [PATCH] fix(notification): ignore blank browser push keys Treat an unset front-service PUSH_PUBLIC_KEY as disabled browser push support instead of passing an empty string into PushManager.subscribe. Changes: - Add a small push public key accessor that normalizes undefined and blank metadata to undefined. - Use that accessor for both push availability checks and push subscription setup. - Preserve existing behavior when a real VAPID public key is configured. Behavioral effect: Instances without web push configured no longer attempt service worker push subscription with an invalid empty ECDSA key, while keeping browser push disabled until VAPID keys and the notification service are configured. Signed-off-by: Ignat Remizov --- plugins/notification-resources/src/utils.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/notification-resources/src/utils.ts b/plugins/notification-resources/src/utils.ts index fd777a88b2c..db9b2f71fb4 100644 --- a/plugins/notification-resources/src/utils.ts +++ b/plugins/notification-resources/src/utils.ts @@ -731,7 +731,7 @@ function addWorkerListener (): void { export function pushAvailable (): boolean { if (isDesktopClient()) return false - const publicKey = getMetadata(notification.metadata.PushPublicKey) + const publicKey = getPushPublicKey() return ( 'serviceWorker' in navigator && 'PushManager' in window && @@ -747,7 +747,7 @@ export async function subscribePush (): Promise { return false } const client = getClient() - const publicKey = getMetadata(notification.metadata.PushPublicKey) + const publicKey = getPushPublicKey() if ('serviceWorker' in navigator && 'PushManager' in window && publicKey !== undefined) { try { const loc = getCurrentLocation() @@ -802,6 +802,12 @@ export async function subscribePush (): Promise { return false } +function getPushPublicKey (): string | undefined { + const publicKey = getMetadata(notification.metadata.PushPublicKey) + if (publicKey === undefined) return undefined + return publicKey.trim() !== '' ? publicKey : undefined +} + async function cleanTag (_id: Ref): Promise { const client = getClient() const notifications = await client.findAll(notification.class.BrowserNotification, {