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.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/app/ables/tiny_passport/account_validate_able.rb +24 -0
  3. data/app/ables/tiny_passport/aggrement_term_able.rb +28 -0
  4. data/app/ables/tiny_passport/formable.rb +17 -0
  5. data/app/ables/tiny_passport/query_able.rb +25 -0
  6. data/app/controllers/tiny_passport/application_controller.rb +1 -0
  7. data/app/displays/tiny_passport/account_display.rb +25 -0
  8. data/app/displays/tiny_passport/oauth_login_display.rb +21 -0
  9. data/app/displays/tiny_passport/oauth_token_display.rb +25 -0
  10. data/app/errors/tiny_passport/alert_authorized_error.rb +6 -0
  11. data/app/errors/tiny_passport/unauthorized_error.rb +6 -0
  12. data/app/forms/tiny_passport/account_active_form.rb +83 -0
  13. data/app/forms/tiny_passport/account_form.rb +6 -0
  14. data/app/forms/tiny_passport/confirmation_token_form.rb +58 -0
  15. data/app/forms/tiny_passport/oauth/bind_connect_form.rb +65 -0
  16. data/app/forms/tiny_passport/oauth/bind_disconnect_form.rb +42 -0
  17. data/app/forms/tiny_passport/oauth/callback_form.rb +165 -0
  18. data/app/forms/tiny_passport/oauth/login_connect_form.rb +63 -0
  19. data/app/forms/tiny_passport/registration_form.rb +172 -0
  20. data/app/forms/tiny_passport/remember_token_auth_form.rb +32 -0
  21. data/app/forms/tiny_passport/reset_password_form.rb +95 -0
  22. data/app/forms/tiny_passport/reset_password_token_form.rb +55 -0
  23. data/app/forms/tiny_passport/session_form.rb +116 -0
  24. data/app/forms/tiny_passport/update_password_form.rb +50 -0
  25. data/app/forms/tiny_passport/welcome_email_form.rb +47 -0
  26. data/app/helpers/tiny_passport/application_helper.rb +1 -0
  27. data/app/mailers/tiny_passport/registration_mailer.rb +23 -0
  28. data/app/mailers/tiny_passport/reset_password_mailer.rb +16 -0
  29. data/app/models/concerns/tiny_passport/account_authenticatable.rb +24 -0
  30. data/app/models/tiny_passport/account.rb +41 -0
  31. data/app/models/tiny_passport/avatar.rb +6 -0
  32. data/app/models/tiny_passport/login_email.rb +89 -0
  33. data/app/models/tiny_passport/login_record.rb +69 -0
  34. data/app/models/tiny_passport/oauth_bind.rb +9 -0
  35. data/app/models/tiny_passport/oauth_info.rb +8 -0
  36. data/app/models/tiny_passport/oauth_login.rb +28 -0
  37. data/app/models/tiny_passport/oauth_token.rb +57 -0
  38. data/app/queries/tiny_passport/account_query.rb +45 -0
  39. data/app/services/tiny_passport/account_service.rb +43 -0
  40. data/app/services/tiny_passport/email_send_service.rb +32 -0
  41. data/app/services/tiny_passport/oauth_service.rb +11 -0
  42. data/app/views/layouts/tiny_passport/mailer.html.erb +7 -0
  43. data/app/views/tiny_passport/registration_mailer/send_confirmation_token.html.erb +5 -0
  44. data/app/views/tiny_passport/registration_mailer/welcome.html.erb +5 -0
  45. data/app/views/tiny_passport/reset_password_mailer/send_token.html.erb +5 -0
  46. data/config/locales/en/forms.en.yml +81 -0
  47. data/config/locales/zh-CN/forms.zh-CN.yml +123 -0
  48. data/config/routes.rb +1 -0
  49. data/db/migrate/20131105103853_create_tiny_passport_accounts.rb +23 -0
  50. data/db/migrate/20131105104415_create_tiny_passport_login_records.rb +20 -0
  51. data/db/migrate/20131105104559_create_tiny_passport_oauth_tokens.rb +27 -0
  52. data/db/migrate/20131105104632_create_tiny_passport_oauth_logins.rb +15 -0
  53. data/db/migrate/20131105104702_create_tiny_passport_oauth_binds.rb +16 -0
  54. data/db/migrate/20131105104738_create_tiny_passport_oauth_infos.rb +13 -0
  55. data/db/migrate/20131105104847_create_tiny_passport_avatars.rb +20 -0
  56. data/db/migrate/20131107031935_create_tiny_passport_login_emails.rb +25 -0
  57. data/lib/omniauth/strategies/qq_connect.rb +114 -0
  58. data/lib/tiny_passport/config.rb +72 -0
  59. data/lib/tiny_passport/engine.rb +16 -0
  60. data/lib/tiny_passport/http_authable.rb +50 -0
  61. data/lib/tiny_passport/http_authcenter.rb +138 -0
  62. data/lib/tiny_passport/mailerable.rb +20 -0
  63. data/lib/tiny_passport/omniauth/strategable.rb +21 -0
  64. data/lib/tiny_passport/version.rb +2 -1
  65. data/lib/tiny_passport.rb +13 -0
  66. data/test/dummy/app/controllers/application_controller.rb +1 -0
  67. data/test/dummy/app/helpers/application_helper.rb +1 -0
  68. data/test/dummy/config/application.rb +1 -0
  69. data/test/dummy/config/boot.rb +1 -0
  70. data/test/dummy/config/environment.rb +1 -0
  71. data/test/dummy/config/environments/development.rb +1 -0
  72. data/test/dummy/config/environments/production.rb +1 -0
  73. data/test/dummy/config/environments/test.rb +1 -0
  74. data/test/dummy/config/initializers/backtrace_silencers.rb +1 -0
  75. data/test/dummy/config/initializers/filter_parameter_logging.rb +1 -0
  76. data/test/dummy/config/initializers/inflections.rb +1 -0
  77. data/test/dummy/config/initializers/mime_types.rb +1 -0
  78. data/test/dummy/config/initializers/secret_token.rb +1 -0
  79. data/test/dummy/config/initializers/session_store.rb +1 -0
  80. data/test/dummy/config/initializers/wrap_parameters.rb +1 -0
  81. data/test/dummy/config/routes.rb +1 -0
  82. data/test/dummy/db/schema.rb +138 -0
  83. data/test/dummy/db/test.sqlite3 +0 -0
  84. data/test/dummy/log/test.log +15986 -0
  85. data/test/dummy/tmp/cache/271/2A1/tiny_cache%2Fmodels%2FTinyPassport%3A%3AAccount%2F1%2F1 +0 -0
  86. 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
  87. data/test/fixtures/tiny_passport/avatars.yml +23 -0
  88. data/test/fixtures/tiny_passport/login_emails.yml +23 -0
  89. data/test/fixtures/tiny_passport/login_records.yml +17 -0
  90. data/test/fixtures/tiny_passport/oauth_binds.yml +13 -0
  91. data/test/fixtures/tiny_passport/oauth_infos.yml +9 -0
  92. data/test/fixtures/tiny_passport/oauth_logins.yml +11 -0
  93. data/test/fixtures/tiny_passport/oauth_tokens.yml +21 -0
  94. data/test/fixtures/tiny_passport/users.yml +13 -0
  95. data/test/forms/tiny_passport/oauth/callback_form_test.rb +23 -0
  96. data/test/forms/tiny_passport/registration_form_test.rb +112 -0
  97. data/test/forms/tiny_passport/session_form_test.rb +139 -0
  98. data/test/forms/tiny_passport/update_password_form_test.rb +20 -0
  99. data/test/integration/navigation_test.rb +1 -0
  100. data/test/mailers/tiny_passport/registration_mailer_test.rb +10 -0
  101. data/test/mailers/tiny_passport/reset_password_mailer_test.rb +10 -0
  102. data/test/models/concerns/tiny_passport/configable_test.rb +46 -0
  103. data/test/models/tiny_passport/account_test.rb +8 -0
  104. data/test/models/tiny_passport/avatar_test.rb +10 -0
  105. data/test/models/tiny_passport/login_email_test.rb +10 -0
  106. data/test/models/tiny_passport/login_record_test.rb +10 -0
  107. data/test/models/tiny_passport/oauth_bind_test.rb +10 -0
  108. data/test/models/tiny_passport/oauth_info_test.rb +10 -0
  109. data/test/models/tiny_passport/oauth_login_test.rb +10 -0
  110. data/test/models/tiny_passport/oauth_token_test.rb +10 -0
  111. data/test/support/helpers.rb +66 -0
  112. data/test/test_helper.rb +24 -0
  113. data/test/tiny_passport_test.rb +1 -0
  114. 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
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module TinyPassport
2
3
  module ApplicationHelper
3
4
  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
@@ -0,0 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module TinyPassport
3
+ class Avatar < ActiveRecord::Base
4
+ belongs_to :owner, :polymorphic => true
5
+ end
6
+ end