tiny_passport 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/ables/tiny_passport/account_validate_able.rb +24 -0
- data/app/ables/tiny_passport/aggrement_term_able.rb +28 -0
- data/app/ables/tiny_passport/formable.rb +17 -0
- data/app/ables/tiny_passport/query_able.rb +25 -0
- data/app/controllers/tiny_passport/application_controller.rb +1 -0
- data/app/displays/tiny_passport/account_display.rb +25 -0
- data/app/displays/tiny_passport/oauth_login_display.rb +21 -0
- data/app/displays/tiny_passport/oauth_token_display.rb +25 -0
- data/app/errors/tiny_passport/alert_authorized_error.rb +6 -0
- data/app/errors/tiny_passport/unauthorized_error.rb +6 -0
- data/app/forms/tiny_passport/account_active_form.rb +83 -0
- data/app/forms/tiny_passport/account_form.rb +6 -0
- data/app/forms/tiny_passport/confirmation_token_form.rb +58 -0
- data/app/forms/tiny_passport/oauth/bind_connect_form.rb +65 -0
- data/app/forms/tiny_passport/oauth/bind_disconnect_form.rb +42 -0
- data/app/forms/tiny_passport/oauth/callback_form.rb +165 -0
- data/app/forms/tiny_passport/oauth/login_connect_form.rb +63 -0
- data/app/forms/tiny_passport/registration_form.rb +172 -0
- data/app/forms/tiny_passport/remember_token_auth_form.rb +32 -0
- data/app/forms/tiny_passport/reset_password_form.rb +95 -0
- data/app/forms/tiny_passport/reset_password_token_form.rb +55 -0
- data/app/forms/tiny_passport/session_form.rb +116 -0
- data/app/forms/tiny_passport/update_password_form.rb +50 -0
- data/app/forms/tiny_passport/welcome_email_form.rb +47 -0
- data/app/helpers/tiny_passport/application_helper.rb +1 -0
- data/app/mailers/tiny_passport/registration_mailer.rb +23 -0
- data/app/mailers/tiny_passport/reset_password_mailer.rb +16 -0
- data/app/models/concerns/tiny_passport/account_authenticatable.rb +24 -0
- data/app/models/tiny_passport/account.rb +41 -0
- data/app/models/tiny_passport/avatar.rb +6 -0
- data/app/models/tiny_passport/login_email.rb +89 -0
- data/app/models/tiny_passport/login_record.rb +69 -0
- data/app/models/tiny_passport/oauth_bind.rb +9 -0
- data/app/models/tiny_passport/oauth_info.rb +8 -0
- data/app/models/tiny_passport/oauth_login.rb +28 -0
- data/app/models/tiny_passport/oauth_token.rb +57 -0
- data/app/queries/tiny_passport/account_query.rb +45 -0
- data/app/services/tiny_passport/account_service.rb +43 -0
- data/app/services/tiny_passport/email_send_service.rb +32 -0
- data/app/services/tiny_passport/oauth_service.rb +11 -0
- data/app/views/layouts/tiny_passport/mailer.html.erb +7 -0
- data/app/views/tiny_passport/registration_mailer/send_confirmation_token.html.erb +5 -0
- data/app/views/tiny_passport/registration_mailer/welcome.html.erb +5 -0
- data/app/views/tiny_passport/reset_password_mailer/send_token.html.erb +5 -0
- data/config/locales/en/forms.en.yml +81 -0
- data/config/locales/zh-CN/forms.zh-CN.yml +123 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20131105103853_create_tiny_passport_accounts.rb +23 -0
- data/db/migrate/20131105104415_create_tiny_passport_login_records.rb +20 -0
- data/db/migrate/20131105104559_create_tiny_passport_oauth_tokens.rb +27 -0
- data/db/migrate/20131105104632_create_tiny_passport_oauth_logins.rb +15 -0
- data/db/migrate/20131105104702_create_tiny_passport_oauth_binds.rb +16 -0
- data/db/migrate/20131105104738_create_tiny_passport_oauth_infos.rb +13 -0
- data/db/migrate/20131105104847_create_tiny_passport_avatars.rb +20 -0
- data/db/migrate/20131107031935_create_tiny_passport_login_emails.rb +25 -0
- data/lib/omniauth/strategies/qq_connect.rb +114 -0
- data/lib/tiny_passport/config.rb +72 -0
- data/lib/tiny_passport/engine.rb +16 -0
- data/lib/tiny_passport/http_authable.rb +50 -0
- data/lib/tiny_passport/http_authcenter.rb +138 -0
- data/lib/tiny_passport/mailerable.rb +20 -0
- data/lib/tiny_passport/omniauth/strategable.rb +21 -0
- data/lib/tiny_passport/version.rb +2 -1
- data/lib/tiny_passport.rb +13 -0
- data/test/dummy/app/controllers/application_controller.rb +1 -0
- data/test/dummy/app/helpers/application_helper.rb +1 -0
- data/test/dummy/config/application.rb +1 -0
- data/test/dummy/config/boot.rb +1 -0
- data/test/dummy/config/environment.rb +1 -0
- data/test/dummy/config/environments/development.rb +1 -0
- data/test/dummy/config/environments/production.rb +1 -0
- data/test/dummy/config/environments/test.rb +1 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +1 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +1 -0
- data/test/dummy/config/initializers/inflections.rb +1 -0
- data/test/dummy/config/initializers/mime_types.rb +1 -0
- data/test/dummy/config/initializers/secret_token.rb +1 -0
- data/test/dummy/config/initializers/session_store.rb +1 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +1 -0
- data/test/dummy/config/routes.rb +1 -0
- data/test/dummy/db/schema.rb +138 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +15986 -0
- data/test/dummy/tmp/cache/271/2A1/tiny_cache%2Fmodels%2FTinyPassport%3A%3AAccount%2F1%2F1 +0 -0
- data/test/dummy/tmp/cache/EDF/4C1/tiny_cache%2Fmodel_uniq_keys%2FTinyPassport%3A%3ALoginEmail%2F%5B%5B%22account_id%22%2C+1%5D%5D +1 -0
- data/test/fixtures/tiny_passport/avatars.yml +23 -0
- data/test/fixtures/tiny_passport/login_emails.yml +23 -0
- data/test/fixtures/tiny_passport/login_records.yml +17 -0
- data/test/fixtures/tiny_passport/oauth_binds.yml +13 -0
- data/test/fixtures/tiny_passport/oauth_infos.yml +9 -0
- data/test/fixtures/tiny_passport/oauth_logins.yml +11 -0
- data/test/fixtures/tiny_passport/oauth_tokens.yml +21 -0
- data/test/fixtures/tiny_passport/users.yml +13 -0
- data/test/forms/tiny_passport/oauth/callback_form_test.rb +23 -0
- data/test/forms/tiny_passport/registration_form_test.rb +112 -0
- data/test/forms/tiny_passport/session_form_test.rb +139 -0
- data/test/forms/tiny_passport/update_password_form_test.rb +20 -0
- data/test/integration/navigation_test.rb +1 -0
- data/test/mailers/tiny_passport/registration_mailer_test.rb +10 -0
- data/test/mailers/tiny_passport/reset_password_mailer_test.rb +10 -0
- data/test/models/concerns/tiny_passport/configable_test.rb +46 -0
- data/test/models/tiny_passport/account_test.rb +8 -0
- data/test/models/tiny_passport/avatar_test.rb +10 -0
- data/test/models/tiny_passport/login_email_test.rb +10 -0
- data/test/models/tiny_passport/login_record_test.rb +10 -0
- data/test/models/tiny_passport/oauth_bind_test.rb +10 -0
- data/test/models/tiny_passport/oauth_info_test.rb +10 -0
- data/test/models/tiny_passport/oauth_login_test.rb +10 -0
- data/test/models/tiny_passport/oauth_token_test.rb +10 -0
- data/test/support/helpers.rb +66 -0
- data/test/test_helper.rb +24 -0
- data/test/tiny_passport_test.rb +1 -0
- metadata +257 -69
@@ -0,0 +1,172 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
# 注册表单
|
4
|
+
class RegistrationForm
|
5
|
+
include ::TinyPassport::Formable
|
6
|
+
include ::TinyPassport::AccountValidateAble
|
7
|
+
include ::TinyPassport::AggrementTermAble
|
8
|
+
|
9
|
+
delegate :login_name, :login_name=, :created_ip, :created_ip=, :to => :account
|
10
|
+
|
11
|
+
attr_accessor :password, :password_confirmation, :login_email_value
|
12
|
+
|
13
|
+
# 取出用户名与邮箱的前后的空格
|
14
|
+
self.support_strip_values!(:login_name, :login_email_value)
|
15
|
+
|
16
|
+
# 需要验证码
|
17
|
+
include ::TinyCaptcha::ModelHelpers
|
18
|
+
self.apply_tiny_captcha
|
19
|
+
|
20
|
+
# 邮箱校验
|
21
|
+
self.email_validates_of :login_email_value, :if => :login_email_required?
|
22
|
+
|
23
|
+
# account 用户名校验
|
24
|
+
self.account_login_name_validate
|
25
|
+
# account密码校验
|
26
|
+
self.account_password_validate
|
27
|
+
|
28
|
+
validate :verify_uniques
|
29
|
+
|
30
|
+
validates_presence_of :created_ip # IP不能为空
|
31
|
+
|
32
|
+
# 是否需要登录邮箱
|
33
|
+
def login_email_required?
|
34
|
+
true # self.login_email_value.present?
|
35
|
+
end
|
36
|
+
|
37
|
+
def account
|
38
|
+
@account ||= ::TinyPassport::Account.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def login_record
|
42
|
+
if self.account
|
43
|
+
return @login_record if defined?(@login_record)
|
44
|
+
|
45
|
+
::ActiveRecord::Base.transaction do
|
46
|
+
@login_record ||= ::TinyPassport::LoginRecord.new
|
47
|
+
@login_record.account = self.account
|
48
|
+
@login_record.save!
|
49
|
+
@login_record
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def login_email
|
55
|
+
@login_email ||= (self.account.login_email || ::TinyPassport::LoginEmail.new(:account => self.account))
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# 注册提交
|
60
|
+
# Params
|
61
|
+
# params:
|
62
|
+
# :agreement_terms 1 or 0 , 是否同意协议?默认为1,1:同意,0:不同意
|
63
|
+
# :login_name 登录名称
|
64
|
+
# :login_email_value 登录邮箱的值
|
65
|
+
# :password 登录密码
|
66
|
+
# :password_confirmation 重复密码
|
67
|
+
# :created_ip 当前的IP
|
68
|
+
# :captcha_key 验证码的KEY
|
69
|
+
# :captcha 验证码的值
|
70
|
+
#
|
71
|
+
# Usage:
|
72
|
+
# form = ::TinyPassport::RegistrationForm.new
|
73
|
+
# form.submit({...=>...})
|
74
|
+
#
|
75
|
+
# Return:
|
76
|
+
#
|
77
|
+
def submit params={}
|
78
|
+
self.submit_valid?(params) do
|
79
|
+
if save_objects
|
80
|
+
if self.login_email_required?
|
81
|
+
# 为login_email发送验证码
|
82
|
+
self.email_send_service.send_confirmation_token_for_active(
|
83
|
+
:login_email_value => self.login_email.value,
|
84
|
+
:active_way => 'login_email'
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
@result = {
|
89
|
+
:login_email => self.login_email,
|
90
|
+
:account => self.account
|
91
|
+
}
|
92
|
+
|
93
|
+
true
|
94
|
+
else
|
95
|
+
false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def submit_valid?(params={}, &block)
|
101
|
+
self.agreement_terms = params[:agreement_terms]
|
102
|
+
self.login_name = params[:login_name]
|
103
|
+
self.login_email_value = params[:login_email_value]
|
104
|
+
self.password = params[:password]
|
105
|
+
self.password_confirmation = params[:password_confirmation]
|
106
|
+
self.created_ip = params[:created_ip]
|
107
|
+
|
108
|
+
# 验证码
|
109
|
+
self.captcha_key = params[:captcha_key]
|
110
|
+
self.captcha = params[:captcha]
|
111
|
+
|
112
|
+
# 如果校验通过,则生成密码,生成login_email记录
|
113
|
+
if self.valid_with_captcha? && self.success?
|
114
|
+
self.account.encrypted_password = self.account.generate_password_digest(self.password)
|
115
|
+
|
116
|
+
# 如果需要登录邮箱的话, 则赋值
|
117
|
+
if self.login_email_required?
|
118
|
+
self.login_email.value = self.login_email_value
|
119
|
+
self.login_email.status_key = 'default' # 登录邮箱为初始
|
120
|
+
end
|
121
|
+
|
122
|
+
if block_given?
|
123
|
+
block.call and return true
|
124
|
+
else
|
125
|
+
return true
|
126
|
+
end
|
127
|
+
else
|
128
|
+
false
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# 校验是否被占用
|
133
|
+
def verify_uniques
|
134
|
+
if self.login_name.present?
|
135
|
+
if ::TinyPassport::Account.exists?(:login_name => self.login_name)
|
136
|
+
self.errors.add :login_name, :taken
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
if self.login_email_value.present?
|
141
|
+
if ::TinyPassport::LoginEmail.exists?(:value => self.login_email_value)
|
142
|
+
self.errors.add :login_email_value, :taken
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def email_send_service
|
148
|
+
@email_send_service ||= ::TinyPassport::EmailSendService.new
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
# 保存对象
|
154
|
+
def save_objects
|
155
|
+
::ActiveRecord::Base.transaction do
|
156
|
+
self.account.register_way_key = 'basic'
|
157
|
+
|
158
|
+
if self.login_email_required?
|
159
|
+
self.login_email.account = self.account
|
160
|
+
self.login_email.save!
|
161
|
+
end
|
162
|
+
|
163
|
+
self.account.login_email = self.login_email
|
164
|
+
self.account.save!
|
165
|
+
end
|
166
|
+
rescue
|
167
|
+
self.errors.add :base, :service_error
|
168
|
+
false
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class RememberTokenAuthForm
|
4
|
+
include ::TinyPassport::Formable
|
5
|
+
|
6
|
+
attr_reader :login_record
|
7
|
+
attr_accessor :remember_token
|
8
|
+
|
9
|
+
validates_presence_of :remember_token
|
10
|
+
|
11
|
+
def submit(params={})
|
12
|
+
@remember_token = params[:remember_token]
|
13
|
+
|
14
|
+
if self.valid? && self.success?
|
15
|
+
@login_record = ::TinyPassport::LoginRecord.authenticate_from_remember_token(remember_token)
|
16
|
+
|
17
|
+
if self.login_record && self.login_record.available? && self.login_record.account
|
18
|
+
self.login_record.last_remembered_ip = params[:last_remembered_ip].to_s
|
19
|
+
self.login_record.remembered_count += 1
|
20
|
+
self.login_record.save!
|
21
|
+
|
22
|
+
true
|
23
|
+
else
|
24
|
+
self.errors.add :remember_token, :not_found
|
25
|
+
false
|
26
|
+
end
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
# TODO: 重置密码表单
|
4
|
+
class ResetPasswordForm
|
5
|
+
include ::TinyPassport::Formable
|
6
|
+
include ::TinyPassport::AccountValidateAble
|
7
|
+
|
8
|
+
attr_accessor :password, :password_confirmation,
|
9
|
+
:reset_way, :reset_password_token
|
10
|
+
|
11
|
+
attr_reader :account, :login_email
|
12
|
+
|
13
|
+
# account密码校验
|
14
|
+
self.account_password_validate
|
15
|
+
|
16
|
+
validates_inclusion_of :reset_way, :in => ['login_email']
|
17
|
+
|
18
|
+
def login_email
|
19
|
+
@login_email ||= ::TinyPassport::LoginEmail.authenticate_from_reset_password_token(self.reset_password_token)
|
20
|
+
end
|
21
|
+
|
22
|
+
def submit params={}
|
23
|
+
self.submit_valid? params do
|
24
|
+
::ActiveRecord::Base.transaction do
|
25
|
+
self.login_email.encrypted_reset_password_token = ''
|
26
|
+
self.login_email.reset_password_token = ''
|
27
|
+
self.login_email.save!
|
28
|
+
|
29
|
+
self.account.encrypted_password = self.account.generate_password_digest(self.password, true)
|
30
|
+
self.account.save!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset_password_token_valid?
|
36
|
+
case self.reset_way
|
37
|
+
when 'login_email'
|
38
|
+
if self.login_email
|
39
|
+
if self.login_email.reset_password_token_expires?
|
40
|
+
self.errors.add :reset_password_token, :expired
|
41
|
+
else
|
42
|
+
case self.login_email.status_key
|
43
|
+
when 'active'
|
44
|
+
@account = self.login_email.account
|
45
|
+
|
46
|
+
if self.account
|
47
|
+
|
48
|
+
if block_given?
|
49
|
+
yield and return true
|
50
|
+
end
|
51
|
+
else
|
52
|
+
self.errors.add :reset_password_token, :not_matached # 没有找到
|
53
|
+
end
|
54
|
+
else
|
55
|
+
self.errors.add :reset_password_token, :unusual # 账户异常
|
56
|
+
end
|
57
|
+
end
|
58
|
+
else
|
59
|
+
self.errors.add :reset_password_token, :not_found # 没有匹配的
|
60
|
+
end
|
61
|
+
else
|
62
|
+
self.errors.add :base, :invalid
|
63
|
+
end
|
64
|
+
|
65
|
+
self.success?
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# params:
|
70
|
+
# - password
|
71
|
+
# - password_confirmation
|
72
|
+
# - reset_way
|
73
|
+
# - reset_password_token
|
74
|
+
#
|
75
|
+
def submit_valid? params={}, &block
|
76
|
+
@password ||= params[:password]
|
77
|
+
@password_confirmation ||= params[:password_confirmation]
|
78
|
+
@reset_password_token ||= params[:reset_password_token]
|
79
|
+
@reset_way ||= params[:reset_way]
|
80
|
+
|
81
|
+
# 基本验证
|
82
|
+
if self.valid? && self.success?
|
83
|
+
self.reset_password_token_valid? do
|
84
|
+
if block_given?
|
85
|
+
block.call
|
86
|
+
end
|
87
|
+
end
|
88
|
+
else
|
89
|
+
false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
# 请求重置密码表单
|
4
|
+
class ResetPasswordTokenForm
|
5
|
+
include ::TinyPassport::Formable
|
6
|
+
|
7
|
+
attr_accessor :login_email_value, :reset_way
|
8
|
+
|
9
|
+
self.support_strip_values!(:login_email_value)
|
10
|
+
|
11
|
+
validates_inclusion_of :reset_way, :in => ['login_email']
|
12
|
+
self.email_validates_of :login_email_value, :if => :login_email_required?
|
13
|
+
|
14
|
+
# 登录邮箱
|
15
|
+
def login_email
|
16
|
+
@login_email ||= ::TinyPassport::LoginEmail.find_by_value(self.login_email_value)
|
17
|
+
end
|
18
|
+
|
19
|
+
# 是否需要登录邮箱
|
20
|
+
def login_email_required?
|
21
|
+
self.reset_way == 'login_email'
|
22
|
+
end
|
23
|
+
|
24
|
+
# 通过登录邮箱,请求重置密码
|
25
|
+
def submit params={}
|
26
|
+
self.reset_way = 'login_email' # 找回方法是登录邮箱
|
27
|
+
|
28
|
+
self.login_email_value = params[:login_email_value]
|
29
|
+
|
30
|
+
if self.valid?
|
31
|
+
if self.login_email && self.login_email.account
|
32
|
+
unless self.login_email.status_key == 'active'
|
33
|
+
self.errors.add :login_email_value, :not_active # 没有激活
|
34
|
+
end
|
35
|
+
else
|
36
|
+
self.errors.add :login_email_value, :not_found # 没有找到
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if self.success?
|
41
|
+
self.login_email.generate_encrypted_reset_password_token
|
42
|
+
self.login_email.reset_password_token_send_at = ::Time.now
|
43
|
+
|
44
|
+
if self.login_email.save!
|
45
|
+
# 发送邮件
|
46
|
+
::TinyPassport::ResetPasswordMailer.send_token(self.login_email).deliver
|
47
|
+
end
|
48
|
+
|
49
|
+
true
|
50
|
+
else
|
51
|
+
false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class SessionForm
|
4
|
+
include ::TinyPassport::Formable
|
5
|
+
|
6
|
+
attr_accessor :input_value, :password, :remembered, :ip
|
7
|
+
|
8
|
+
validates_presence_of :input_value
|
9
|
+
validates_presence_of :password
|
10
|
+
|
11
|
+
self.support_strip_values!(:input_value)
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@remembered = true
|
15
|
+
end
|
16
|
+
|
17
|
+
def login_record
|
18
|
+
@login_record ||= ::TinyPassport::LoginRecord.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def remembered?
|
22
|
+
[true, 'true', '1'].include?(self.remembered)
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# 使用参数登录
|
27
|
+
# :input_value 输入的值, 如果是邮箱 则当做邮箱登录, 如果是登录名称,则用登录名称登录
|
28
|
+
# :password 密码
|
29
|
+
# :ip
|
30
|
+
# :remembered
|
31
|
+
#
|
32
|
+
def submit params={}
|
33
|
+
self.input_value = params[:input_value]
|
34
|
+
self.password = params[:password]
|
35
|
+
self.ip = params[:ip].to_s
|
36
|
+
self.remembered = params[:remembered]
|
37
|
+
|
38
|
+
#######
|
39
|
+
self.login_record.ip = self.ip
|
40
|
+
self.login_record.last_remembered_ip = self.ip
|
41
|
+
self.login_record.remembered = self.remembered?
|
42
|
+
|
43
|
+
if self.valid?
|
44
|
+
if self.success?
|
45
|
+
case self.input_value
|
46
|
+
when ::TinyPassport.config.email_regexp
|
47
|
+
login_email = login_email_scope.where(:value => self.input_value).first
|
48
|
+
|
49
|
+
if login_email.nil?
|
50
|
+
self.errors.add :input_value, :login_email_not_exists
|
51
|
+
else
|
52
|
+
case login_email.status_key
|
53
|
+
when 'active'
|
54
|
+
account = login_email.account
|
55
|
+
|
56
|
+
if account.nil?
|
57
|
+
self.errors.add :input_value, :login_email_wrong
|
58
|
+
end
|
59
|
+
else
|
60
|
+
self.errors.add :input_value, :login_email_not_active
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
self.login_record.way_key = 'login_email'
|
65
|
+
else
|
66
|
+
account = account_scope.where(:login_name => self.input_value).first
|
67
|
+
|
68
|
+
if account.nil?
|
69
|
+
self.errors.add :input_value, :login_name_not_exists
|
70
|
+
end
|
71
|
+
|
72
|
+
self.login_record.way_key = 'login_name'
|
73
|
+
end
|
74
|
+
|
75
|
+
if self.success?
|
76
|
+
if account.valid_password?(self.password)
|
77
|
+
# TODO: 登录成功!
|
78
|
+
begin
|
79
|
+
::ActiveRecord::Base.transaction do
|
80
|
+
|
81
|
+
self.login_record.account = account
|
82
|
+
if self.login_record.save!
|
83
|
+
self.login_record.account.save!
|
84
|
+
end
|
85
|
+
|
86
|
+
@result = {
|
87
|
+
:login_record => self.login_record,
|
88
|
+
:account => self.login_record.account
|
89
|
+
}
|
90
|
+
|
91
|
+
return true
|
92
|
+
end
|
93
|
+
rescue
|
94
|
+
false
|
95
|
+
end
|
96
|
+
else
|
97
|
+
self.errors.add :password, :wrong
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
def login_email_scope
|
107
|
+
::TinyPassport::LoginEmail
|
108
|
+
end
|
109
|
+
|
110
|
+
def account_scope
|
111
|
+
::TinyPassport::Account
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class UpdatePasswordForm
|
4
|
+
include ::TinyPassport::Formable
|
5
|
+
|
6
|
+
attr_accessor :password, :password_confirmation, :current_password, :account
|
7
|
+
|
8
|
+
validates_presence_of :password
|
9
|
+
validates_presence_of :current_password
|
10
|
+
validates_confirmation_of :password, :if => :password_confirmation_required?
|
11
|
+
|
12
|
+
# 如果两者都为不为空,则判断, 是否一致
|
13
|
+
def password_confirmation_required?
|
14
|
+
self.password.present? || self.password_confirmation.present?
|
15
|
+
end
|
16
|
+
|
17
|
+
def submit params={}
|
18
|
+
@password = params[:password]
|
19
|
+
@password_confirmation = params[:password_confirmation]
|
20
|
+
@current_password = params[:current_password]
|
21
|
+
@account = params[:account]
|
22
|
+
|
23
|
+
if self.valid? && self.success?
|
24
|
+
if self.account
|
25
|
+
# 密码需要改变才行
|
26
|
+
if self.account.valid_password?(self.password)
|
27
|
+
self.errors.add :password, :not_changed # 没有改变
|
28
|
+
end
|
29
|
+
|
30
|
+
# 当前密码需要匹配
|
31
|
+
unless self.account.valid_password?(self.current_password)
|
32
|
+
self.errors.add :current_password, :not_matached # 不匹配
|
33
|
+
end
|
34
|
+
else
|
35
|
+
self.errors.add :account, :null # 没有登录
|
36
|
+
end
|
37
|
+
|
38
|
+
if self.success?
|
39
|
+
self.account.encrypted_password = self.account.generate_password_digest(self.password)
|
40
|
+
self.account.save!
|
41
|
+
else
|
42
|
+
false
|
43
|
+
end
|
44
|
+
else
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
# 欢迎邮件的发送
|
4
|
+
class WelcomeEmailForm
|
5
|
+
include ::TinyPassport::Formable
|
6
|
+
|
7
|
+
attr_accessor :login_email_value # 注册邮箱
|
8
|
+
|
9
|
+
# 校验
|
10
|
+
self.email_validates_of :login_email_value, :if => :login_email_required?
|
11
|
+
|
12
|
+
validate :verify_login_email_present
|
13
|
+
|
14
|
+
def login_email_required?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
# 登录邮箱
|
19
|
+
def login_email
|
20
|
+
@login_email ||= ::TinyPassport::LoginEmail.where(:value => self.login_email_value).first
|
21
|
+
end
|
22
|
+
|
23
|
+
def submit params={}
|
24
|
+
self.login_email_value = params[:login_email_value]
|
25
|
+
|
26
|
+
if self.valid? && self.success?
|
27
|
+
self.login_email.generate_encrypted_confirmation_token
|
28
|
+
self.login_email.confirmation_send_at = ::Time.now
|
29
|
+
self.save!
|
30
|
+
|
31
|
+
!!(::TinyPassport::RegistrationMailer.send_confirmation_token(self.login_email).deliver)
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# 校验 邮箱是否存在
|
38
|
+
def verify_login_email_present
|
39
|
+
if self.login_email_required?
|
40
|
+
unless self.login_email
|
41
|
+
self.errors.add :login_email_value, :not_found
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class RegistrationMailer < ActionMailer::Base
|
4
|
+
include ::TinyPassport::Mailerable
|
5
|
+
|
6
|
+
def welcome account
|
7
|
+
@account = account
|
8
|
+
|
9
|
+
mail(:to => @account.login_email_value_to, :subject => "Welcome To TinyPassport") do |format|
|
10
|
+
format.html
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def send_confirmation_token(login_email)
|
15
|
+
@login_email = login_email
|
16
|
+
@account = login_email.account
|
17
|
+
|
18
|
+
mail(:to => @account.login_email_value_to, :subject => "Welcome Confirm To TinyPassport") do |format|
|
19
|
+
format.html
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class ResetPasswordMailer < ActionMailer::Base
|
4
|
+
include ::TinyPassport::Mailerable
|
5
|
+
|
6
|
+
def send_token login_email
|
7
|
+
@login_email = login_email
|
8
|
+
@account = @login_email.account
|
9
|
+
|
10
|
+
# 重设您的密码
|
11
|
+
mail(:to => @account.login_email_value_to, :subject => "Reset Your Password") do |format|
|
12
|
+
format.html
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Concerns
|
3
|
+
module TinyPassport
|
4
|
+
module AccountAuthenticatable
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
def valid_password?(password)
|
12
|
+
return false if self.encrypted_password.blank?
|
13
|
+
|
14
|
+
self.encrypted_password == generate_password_digest(password)
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_password_digest(password, salt_update=false)
|
18
|
+
self.password_salt = SecureRandom.base64 if salt_update || self.password_salt.blank?
|
19
|
+
Digest::SHA1.hexdigest("#{password}#{self.password_salt}")
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module TinyPassport
|
3
|
+
class Account < ActiveRecord::Base
|
4
|
+
include ::Concerns::TinyPassport::AccountAuthenticatable
|
5
|
+
|
6
|
+
include ::TinySupport::Configable
|
7
|
+
|
8
|
+
self.acts_as_tiny_cached :version => 1
|
9
|
+
|
10
|
+
self.tiny_support_display
|
11
|
+
|
12
|
+
self.tiny_support_config :register_way, [
|
13
|
+
{:key => 'unkown', :value => 0}, # 初始状态
|
14
|
+
{:key => 'basic', :value => 1} # 基本注册
|
15
|
+
]
|
16
|
+
|
17
|
+
has_many :oauth_logins, :class_name => "TinyPassport::OauthLogin"
|
18
|
+
has_many :oauth_binds, :class_name => "TinyPassport::OauthBind"
|
19
|
+
has_many :login_records, :class_name => "TinyPassport::LoginRecord"
|
20
|
+
|
21
|
+
# 一个用户会有一个登录邮箱
|
22
|
+
has_one :login_email, :class_name => "TinyPassport::LoginEmail"
|
23
|
+
has_one :last_login_record, :class_name => "TinyPassport::LoginRecord"
|
24
|
+
|
25
|
+
# 是否有登录等有邮箱
|
26
|
+
def login_email?
|
27
|
+
!!login_email
|
28
|
+
end
|
29
|
+
|
30
|
+
# 登录邮箱可以登录
|
31
|
+
def login_email_active?
|
32
|
+
login_email? && login_email.status.key?('active')
|
33
|
+
end
|
34
|
+
|
35
|
+
# 昵称带着login email, 发送邮件的地址
|
36
|
+
def login_email_value_to
|
37
|
+
"#{self.login_name} <#{self.login_email.value}>"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|