discourse/lib/current_user.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

59 lines
1.3 KiB
Ruby

# frozen_string_literal: true
module CurrentUser
def self.has_auth_cookie?(env)
Discourse.current_user_provider.new(env).has_auth_cookie?
end
def self.lookup_from_env(env)
Discourse.current_user_provider.new(env).current_user
end
# can be used to pretend current user does no exist, for CSRF attacks
def clear_current_user
@current_user_provider = Discourse.current_user_provider.new({})
end
def log_on_user(user, opts = {})
current_user_provider.log_on_user(user, session, cookies, opts)
user.logged_in
end
def log_off_user(push_subscription: nil)
current_user_provider.log_off_user(session, cookies, push_subscription:)
end
def start_impersonating_user(user)
current_user_provider.start_impersonating_user(user)
end
def stop_impersonating_user
current_user_provider.stop_impersonating_user
end
def is_api?
current_user_provider.is_api?
end
def is_user_api?
current_user_provider.is_user_api?
end
def current_user
current_user_provider.current_user
end
def impersonation_acting_user
current_user_provider.impersonation_acting_user
end
def refresh_session(user)
current_user_provider.refresh_session(user, session, cookies)
end
private
def current_user_provider
@current_user_provider ||= Discourse.current_user_provider.new(request.env)
end
end