Class: RailsBase::MfaEvent

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

Defined Under Namespace

Classes: InvalidParameter

Constant Summary collapse

ENABLE_SMS_EVENT =
:sms_enable
DISABLE_SMS_EVENT =
:sms_disable
FORGOT_PASSWORD =
:forgot_password
ADMIN_VERIFY =
:admin_verify

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(event:, flash_notice:, redirect:, only_mfa: nil, phone_number: nil, ttl: nil, death_time: nil, user_id: nil, user: nil, invalid_redirect: nil, sign_in_user: false, access_count: 0, access_count_max: nil, satiated: false, set_satiated_on_success: true) ⇒ MfaEvent

Returns a new instance of MfaEvent.



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rails_base/mfa_event.rb', line 83

def initialize(event:, flash_notice:, redirect:, only_mfa: nil, phone_number: nil, ttl: nil, death_time: nil, user_id: nil, user: nil, invalid_redirect: nil, sign_in_user: false, access_count: 0, access_count_max: nil, satiated: false, set_satiated_on_success: true)
  @death_time = begin
    raw = (death_time || ttl&.from_now)
    Time.zone.parse(raw.to_s) rescue nil
  end

  @access_count = access_count
  @access_count_max = access_count_max
  @event = event
  @flash_notice = flash_notice
  @invalid_redirect = invalid_redirect || RailsBase.url_routes.authenticated_root_path
  @only_mfa = only_mfa
  @phone_number = phone_number
  @redirect = redirect
  @satiated = satiated
  @set_satiated_on_success = set_satiated_on_success
  @sign_in_user = 
  @user_id = user_id || user.id rescue nil

  validate_data!
end

Instance Attribute Details

#access_countObject (readonly)

Returns the value of attribute access_count.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def access_count
  @access_count
end

#access_count_maxObject (readonly)

Returns the value of attribute access_count_max.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def access_count_max
  @access_count_max
end

#death_timeObject (readonly)

Returns the value of attribute death_time.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def death_time
  @death_time
end

#descriptionObject (readonly)

Returns the value of attribute description.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def description
  @description
end

#eventObject (readonly)

Returns the value of attribute event.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def event
  @event
end

#flash_noticeObject (readonly)

Returns the value of attribute flash_notice.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def flash_notice
  @flash_notice
end

#invalid_redirectObject (readonly)

Returns the value of attribute invalid_redirect.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def invalid_redirect
  @invalid_redirect
end

#only_mfaObject (readonly)

Returns the value of attribute only_mfa.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def only_mfa
  @only_mfa
end

#paramsObject (readonly)

Returns the value of attribute params.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def params
  @params
end

#phone_numberObject (readonly)

Returns the value of attribute phone_number.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def phone_number
  @phone_number
end

#redirectObject (readonly)

Returns the value of attribute redirect.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def redirect
  @redirect
end

#satiatedObject (readonly)

Returns the value of attribute satiated.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def satiated
  @satiated
end

#set_satiated_on_successObject (readonly)

Returns the value of attribute set_satiated_on_success.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def set_satiated_on_success
  @set_satiated_on_success
end

#sign_in_userObject (readonly)

Returns the value of attribute sign_in_user.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def 
  @sign_in_user
end

#ttlObject (readonly)

Returns the value of attribute ttl.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def ttl
  @ttl
end

#user_idObject (readonly)

Returns the value of attribute user_id.



12
13
14
# File 'lib/rails_base/mfa_event.rb', line 12

def user_id
  @user_id
end

Class Method Details

.admin_actions(user:) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/rails_base/mfa_event.rb', line 15

def self.admin_actions(user:)
  params = {
    user: user,
    event: ADMIN_VERIFY,
    ttl: 30.seconds,
    redirect: "",
    invalid_redirect: "",
    flash_notice: "",
  }

  new(**params)
end

.forgot_password(user:, data:) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/rails_base/mfa_event.rb', line 69

def self.forgot_password(user:, data:)
  params = {
    user: user,
    event: FORGOT_PASSWORD,
    ttl: 2.minutes,
    invalid_redirect: RailsBase.url_routes.unauthenticated_root_path,
    redirect: RailsBase.url_routes.reset_password_input_path(data:),
    flash_notice: "MFA success. You may now reset your forgotten password",
    access_count_max: 1,
  }

  new(**params)
end

.login_event(user:) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/rails_base/mfa_event.rb', line 28

def self.(user:)
  params = {
    user: user,
    event: :login,
    ttl: 1.minutes,
    redirect: RailsBase.url_routes.authenticated_root_path,
    invalid_redirect: RailsBase.url_routes.unauthenticated_root_path,
    sign_in_user: true,
    flash_notice: "Welcome #{user.full_name}. You have succesfully signed in"
  }

  new(**params)
end

.sms_disable(user:) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rails_base/mfa_event.rb', line 56

def self.sms_disable(user:)
  params = {
    user: user,
    event: DISABLE_SMS_EVENT,
    ttl: 5.minutes,
    invalid_redirect: RailsBase.url_routes.,
    redirect: RailsBase.url_routes.,
    flash_notice: "SMS option for MFA is disabled"
  }

  new(**params)
end

.sms_enable(user:) ⇒ Object

This is a JSON event not html; Can leave redirects/notice empty



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rails_base/mfa_event.rb', line 43

def self.sms_enable(user:)
  params = {
    user: user,
    event: ENABLE_SMS_EVENT,
    ttl: 5.minutes,
    invalid_redirect: RailsBase.url_routes.,
    redirect: RailsBase.url_routes.,
    flash_notice: ""
  }

  new(**params)
end

Instance Method Details

#increase_access_count!Object



135
136
137
# File 'lib/rails_base/mfa_event.rb', line 135

def increase_access_count!
  @access_count += 1
end

#invalid_reasonsObject



153
154
155
156
157
158
159
# File 'lib/rails_base/mfa_event.rb', line 153

def invalid_reasons
  arr = []
  arr << "Max Access count reached" unless valid_by_death_time?
  arr << "#{event} has expired" unless valid_by_access_count?

  arr
end

#satiated!Object



127
128
129
# File 'lib/rails_base/mfa_event.rb', line 127

def satiated!
  @satiated = true
end

#satiated?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/rails_base/mfa_event.rb', line 131

def satiated?
  @satiated
end

#to_hashObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/rails_base/mfa_event.rb', line 105

def to_hash
  {
    access_count:,
    access_count_max:,
    death_time:,
    event:,
    flash_notice:,
    invalid_redirect:,
    only_mfa:,
    phone_number:,
    redirect:,
    satiated:,
    set_satiated_on_success:,
    sign_in_user:,
    user_id:,
  }
end

#valid?Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/rails_base/mfa_event.rb', line 139

def valid?
  valid_by_death_time? && valid_by_access_count?
end

#valid_by_access_count?Boolean

Returns:

  • (Boolean)


147
148
149
150
151
# File 'lib/rails_base/mfa_event.rb', line 147

def valid_by_access_count?
  return true if @access_count_max.nil?

  @access_count_max
end

#valid_by_death_time?Boolean

Returns:

  • (Boolean)


143
144
145
# File 'lib/rails_base/mfa_event.rb', line 143

def valid_by_death_time?
  death_time >= Time.now
end