diff --git a/packages/backend/migration/1668374092227-forceEnablePush.js b/packages/backend/migration/1668374092227-forceEnablePush.js new file mode 100644 index 000000000..c3d63f2a4 --- /dev/null +++ b/packages/backend/migration/1668374092227-forceEnablePush.js @@ -0,0 +1,24 @@ +import push from 'web-push'; + +export class forceEnablePush1668374092227 { + name = 'forceEnablePush1668374092227'; + + async up(queryRunner) { + // set VAPID keys if not yet set + const { publicKey, privateKey } = push.generateVAPIDKeys(); + await queryRunner.query(`UPDATE "meta" SET "swPublicKey" = $1, "swPrivateKey" = $2 WHERE "swPublicKey" IS NULL OR "swPrivateKey" IS NULL`, [publicKey, privateKey]); + + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableServiceWorker"`); + await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "swPublicKey" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "swPrivateKey" SET NOT NULL`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "swPrivateKey" DROP NOT NULL`); + await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "swPublicKey" DROP NOT NULL`); + await queryRunner.query(`ALTER TABLE "meta" ADD "enableServiceWorker" boolean NOT NULL DEFAULT false`); + // since VAPID keys are set and the service worker may have been enabled before, make sure it is now enabled + await queryRunner.query(`UPDATE "meta" SET "enableServiceWorker" = true`); + // can't unset the VAPID keys because we do not know if we set them in the migration + } +} diff --git a/packages/backend/src/misc/fetch-meta.ts b/packages/backend/src/misc/fetch-meta.ts index 2b8966810..924b44553 100644 --- a/packages/backend/src/misc/fetch-meta.ts +++ b/packages/backend/src/misc/fetch-meta.ts @@ -35,8 +35,11 @@ async function getMeta(): Promise { }, }); if (metas.length === 0) { + const { publicKey, privateKey } = push.generateVAPIDKeys(); await db.manager.insert(Meta, { id: 'x', + swPublicKey: publicKey, + swPrivateKey: privateKey, }); metas = await db.manager.find(Meta, { order: { diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index 59118303e..c812b882a 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -236,22 +236,15 @@ export class Meta { }) public smtpPass: string | null; - @Column('boolean', { - default: false, + @Column('varchar', { + length: 128, }) - public enableServiceWorker: boolean; + public swPublicKey: string; @Column('varchar', { length: 128, - nullable: true, }) - public swPublicKey: string | null; - - @Column('varchar', { - length: 128, - nullable: true, - }) - public swPrivateKey: string | null; + public swPrivateKey: string; @Column('boolean', { default: false, diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 32e05dacb..ddd64f6b1 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -48,7 +48,7 @@ export const meta = { }, swPublickey: { type: 'string', - optional: false, nullable: true, + optional: false, nullable: false, }, bannerUrl: { type: 'string', @@ -114,10 +114,6 @@ export const meta = { type: 'boolean', optional: false, nullable: false, }, - enableServiceWorker: { - type: 'boolean', - optional: false, nullable: false, - }, translatorAvailable: { type: 'boolean', optional: false, nullable: false, @@ -219,10 +215,6 @@ export const meta = { type: 'string', optional: true, nullable: true, }, - swPrivateKey: { - type: 'string', - optional: true, nullable: true, - }, useObjectStorage: { type: 'boolean', optional: true, nullable: false, @@ -335,7 +327,6 @@ export default define(meta, paramDef, async (ps, me) => { enableTwitterIntegration: instance.enableTwitterIntegration, enableGithubIntegration: instance.enableGithubIntegration, enableDiscordIntegration: instance.enableDiscordIntegration, - enableServiceWorker: instance.enableServiceWorker, pinnedPages: instance.pinnedPages, pinnedClipId: instance.pinnedClipId, cacheRemoteFiles: instance.cacheRemoteFiles, @@ -360,7 +351,6 @@ export default define(meta, paramDef, async (ps, me) => { smtpPort: instance.smtpPort, smtpUser: instance.smtpUser, smtpPass: instance.smtpPass, - swPrivateKey: instance.swPrivateKey, useObjectStorage: instance.useObjectStorage, objectStorageBaseUrl: instance.objectStorageBaseUrl, objectStorageBucket: instance.objectStorageBucket, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index e6bcc4012..c6913a675 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -76,9 +76,6 @@ export const paramDef = { smtpPort: { type: 'integer', nullable: true }, smtpUser: { type: 'string', nullable: true }, smtpPass: { type: 'string', nullable: true }, - enableServiceWorker: { type: 'boolean' }, - swPublicKey: { type: 'string', nullable: true }, - swPrivateKey: { type: 'string', nullable: true }, tosUrl: { type: 'string', nullable: true }, useObjectStorage: { type: 'boolean' }, objectStorageBaseUrl: { type: 'string', nullable: true }, @@ -297,18 +294,6 @@ export default define(meta, paramDef, async (ps, me) => { set.smtpPass = ps.smtpPass; } - if (ps.enableServiceWorker !== undefined) { - set.enableServiceWorker = ps.enableServiceWorker; - } - - if (ps.swPublicKey !== undefined) { - set.swPublicKey = ps.swPublicKey; - } - - if (ps.swPrivateKey !== undefined) { - set.swPrivateKey = ps.swPrivateKey; - } - if (ps.tosUrl !== undefined) { set.ToSUrl = ps.tosUrl; } diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index 511c97ddc..569b8f56b 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -182,10 +182,6 @@ export const meta = { type: 'boolean', optional: false, nullable: false, }, - enableServiceWorker: { - type: 'boolean', - optional: false, nullable: false, - }, translatorAvailable: { type: 'boolean', optional: false, nullable: false, @@ -240,7 +236,8 @@ export const meta = { }, serviceWorker: { type: 'boolean', - optional: false, nullable: false, + optional: true, nullable: false, + default: true, }, miauth: { type: 'boolean', @@ -321,8 +318,6 @@ export default define(meta, paramDef, async (ps, me) => { enableGithubIntegration: instance.enableGithubIntegration, enableDiscordIntegration: instance.enableDiscordIntegration, - enableServiceWorker: instance.enableServiceWorker, - translatorAvailable: translatorAvailable(instance), pinnedPages: instance.pinnedPages, @@ -346,7 +341,7 @@ export default define(meta, paramDef, async (ps, me) => { twitter: instance.enableTwitterIntegration, github: instance.enableGithubIntegration, discord: instance.enableDiscordIntegration, - serviceWorker: instance.enableServiceWorker, + serviceWorker: true, miauth: true, }, }; diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts index 2411d438d..34423bd56 100644 --- a/packages/backend/src/server/nodeinfo.ts +++ b/packages/backend/src/server/nodeinfo.ts @@ -101,7 +101,6 @@ const nodeinfo2 = async (): Promise => { enableGithubIntegration: meta.enableGithubIntegration, enableDiscordIntegration: meta.enableDiscordIntegration, enableEmail: meta.enableEmail, - enableServiceWorker: meta.enableServiceWorker, proxyAccountName: proxyAccount?.username ?? null, themeColor: meta.themeColor || '#86b300', }, diff --git a/packages/backend/src/services/push-notification.ts b/packages/backend/src/services/push-notification.ts index 5f1e30982..e258c217a 100644 --- a/packages/backend/src/services/push-notification.ts +++ b/packages/backend/src/services/push-notification.ts @@ -40,8 +40,6 @@ function truncateNotification(notification: Packed<'Notification'>): any { export async function pushNotification(userId: string, type: T, body: pushNotificationsTypes[T]) { const meta = await fetchMeta(); - if (!meta.enableServiceWorker || meta.swPublicKey == null || meta.swPrivateKey == null) return; - // Register key pair information push.setVapidDetails(config.url, meta.swPublicKey, diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index daf5a58fb..71eb15a2e 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -107,27 +107,6 @@ - - - - - - - - - - - @@ -167,9 +146,6 @@ let localDriveCapacityMb: any = $ref(0); let remoteDriveCapacityMb: any = $ref(0); let enableRegistration: boolean = $ref(false); let emailRequiredForSignup: boolean = $ref(false); -let enableServiceWorker: boolean = $ref(false); -let swPublicKey: any = $ref(null); -let swPrivateKey: any = $ref(null); async function init(): Promise { const meta = await os.api('admin/meta'); @@ -192,9 +168,6 @@ async function init(): Promise { remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb; enableRegistration = !meta.disableRegistration; emailRequiredForSignup = meta.emailRequiredForSignup; - enableServiceWorker = meta.enableServiceWorker; - swPublicKey = meta.swPublickey; - swPrivateKey = meta.swPrivateKey; } function save(): void { @@ -218,9 +191,6 @@ function save(): void { remoteDriveCapacityMb: parseInt(remoteDriveCapacityMb, 10), disableRegistration: !enableRegistration, emailRequiredForSignup, - enableServiceWorker, - swPublicKey, - swPrivateKey, }).then(() => { fetchInstance(); });