tiny_passport 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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