Class: AdminConfirmation

Inherits:
Object
  • Object
show all
Defined in:
lib/admin_confirmation.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(target_user, performed_by) ⇒ AdminConfirmation

Returns a new instance of AdminConfirmation.



8
9
10
11
# File 'lib/admin_confirmation.rb', line 8

def initialize(target_user, performed_by)
  @target_user = target_user
  @performed_by = performed_by
end

Instance Attribute Details

#performed_byObject (readonly)

Returns the value of attribute performed_by.



5
6
7
# File 'lib/admin_confirmation.rb', line 5

def performed_by
  @performed_by
end

#target_userObject (readonly)

Returns the value of attribute target_user.



6
7
8
# File 'lib/admin_confirmation.rb', line 6

def target_user
  @target_user
end

#tokenObject

Returns the value of attribute token.



4
5
6
# File 'lib/admin_confirmation.rb', line 4

def token
  @token
end

Class Method Details

.exists_for?(user_id) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/admin_confirmation.rb', line 42

def self.exists_for?(user_id)
  Discourse.redis.exists? "admin-confirmation:#{user_id}"
end

.find_by_code(token) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/admin_confirmation.rb', line 46

def self.find_by_code(token)
  json = Discourse.redis.get("admin-confirmation-token:#{token}")
  return nil unless json

  parsed = JSON.parse(json)
  target_user = User.find(parsed["target_user_id"].to_i)
  performed_by = User.find(parsed["performed_by"].to_i)

  ac = AdminConfirmation.new(target_user, performed_by)
  ac.token = token
  ac
end

Instance Method Details

#create_confirmationObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/admin_confirmation.rb', line 13

def create_confirmation
  guardian = Guardian.new(@performed_by)
  guardian.ensure_can_grant_admin!(@target_user)

  @token = SecureRandom.hex
  Discourse.redis.setex("admin-confirmation:#{@target_user.id}", 3.hours.to_i, @token)

  payload = { target_user_id: @target_user.id, performed_by: @performed_by.id }
  Discourse.redis.setex("admin-confirmation-token:#{@token}", 3.hours.to_i, payload.to_json)

  Jobs.enqueue(
    :admin_confirmation_email,
    to_address: @performed_by.email,
    target_email: @target_user.email,
    target_username: @target_user.username,
    token: @token,
  )
end

#email_confirmed!Object



32
33
34
35
36
37
38
39
40
# File 'lib/admin_confirmation.rb', line 32

def email_confirmed!
  guardian = Guardian.new(@performed_by)
  guardian.ensure_can_grant_admin!(@target_user)

  @target_user.grant_admin!
  StaffActionLogger.new(@performed_by).log_grant_admin(@target_user)
  Discourse.redis.del "admin-confirmation:#{@target_user.id}"
  Discourse.redis.del "admin-confirmation-token:#{@token}"
end