devise_sms_verifiable 0.0.6 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b9341cde59779b8f48240a8bbbb5fa732a0e607
4
- data.tar.gz: 16aa797f5ea693d554ba6cee746d5f0e6f3629b7
3
+ metadata.gz: c51a8259b8b1fa460ebf008eaa844531ca4c92e4
4
+ data.tar.gz: d854dd3f18aa902e15ca032d16579c6c29c02ec2
5
5
  SHA512:
6
- metadata.gz: d51869dee0ad6abe2b2a85b2d2b45c624fd5d09c94f0a3636c1581869d7654eb4459c332b88e2f7daa852d5aeb8144d5bf6e0a9b9991218f4e2cfc67ac243b84
7
- data.tar.gz: ef7018d8502a2fd4c3cb0048b355ed436a6211a48ef75fd0d0440ffa0235988d96361ca129145dd9b001c0f8a9ef2d3ee39b17a7fbfbb8339b60840c6b9c9296
6
+ metadata.gz: 5f1b9bc706b2849084769f69bf30140a931ee95fd3a326912d619540241ee30b75785b2a02111ce9a501e074416305489d045794e082827d58a1bc869c498cb3
7
+ data.tar.gz: 8d1b8d98dcde47c913205ae0e9fdcab07a7df8888da30d6242ecce94186790358d3973271f9cad125eaef49f20d69266d02ba612a3dbbac6e979a9048e2ade05
@@ -1,16 +1,18 @@
1
1
  class Devise::SmsVerifiableController < DeviseController
2
- append_before_filter :sms_check_settings
2
+ append_before_filter :sms_check_settings!
3
3
 
4
4
  def new
5
+ set_flash_message :notice, :sms_activation_required
5
6
  end
6
7
 
7
8
  def create
8
9
  resource.sms_secret = public_send("current_#{resource_name}").public_send(Devise::sms_answer_field)
9
10
  secret = params[:user][:sms_secret]
10
- if secret && resource.sms_secret && resource.valid_secret?(secret)
11
- public_send("current_#{resource_name}").public_send(:update, Hash[Devise::phone_confirmation_field, true])
11
+ if secret && resource.sms_secret && resource.valid_token?(secret)
12
+ public_send("current_#{resource_name}").public_send(:update, Hash[Devise::phone_confirmation_field, true, :sms_token_confirmed_at, DateTime.now])
12
13
  redirect_to Devise::successful_path
13
14
  else
15
+ set_flash_message :notice, :sms_token_invalid
14
16
  render :new
15
17
  end
16
18
  end
@@ -18,13 +20,16 @@ class Devise::SmsVerifiableController < DeviseController
18
20
  def send_pass
19
21
  number = public_send("current_#{resource_name}").public_send(Devise::phone_field)
20
22
  provider = Devise::sms_provider
21
- pass_word = public_send(Devise::sms_secret_method)
22
- if [number, provider, pass_word].all?
23
- provider.public_send(:send_sms, number, pass_word)
23
+ if [number, provider].all? && !public_send("current_#{resource_name}").sms_confirmed?
24
+ token = public_send("current_#{resource_name}").sms_confirm!
25
+ provider.public_send(:send_sms, number, token)
26
+ set_flash_message :notice, :send_token, phone: number
24
27
  end
25
28
  render :new
26
29
  end
27
30
 
31
+ protected
32
+
28
33
  def resource
29
34
  _resource = resource_class.new
30
35
  instance_variable_set(:@user, _resource)
@@ -1,8 +1,9 @@
1
+ <%= flash[:notice] if flash[:notice] %>
1
2
  <h2>Sms verifiable</h2>
2
3
  <%= form_for(resource, :as => resource_name, :url => sms_path(resource_name)) do |f| %>
3
4
  <%= devise_error_messages! %>
4
5
  <p><%= f.label :sms_secret %><br />
5
- <%= f.text_field :sms_secret %></p>
6
+ <%= f.text_field :sms_secret, value: nil %></p>
6
7
  <p><%= f.submit "send" %></p>
7
8
  <% end %>
8
9
  <%= button_to 'send sms', public_send("send_pass_#{resource_name}_sms_path"), data: { method: :post } %>
@@ -0,0 +1,10 @@
1
+ en:
2
+ errors:
3
+ messages:
4
+ sms_token_invalid: "Invalid token"
5
+ devise:
6
+ sms_verifiable:
7
+ send_token: 'An activation token was sent by SMS to %{phone}.'
8
+ sms_token_invalid: 'The sms token provided is not valid!'
9
+ confirmed: 'Your account has been activated.'
10
+ sms_activation_required: 'SMS Activation is required'
@@ -0,0 +1,10 @@
1
+ ru:
2
+ errors:
3
+ messages:
4
+ sms_token_invalid: "Неверный код"
5
+ devise:
6
+ sms_verifiable:
7
+ send_token: 'Выслано SMS с кодом подтверждения на номер %{phone}.'
8
+ sms_token_invalid: 'Неверный код'
9
+ confirmed: 'Спасибо Ваш номер подтверждён'
10
+ sms_activation_required: 'Подтвердите аккаунт с помощью телефона'
@@ -12,12 +12,6 @@ require 'devise_sms_verifiable/engine'
12
12
  require 'devise_sms_verifiable/errors'
13
13
 
14
14
  module Devise
15
- mattr_accessor :sms_confirmation_method
16
- @@sms_confirmation_method = :sms_confirmation?
17
-
18
- mattr_accessor :sms_secret_method
19
- @@sms_secret_method = :sms_secret
20
-
21
15
  mattr_accessor :sms_answer_field
22
16
  @@sms_answer_field = :sms_answer
23
17
 
@@ -30,6 +24,9 @@ module Devise
30
24
  mattr_accessor :successful_path
31
25
  @@successful_path = '/'
32
26
 
27
+ mattr_accessor :token_generator
28
+ @@token_generator = :default
29
+
33
30
  mattr_accessor :sms_provider
34
31
  @@sms_provider = DeviseSmsVerifiable::Provider
35
32
 
@@ -1,22 +1,32 @@
1
1
  module DeviseSmsVerifiable
2
2
  module Controllers
3
3
  module InternalHelpers
4
- extend ActiveSupport::Concern
5
4
 
6
- def sms_check_settings
7
- raise UnauthorizedAccess unless signed_in?(Devise::default_scope)
8
- raise PhoneFieldNotFound unless public_send("current_#{resource_name}").respond_to?(Devise::phone_field)
9
- raise PhoneFieldEmpty unless public_send("current_#{resource_name}").public_send(Devise::phone_field)
10
- raise SecretMethodNotFound unless InternalHelpers::valid_method?(self, Devise::sms_secret_method)
5
+ def sms_check_settings!
6
+ if public_send("current_#{Devise::default_scope}").nil?
7
+ public_send(:redirect_to, %I[new #{Devise::default_scope} session]) and return
8
+ end
9
+ raise PhoneFieldNotFound unless public_send("current_#{Devise::default_scope}").respond_to?(Devise::phone_field)
10
+ raise PhoneFieldEmpty unless public_send("current_#{Devise::default_scope}").public_send(Devise::phone_field)
11
11
  raise ValidSendSmsMethodNotFound unless InternalHelpers::valid_method?(Devise::sms_provider, :send_sms)
12
12
  rescue DeviseSmsVerifiableError, ArgumentError
13
13
  raise "DeviseSmsVerifiableError module error: #{$!.message} "
14
14
  end
15
15
 
16
+ def require_sms_verifiable!
17
+ sms_check_settings!
18
+ unless public_send(:"current_#{Devise::default_scope}").public_send("#{Devise::phone_confirmation_field}?")
19
+ redirect_to %I[new #{Devise::default_scope} sms] and return
20
+ end
21
+ end
22
+
23
+ protected
24
+
16
25
  def self.valid_method?(caller, method)
17
26
  method.kind_of?(Symbol) && caller.respond_to?(method)
18
27
  end
19
28
  end
20
29
  end
21
30
  end
31
+ ActionController::Base.send :include, DeviseSmsVerifiable::Controllers::InternalHelpers
22
32
 
@@ -1,7 +1,5 @@
1
1
  class DeviseSmsVerifiableError < RuntimeError;end
2
- class UnauthorizedAccess < DeviseSmsVerifiableError;end
3
2
  class ConfirmationMethodNotFound < DeviseSmsVerifiableError;end
4
- class SecretMethodNotFound < DeviseSmsVerifiableError;end
5
3
  class PhoneFieldNotFound < DeviseSmsVerifiableError;end
6
4
  class PhoneFieldEmpty < DeviseSmsVerifiableError;end
7
5
  class ValidSendSmsMethodNotFound < DeviseSmsVerifiableError;end
@@ -5,8 +5,39 @@ module Devise
5
5
  mattr_accessor :sms_secret
6
6
  @@sms_secret = nil
7
7
 
8
- def valid_secret?(incoming_secret)
9
- @@sms_secret == incoming_secret.to_s
8
+ def sms_confirmed?
9
+ public_send("#{Devise::phone_confirmation_field}?")
10
+ end
11
+
12
+ def sms_unconfirm!
13
+ unconfirm_hash = Hash[Devise::sms_answer_field, nil,
14
+ Devise::phone_confirmation_field, false,
15
+ Devise::sms_token_sent_at, nil,
16
+ Devise::sms_token_confirmed_at, nil]
17
+ public_send(:update, unconfirm_hash)
18
+ end
19
+
20
+ def sms_confirm!
21
+ token = generate_token!
22
+ public_send(:update, Hash[Devise::sms_answer_field, token,
23
+ :sms_token_sent_at, DateTime.now])
24
+ token
25
+ end
26
+
27
+ def valid_token?(incoming_token)
28
+ @@sms_secret == incoming_token.to_s
29
+ end
30
+
31
+ protected
32
+
33
+ def generate_token!
34
+ meth = Devise::token_generator
35
+ token = if meth.is_a? Symbol
36
+ rand(2000..4000)
37
+ elsif meth.is_a? Proc
38
+ meth.call
39
+ end
40
+ token
10
41
  end
11
42
  end
12
43
  end
@@ -1,3 +1,3 @@
1
1
  module DeviseSmsVerifiable
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -17,10 +17,6 @@ module DeviseSmsVerifiable
17
17
  # ==> Configuration for :sms_verifiable
18
18
  # Field in model for confirm phone(must be boolean)
19
19
  #config.phone_confirmation_field = :phone_confirm
20
- # Method for check sms confirmation. Define in ApplicationController
21
- #config.sms_confirmation_method = :sms_confirmation?
22
- # Method generate secret and write to model. Define in ApplicationController
23
- #config.sms_secret_method = :sms_secret
24
20
  # Attribut on model return rigth answer
25
21
  #config.sms_answer_field = :sms_answer
26
22
  # Field in model which phone number
@@ -29,6 +25,9 @@ module DeviseSmsVerifiable
29
25
  #config.phone_confirmation_field = :phone_confirm
30
26
  # Path after successful confirmation
31
27
  #config.successful_path = '/'
28
+ # Token generator method(default 4 digit)
29
+ # must return valid token
30
+ #config.token_generator = -> { rand(1000..2000) }
32
31
  # SMS provider module(have default for STREAM-TELECOM)
33
32
  #config.sms_provider = DeviseSmsVerifiable::Provider
34
33
  # Send sms silent for test
@@ -6,19 +6,20 @@ module DeviseSmsVerifiable
6
6
  def add_migrations
7
7
  table_name = Devise::default_scope.to_s.pluralize
8
8
  exist_migration = Dir.glob('db/migrate/*_devise_sms_verifiable_add_to_*')
9
- exist_migration.any? ? p("Check db/migrate, look like have sms verifiable migration") : nil
10
- if exist_migration.blank?
9
+ if exist_migration.any? && self.behavior == :invoke
10
+ p("Check db/migrate, look like have sms verifiable migration")
11
+ end
12
+ if exist_migration.blank? && self.behavior != :revoke
11
13
  migration_path = "db/migrate/#{Time.now.strftime("%Y%m%d%H%M%S")}_devise_sms_verifiable_add_to_#{table_name}.rb"
12
14
  migration_template = <<-RUBY
13
15
  class DeviseSmsVerifiableAddTo#{table_name.camelize} < ActiveRecord::Migration
14
16
  def self.up
15
17
  change_table :#{table_name} do |t|
16
- # Field in the model which phone number
17
18
  t.string :phone
18
- # Field in the model which returns the correct answer
19
19
  t.string :sms_answer
20
- # Field in the model which returns phone confirm or no
21
20
  t.boolean :phone_confirm, default: false
21
+ t.datetime :sms_token_sent_at
22
+ t.datetime :sms_token_confirmed_at
22
23
  end
23
24
  end
24
25
 
@@ -26,10 +27,14 @@ class DeviseSmsVerifiableAddTo#{table_name.camelize} < ActiveRecord::Migration
26
27
  remove_column :#{table_name}, :phone
27
28
  remove_column :#{table_name}, :sms_answer
28
29
  remove_column :#{table_name}, :phone_confirm
30
+ remove_column :#{table_name}, :sms_token_sent_at
31
+ remove_column :#{table_name}, :sms_token_confirmed_at
29
32
  end
30
33
  end
31
34
  RUBY
32
35
  create_file(migration_path, migration_template)
36
+ elsif self.behavior == :revoke
37
+ FileUtils.rm_rf *exist_migration if exist_migration.any?
33
38
  end
34
39
  end
35
40
  end
@@ -5,12 +5,6 @@ Some setup you must do manually if you haven't yet(in config/initializers/devise
5
5
  You need field in model for confirm phone(must be boolean).
6
6
  config.phone_confirmation_field = :phone_confirm
7
7
 
8
- You need define method for check sms confirmation. (in ApplicationController)
9
- config.sms_confirmation_method = :sms_confirmation?
10
-
11
- Need a method that generates, writes the word model, returns the secret word. (in ApplicationController)
12
- config.sms_secret_method = :sms_secret
13
-
14
8
  Field in the model which returns the correct answer
15
9
  config.sms_answer_field = :sms_answer
16
10
 
metadata CHANGED
@@ -1,139 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_sms_verifiable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kiselenko Roman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-22 00:00:00.000000000 Z
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.3
19
+ version: '4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.3
26
+ version: '4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: devise
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '3.2'
33
+ version: '3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '3.2'
40
+ version: '3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rest_client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec-rails
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: capybara
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: factory_girl_rails
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: ffaker
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: pry
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
80
+ - - '>='
123
81
  - !ruby/object:Gem::Version
124
82
  version: '0'
125
83
  - !ruby/object:Gem::Dependency
126
84
  name: sqlite3
127
85
  requirement: !ruby/object:Gem::Requirement
128
86
  requirements:
129
- - - ">="
87
+ - - '>='
130
88
  - !ruby/object:Gem::Version
131
89
  version: '0'
132
90
  type: :development
133
91
  prerelease: false
134
92
  version_requirements: !ruby/object:Gem::Requirement
135
93
  requirements:
136
- - - ">="
94
+ - - '>='
137
95
  - !ruby/object:Gem::Version
138
96
  version: '0'
139
97
  description: |2
@@ -148,6 +106,8 @@ files:
148
106
  - Rakefile
149
107
  - app/controllers/devise/sms_verifiable_controller.rb
150
108
  - app/views/devise/sms_verifiable/new.html.erb
109
+ - config/locales/en.yml
110
+ - config/locales/ru.yml
151
111
  - lib/devise_sms_verifiable.rb
152
112
  - lib/devise_sms_verifiable/controllers/internal_helpers.rb
153
113
  - lib/devise_sms_verifiable/controllers/url_helpers.rb
@@ -163,7 +123,8 @@ files:
163
123
  - lib/generators/devise_sms_verifiable/templates/README
164
124
  - lib/generators/devise_sms_verifiable/views_generator.rb
165
125
  homepage: https://github.com/fishbullet/devise_sms_verifiable
166
- licenses: []
126
+ licenses:
127
+ - MIT
167
128
  metadata: {}
168
129
  post_install_message:
169
130
  rdoc_options: []
@@ -171,17 +132,17 @@ require_paths:
171
132
  - lib
172
133
  required_ruby_version: !ruby/object:Gem::Requirement
173
134
  requirements:
174
- - - ">="
135
+ - - '>='
175
136
  - !ruby/object:Gem::Version
176
137
  version: '0'
177
138
  required_rubygems_version: !ruby/object:Gem::Requirement
178
139
  requirements:
179
- - - ">="
140
+ - - '>='
180
141
  - !ruby/object:Gem::Version
181
142
  version: '0'
182
143
  requirements: []
183
144
  rubyforge_project:
184
- rubygems_version: 2.2.2
145
+ rubygems_version: 2.4.3
185
146
  signing_key:
186
147
  specification_version: 4
187
148
  summary: DeviseSmsVerifiable it is simple fork devise_sms_activable for my project`s