mirror of
https://github.com/we-promise/sure.git
synced 2026-04-07 14:31:25 +00:00
* Fix OIDC household invitation (issue #900) - Auto-add existing user when inviting by email (no invite email sent) - Accept page: choose 'Create account' or 'Sign in' (supports OIDC) - Store invitation token in session on sign-in; accept after login (password, OIDC, OIDC link, OIDC JIT, MFA) - Invitation#accept_for!(user): add user to household and mark accepted - Defensive guards: nil/blank user, token normalization, accept_for! return check * Address PR review: rename accept_for! to accept_for, i18n OIDC notice, test fixes, stub Rails.application.config * Fix flaky system test: assert only configure step, not flash message Co-authored-by: Cursor <cursoragent@cursor.com> --------- Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: mkdev11 <jaysmth689+github@users.noreply.github.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
85 lines
2.3 KiB
Ruby
85 lines
2.3 KiB
Ruby
class ApplicationController < ActionController::Base
|
|
include RestoreLayoutPreferences, Onboardable, Localize, AutoSync, Authentication, Invitable,
|
|
SelfHostable, StoreLocation, Impersonatable, Breadcrumbable,
|
|
FeatureGuardable, Notifiable, SafePagination
|
|
include Pundit::Authorization
|
|
|
|
include Pagy::Backend
|
|
|
|
# Pundit uses current_user by default, but this app uses Current.user
|
|
def pundit_user
|
|
Current.user
|
|
end
|
|
|
|
before_action :detect_os
|
|
before_action :set_default_chat
|
|
before_action :set_active_storage_url_options
|
|
|
|
helper_method :demo_config, :demo_host_match?, :show_demo_warning?
|
|
|
|
private
|
|
def accept_pending_invitation_for(user)
|
|
return false if user.blank?
|
|
|
|
token = session[:pending_invitation_token]
|
|
return false if token.blank?
|
|
|
|
invitation = Invitation.pending.find_by(token: token.to_s)
|
|
return false unless invitation
|
|
return false unless invitation.accept_for(user)
|
|
|
|
session.delete(:pending_invitation_token)
|
|
true
|
|
end
|
|
|
|
def store_pending_invitation_if_valid
|
|
token = params[:invitation].to_s.presence
|
|
return if token.blank?
|
|
|
|
invitation = Invitation.pending.find_by(token: token)
|
|
session[:pending_invitation_token] = token if invitation
|
|
end
|
|
|
|
def detect_os
|
|
user_agent = request.user_agent
|
|
@os = case user_agent
|
|
when /Windows/i then "windows"
|
|
when /Macintosh/i then "mac"
|
|
when /Linux/i then "linux"
|
|
when /Android/i then "android"
|
|
when /iPhone|iPad/i then "ios"
|
|
else ""
|
|
end
|
|
end
|
|
|
|
# By default, we show the user the last chat they interacted with
|
|
def set_default_chat
|
|
@last_viewed_chat = Current.user&.last_viewed_chat
|
|
@chat = @last_viewed_chat
|
|
end
|
|
|
|
def set_active_storage_url_options
|
|
ActiveStorage::Current.url_options = {
|
|
protocol: request.protocol,
|
|
host: request.host,
|
|
port: request.optional_port
|
|
}
|
|
end
|
|
|
|
def demo_config
|
|
Rails.application.config_for(:demo)
|
|
rescue RuntimeError, Errno::ENOENT, Psych::SyntaxError
|
|
nil
|
|
end
|
|
|
|
def demo_host_match?(demo = demo_config)
|
|
return false unless demo.is_a?(Hash) && demo["hosts"].present?
|
|
|
|
demo["hosts"].include?(request.host)
|
|
end
|
|
|
|
def show_demo_warning?
|
|
demo_host_match?
|
|
end
|
|
end
|