discourse/config/initializers/100-push-notifications.rb
Rafael dos Santos Silva 470a91a35d
FIX: only clear current device push subscription on logout (#39266)
## Summary
- Previously, logging out of any device cleared push notification
subscriptions for **all** devices via a blanket `user_logged_out` event
handler
- Now the frontend sends the current browser's push subscription as part
of the session destroy request, and only that subscription is removed
server-side
- "Log out everywhere" paths (admin log out, user suspension,
`log_out_strict`) still correctly clear all subscriptions
2026-04-15 11:39:42 -03:00

26 lines
887 B
Ruby

# frozen_string_literal: true
return if GlobalSetting.skip_db?
Rails.application.config.to_prepare do
require "web-push"
def generate_vapid_key?
SiteSetting.vapid_public_key.blank? || SiteSetting.vapid_private_key.blank? ||
SiteSetting.vapid_public_key_bytes.blank? || SiteSetting.vapid_base_url != Discourse.base_url
end
SiteSetting.vapid_base_url = Discourse.base_url if SiteSetting.vapid_base_url.blank?
if generate_vapid_key?
vapid_key = WebPush.generate_key
SiteSetting.vapid_public_key = vapid_key.public_key
SiteSetting.vapid_private_key = vapid_key.private_key
SiteSetting.vapid_public_key_bytes =
Base64.urlsafe_decode64(SiteSetting.vapid_public_key).bytes.join("|")
SiteSetting.vapid_base_url = Discourse.base_url
PushSubscription.delete_all if ActiveRecord::Base.connection.table_exists?(:push_subscriptions)
end
end