module Devise::Models::SmsConfirmable

Public Class Methods

new(*args, &block) click to toggle source
Calls superclass method
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 20
def initialize(*args, &block)
  @bypass_sms_confirmation_postpone = false
  @skip_sms_reconfirmation_in_callback = false
  @sms_reconfirmation_required = false
  @skip_sms_confirmation_notification = false
  @raw_sms_confirmation_token = nil
  super
end
required_fields(klass) click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 29
def self.required_fields(klass)
  required_methods = [:sms_confirmed_at, :sms_confirmation_sent_at, :sms_confirmation_token]
  required_methods << :unconfirmed_phone if klass.sms_reconfirmable
  required_methods
end

Public Instance Methods

active_for_authentication?() click to toggle source
Calls superclass method
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 94
def active_for_authentication?

  super && (!sms_confirmation_required? || sms_confirmed? || sms_confirmation_period_valid?)
end
generate_sms_confirmation_token!() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 103
def generate_sms_confirmation_token!
  generate_sms_confirmation_token && save(validate: false)
end
pending_sms_reconfirmation?() click to toggle source

override Devise::Models::Confirmable#pending_sms_reconfirmation?

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 108
def pending_sms_reconfirmation?
  self.class.sms_reconfirmable && unconfirmed_phone.present?
end
resend_sms_confirmation_instructions() click to toggle source

Resend confirmation token. Regenerates the token if the period is expired.

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 88
def resend_sms_confirmation_instructions
  pending_any_sms_confirmation do
    send_sms_confirmation_instructions
  end
end
send_phone_changed_notification() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 99
def send_phone_changed_notification
  send_sms_devise_notification(:phone_changed, to: phone_before_last_save)
end
send_sms_confirmation_instructions() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 77
def send_sms_confirmation_instructions
  unless @raw_sms_confirmation_token
    generate_sms_confirmation_token!
  end

  opts = pending_sms_reconfirmation? ? { to: unconfirmed_phone } : { }
  send_sms_devise_notification(:confirmation_instructions, @raw_sms_confirmation_token, opts)
end
send_sms_reconfirmation_instructions() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 65
def send_sms_reconfirmation_instructions
  @sms_reconfirmation_required = false

  unless @skip_confirmation_notification
    send_sms_confirmation_instructions
  end
end
skip_sms_confirmation!() click to toggle source

If you don't want confirmation to be sent on create, neither a code to be generated, call skip_sms_confirmation!

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 114
def skip_sms_confirmation!
  self.sms_confirmed_at = Time.now.utc
end
skip_sms_confirmation_notification!() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 73
def skip_sms_confirmation_notification!
  @skip_confirmation_notification = true
end
skip_sms_reconfirmation!() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 118
def skip_sms_reconfirmation!
  @bypass_sms_confirmation_postpone = true
end
sms_confirm(args={}) click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 35
def sms_confirm(args={})
  pending_any_sms_confirmation do
    if sms_confirmation_period_expired?
      self.errors.add(:phone, :sms_confirmation_period_expired,
                      period: Devise::TimeInflector.time_ago_in_words(self.class.sms_confirm_within.ago))
      return false
    end

    self.sms_confirmed_at = Time.now.utc

    saved = if pending_sms_reconfirmation?
              skip_sms_reconfirmation!
              self.phone = unconfirmed_phone
              self.unconfirmed_phone = nil

              save(validate: true, context: args[:context])
            else
              save(validate: args[:ensure_valid] == true, context: args[:context])
            end

    after_sms_confirmation if saved
    saved
  end
end
sms_confirmed?() click to toggle source

Verifies whether a user is sms-confirmed or not

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 61
def sms_confirmed?
  !!sms_confirmed_at
end

Protected Instance Methods

after_sms_confirmation() click to toggle source

A callback initiated after successfully confirming. This can be used to insert your own logic that is only run after the user successfully confirms.

Example:

def after_sms_confirmation
  self.update_attribute(:invite_code, nil)
end
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 145
def after_sms_confirmation
end
generate_sms_confirmation_token() click to toggle source

Generates a new random token for confirmation, and stores the time this token is being generated in sms_confirmation_sent_at

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 162
def generate_sms_confirmation_token
  if self.sms_confirmation_token && !sms_confirmation_period_expired?
    @raw_sms_confirmation_token = self.sms_confirmation_token
  else
    self.sms_confirmation_token = @raw_sms_confirmation_token = Devise.friendly_token
    self.sms_confirmation_sent_at = Time.now.utc
  end
end
pending_any_sms_confirmation() { || ... } click to toggle source

Checks whether the record requires any confirmation.

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 172
def pending_any_sms_confirmation
  if (!sms_confirmed? || pending_sms_reconfirmation?)
    yield
  else
    self.errors.add(:phone, :already_confirmed)
    false
  end
end
postpone_phone_change?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 181
def postpone_phone_change?
  postpone = self.class.sms_reconfirmable &&
      will_save_change_to_phone? &&
      !@bypass_sms_confirmation_postpone &&
      self.phone.present? &&
      (!@skip_sms_reconfirmation_in_callback || !self.phone_in_database.nil?)
  @bypass_sms_confirmation_postpone = false

  postpone
end
postpone_phone_change_until_confirmation_and_regenerate_sms_confirmation_token() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 200
def postpone_phone_change_until_confirmation_and_regenerate_sms_confirmation_token
  @sms_reconfirmation_required = true
  self.unconfirmed_phone = self.phone
  self.phone = self.phone_in_database
  self.sms_confirmation_token = nil
  generate_sms_confirmation_token
end
send_on_create_sms_confirmation_instructions() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 148
def send_on_create_sms_confirmation_instructions
  send_sms_confirmation_instructions
end
send_phone_changed_notification?() click to toggle source

With reconfirmable, notify the original email when the user first requests the email change, instead of when the change is confirmed.

# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 210
def send_phone_changed_notification?
  self.class.sms_reconfirmable && self.class.send_phone_changed_notification && sms_reconfirmation_required?
end
send_sms_confirmation_notification?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 192
def send_sms_confirmation_notification?
  sms_confirmation_required? && !@skip_confirmation_notification && self.phone.present?
end
skip_sms_reconfirmation_in_callback!() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 124
def skip_sms_reconfirmation_in_callback!
  @skip_sms_reconfirmation_in_callback = true
end
sms_confirmation_period_expired?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 156
def sms_confirmation_period_expired?
  self.class.sms_confirm_within && self.sms_confirmation_sent_at && (Time.now.utc > self.sms_confirmation_sent_at.utc + self.class.sms_confirm_within)
end
sms_confirmation_period_valid?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 128
def sms_confirmation_period_valid?
  return true if self.class.allow_sms_unconfirmed_access_for.nil?
  return false if self.class.allow_sms_unconfirmed_access_for == 0.days

  sms_confirmation_sent_at && sms_confirmation_sent_at.utc >= self.class.allow_sms_unconfirmed_access_for.ago
end
sms_confirmation_required?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 152
def sms_confirmation_required?
  !sms_confirmed?
end
sms_reconfirmation_required?() click to toggle source
# File lib/devise_sms_confirmable/models/sms_confirmable.rb, line 196
def sms_reconfirmation_required?
  self.class.sms_reconfirmable && @sms_reconfirmation_required && (self.phone.present? || self.unconfirmed_phone.present?)
end