Class: EmailToken

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/email_token.rb

Defined Under Namespace

Classes: TokenAccessError

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.confirm(token, scope: nil, skip_reviewable: false) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/models/email_token.rb', line 56

def self.confirm(token, scope: nil, skip_reviewable: false)
  User.transaction do
    email_token = confirmable(token, scope: scope)
    return if email_token.blank?

    email_token.update!(confirmed: true)

    user = email_token.user
    user.send_welcome_message = !user.active?
    user.email = email_token.email
    user.active = true
    user.custom_fields.delete("activation_reminder")
    user.save!
    user.create_reviewable if !skip_reviewable
    user.set_automatic_groups
    DiscourseEvent.trigger(:user_confirmed_email, user)
    Invite.redeem_for_existing_user(user) if scope == EmailToken.scopes[:signup]

    user.reload
  end
rescue ActiveRecord::RecordInvalid
  # If the user's email is already taken, just return nil (failure)
end

.confirmable(token, scope: nil) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
# File 'app/models/email_token.rb', line 80

def self.confirmable(token, scope: nil)
  return nil if token.blank?

  relation = unconfirmed.active.includes(:user).where(token_hash: hash_token(token))

  # TODO(2022-01-01): All email tokens should have scopes by now
  if !scope
    relation.first
  else
    relation.where(scope: scope).first || relation.where(scope: nil).first
  end
end

.enqueue_signup_email(email_token, to_address: nil) ⇒ Object



93
94
95
96
97
98
99
100
101
# File 'app/models/email_token.rb', line 93

def self.(email_token, to_address: nil)
  Jobs.enqueue(
    :critical_user_email,
    type: "signup",
    user_id: email_token.user_id,
    email_token: email_token.token,
    to_address: to_address,
  )
end

.hash_token(token) ⇒ Object



103
104
105
# File 'app/models/email_token.rb', line 103

def self.hash_token(token)
  Digest::SHA256.hexdigest(token)
end

.scopesObject



46
47
48
# File 'app/models/email_token.rb', line 46

def self.scopes
  @scopes ||= Enum.new(signup: 1, password_reset: 2, email_login: 3, email_update: 4)
end

Instance Method Details

#tokenObject

Raises:



50
51
52
53
54
# File 'app/models/email_token.rb', line 50

def token
  raise TokenAccessError.new if @token.blank?

  @token
end