okkez-multi_auth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/README +36 -0
  2. data/app/controllers/application_controller.rb +11 -0
  3. data/app/controllers/auth/email_controller.rb +34 -0
  4. data/app/controllers/auth/open_id_controller.rb +43 -0
  5. data/app/controllers/auth_controller.rb +24 -0
  6. data/app/controllers/credentials/email_controller.rb +156 -0
  7. data/app/controllers/credentials/open_id_controller.rb +85 -0
  8. data/app/controllers/credentials_controller.rb +14 -0
  9. data/app/controllers/signup/email_controller.rb +132 -0
  10. data/app/controllers/signup/open_id_controller.rb +62 -0
  11. data/app/controllers/signup_controller.rb +8 -0
  12. data/app/helpers/application_helper.rb +5 -0
  13. data/app/models/activation_mailer.rb +114 -0
  14. data/app/models/email_credential.rb +89 -0
  15. data/app/models/email_credential_edit_form.rb +52 -0
  16. data/app/models/email_login_form.rb +24 -0
  17. data/app/models/email_password_edit_form.rb +36 -0
  18. data/app/models/open_id_credential.rb +33 -0
  19. data/app/models/open_id_login_form.rb +17 -0
  20. data/app/models/session.rb +19 -0
  21. data/app/models/user.rb +37 -0
  22. data/app/views/activation_mailer/complete_for_credential.erb +4 -0
  23. data/app/views/activation_mailer/complete_for_notice.erb +4 -0
  24. data/app/views/activation_mailer/complete_for_signup.erb +4 -0
  25. data/app/views/activation_mailer/request_for_credential.erb +11 -0
  26. data/app/views/activation_mailer/request_for_notice.erb +11 -0
  27. data/app/views/activation_mailer/request_for_signup.erb +11 -0
  28. data/app/views/auth/email/index.html.erb +90 -0
  29. data/app/views/auth/logged_in.html.erb +21 -0
  30. data/app/views/auth/logged_out.html.erb +21 -0
  31. data/app/views/auth/open_id/index.html.erb +16 -0
  32. data/app/views/credentials/email/activated.html.erb +4 -0
  33. data/app/views/credentials/email/activation.html.erb +15 -0
  34. data/app/views/credentials/email/created.html.erb +15 -0
  35. data/app/views/credentials/email/delete.html.erb +20 -0
  36. data/app/views/credentials/email/edit_password.html.erb +31 -0
  37. data/app/views/credentials/email/new.html.erb +36 -0
  38. data/app/views/credentials/index.html.erb +88 -0
  39. data/app/views/credentials/open_id/delete.html.erb +20 -0
  40. data/app/views/credentials/open_id/new.html.erb +26 -0
  41. data/app/views/signup/email/_progress.html.erb +14 -0
  42. data/app/views/signup/email/activated.html.erb +9 -0
  43. data/app/views/signup/email/activation.html.erb +27 -0
  44. data/app/views/signup/email/created.html.erb +14 -0
  45. data/app/views/signup/email/index.html.erb +34 -0
  46. data/app/views/signup/email/validated.html.erb +21 -0
  47. data/app/views/signup/index.html.erb +51 -0
  48. data/app/views/signup/open_id/authenticated.html.erb +15 -0
  49. data/app/views/signup/open_id/created.html.erb +6 -0
  50. data/app/views/signup/open_id/index.html.erb +16 -0
  51. data/config/boot.rb +110 -0
  52. data/config/database.yml +22 -0
  53. data/config/database.yml.sqlite3 +22 -0
  54. data/config/environment.rb +62 -0
  55. data/config/routes.rb +51 -0
  56. data/config/smtp.yml.example +8 -0
  57. data/db/development.sqlite3 +0 -0
  58. data/db/schema.rb +88 -0
  59. data/db/test.sqlite3 +0 -0
  60. data/lib/action_mailer_util.rb +15 -0
  61. data/lib/multi_auth.rb +64 -0
  62. data/lib/multi_auth_helper.rb +98 -0
  63. data/lib/notice_formatter.rb +106 -0
  64. data/lib/open_id_authentication/result.rb +12 -0
  65. data/lib/token_util.rb +18 -0
  66. data/public/404.html +92 -0
  67. data/public/422.html +91 -0
  68. data/public/500.html +92 -0
  69. data/public/503.html +92 -0
  70. data/public/favicon.ico +0 -0
  71. data/public/images/battery/cell.png +0 -0
  72. data/public/images/battery/level-green.png +0 -0
  73. data/public/images/battery/level-orange.png +0 -0
  74. data/public/images/battery/level-red.png +0 -0
  75. data/public/images/battery/level-yellow.png +0 -0
  76. data/public/images/battery/style.html +82 -0
  77. data/public/images/favicons/livedoor.png +0 -0
  78. data/public/images/favicons/mixi.png +0 -0
  79. data/public/images/favicons/yahoo.png +0 -0
  80. data/public/images/h1-back.png +0 -0
  81. data/public/images/icons/fam/add.png +0 -0
  82. data/public/images/icons/fam/bin.png +0 -0
  83. data/public/images/icons/fam/bomb.png +0 -0
  84. data/public/images/icons/fam/cog.png +0 -0
  85. data/public/images/icons/fam/delete.png +0 -0
  86. data/public/images/icons/fam/email-with-desc.png +0 -0
  87. data/public/images/icons/fam/email.png +0 -0
  88. data/public/images/icons/fam/feed.png +0 -0
  89. data/public/images/icons/fam/help.png +0 -0
  90. data/public/images/icons/fam/key-with-desc.png +0 -0
  91. data/public/images/icons/fam/key.png +0 -0
  92. data/public/images/icons/fam/lightning.png +0 -0
  93. data/public/images/icons/fam/plugin.png +0 -0
  94. data/public/images/icons/fam/stop.png +0 -0
  95. data/public/images/icons/fam/table_save.png +0 -0
  96. data/public/images/icons/fam/tick.png +0 -0
  97. data/public/images/icons/fam/user.png +0 -0
  98. data/public/images/icons/fam/vcard.png +0 -0
  99. data/public/images/icons/openid-with-desc.png +0 -0
  100. data/public/images/icons/openid.png +0 -0
  101. data/public/images/logo-back.png +0 -0
  102. data/public/images/logo.png +0 -0
  103. data/public/images/side-column-back.png +0 -0
  104. data/public/javascripts/application.js +2 -0
  105. data/public/javascripts/controls.js +963 -0
  106. data/public/javascripts/dragdrop.js +973 -0
  107. data/public/javascripts/effects.js +1128 -0
  108. data/public/javascripts/prototype.js +4320 -0
  109. data/public/robots.txt +5 -0
  110. data/public/stylesheets/application.css +365 -0
  111. data/public/stylesheets/auth.css +22 -0
  112. data/public/stylesheets/home.css +114 -0
  113. data/rails/init.rb +24 -0
  114. data/test/functional/auth/email_controller_test.rb +102 -0
  115. data/test/functional/auth/open_id_controller_test.rb +76 -0
  116. data/test/functional/auth_controller_test.rb +74 -0
  117. data/test/functional/credentials/email_controller_test.rb +488 -0
  118. data/test/functional/credentials/open_id_controller_test.rb +308 -0
  119. data/test/functional/credentials_controller_test.rb +49 -0
  120. data/test/functional/signup/email_controller_test.rb +369 -0
  121. data/test/functional/signup/open_id_controller_test.rb +44 -0
  122. data/test/functional/signup_controller_test.rb +17 -0
  123. data/test/performance/browsing_test.rb +9 -0
  124. data/test/test_helper.rb +82 -0
  125. data/test/unit/action_mailer_util_test.rb +63 -0
  126. data/test/unit/activation_mailer_test.rb +181 -0
  127. data/test/unit/email_credential_edit_form_test.rb +173 -0
  128. data/test/unit/email_credential_test.rb +324 -0
  129. data/test/unit/email_login_form_test.rb +76 -0
  130. data/test/unit/email_password_edit_form_test.rb +117 -0
  131. data/test/unit/helpers/auth_helper_test.rb +4 -0
  132. data/test/unit/helpers/credentials/email_helper_test.rb +4 -0
  133. data/test/unit/helpers/credentials/open_id_helper_test.rb +4 -0
  134. data/test/unit/helpers/credentials_helper_test.rb +4 -0
  135. data/test/unit/helpers/email_auth_helper_test.rb +4 -0
  136. data/test/unit/helpers/email_signup_helper_test.rb +4 -0
  137. data/test/unit/helpers/open_id_auth_helper_test.rb +4 -0
  138. data/test/unit/helpers/open_id_signup_helper_test.rb +4 -0
  139. data/test/unit/helpers/password_auth_helper_test.rb +4 -0
  140. data/test/unit/helpers/password_signup_helper_test.rb +4 -0
  141. data/test/unit/helpers/signup_helper_test.rb +4 -0
  142. data/test/unit/notice_formatter_test.rb +153 -0
  143. data/test/unit/open_id_credential_test.rb +108 -0
  144. data/test/unit/open_id_login_form_test.rb +57 -0
  145. data/test/unit/session_test.rb +53 -0
  146. data/test/unit/token_util_test.rb +51 -0
  147. data/test/unit/user_test.rb +177 -0
  148. metadata +220 -0
data/README ADDED
@@ -0,0 +1,36 @@
1
+ MultiAuth
2
+ =========
3
+
4
+ This engine provides basic login functionality for your Rails applications.
5
+
6
+ Install
7
+ =======
8
+
9
+ $ sudo gem install okkez-multi_auth
10
+
11
+ Setup
12
+ =====
13
+
14
+ $ ruby script/generate open_id_authentication_tables create_open_id_authentication_tables
15
+
16
+ Create migrations for open_id_authentication.
17
+
18
+ $ rake multi_auth:copy:all
19
+
20
+ Copy migrations, stylesheets and images from multi_auth plugin.
21
+
22
+ $ rake db:migrate
23
+
24
+ You must have a model 'User'. User model has any columns which you want to add.
25
+
26
+ Customize
27
+ =========
28
+
29
+ If you want to custom views, you create RAILS_ROOT/app/view/{activation_mailer,auth,credentials,signup}/*.
30
+
31
+
32
+ TODO
33
+ ====
34
+
35
+ see TODO.ja
36
+
@@ -0,0 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class ApplicationController < ActionController::Base
4
+ helper :all # include all helpers, all the time
5
+ protect_from_forgery # See ActionController::RequestForgeryProtection for details
6
+ before_filter { |c| c.instance_eval { @topic_path = [] }; true }
7
+
8
+ GetText.locale = "ja"
9
+ init_gettext "multi_auth"
10
+
11
+ end
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # メール認証
4
+ class Auth::EmailController < ApplicationController
5
+ filter_parameter_logging :password
6
+ verify_method_post :only => [:login]
7
+
8
+ # GET /auth/email
9
+ def index
10
+ session[:user_id] = nil
11
+ @login_form = EmailLoginForm.new
12
+ end
13
+
14
+ # POST /auth/email/login
15
+ def login
16
+ session[:user_id] = nil
17
+ @login_form = EmailLoginForm.new(params[:login_form])
18
+
19
+ if @login_form.valid?
20
+ @email_credential = @login_form.authenticate
21
+ end
22
+
23
+ if @email_credential
24
+ @email_credential.login!
25
+ @login_user = @email_credential.user
26
+ session[:user_id] = @login_user.id
27
+ redirect_to(:controller => "/auth", :action => "logged_in")
28
+ else
29
+ @login_form.password = nil
30
+ set_error_now("メールアドレス、またはパスワードが違います。")
31
+ render(:action => "index")
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,43 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # OpenID認証
4
+ # FIXME: 全体的に実装を整理
5
+ class Auth::OpenIdController < ApplicationController
6
+ verify_method_post :only => [:login]
7
+
8
+ # GET /auth/open_id
9
+ def index
10
+ session[:user_id] = nil
11
+ end
12
+
13
+ # POST /auth/open_id/login
14
+ # GET /auth/open_id/login
15
+ def login
16
+ openid_url = params[:openid_url]
17
+
18
+ authenticate_with_open_id(openid_url) { |result, identity_url, sreg|
19
+ if result.successful?
20
+ @open_id_credential = OpenIdCredential.find_by_identity_url(identity_url)
21
+ if @open_id_credential
22
+ @open_id_credential.login!
23
+ session[:user_id] = @open_id_credential.user.id
24
+ flash[:notice] = "ログインしました。"
25
+ redirect_to(root_path)
26
+ else
27
+ flash[:notice] = "OpenID がまだ登録されていません。"
28
+ redirect_to(:controller => "signup/open_id", :action => "index")
29
+ end
30
+ else
31
+ failed_login(result.message)
32
+ end
33
+ }
34
+ end
35
+
36
+ private
37
+
38
+ def failed_login(message)
39
+ flash[:error] = message
40
+ redirect_to(root_path)
41
+ end
42
+
43
+ end
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # 認証
4
+ class AuthController < ApplicationController
5
+ verify_method_post :only => [:logout]
6
+
7
+ # GET /auth/logged_in
8
+ def logged_in
9
+ @return_path = params[:return_path]
10
+ @return_path = root_path if @return_path.blank?
11
+ end
12
+
13
+ # POST /auth/logout
14
+ def logout
15
+ reset_session
16
+ redirect_to(:action => "logged_out")
17
+ end
18
+
19
+ # GET /auth/logged_out
20
+ def logged_out
21
+ @return_path = params[:return_path]
22
+ @return_path = root_path if @return_path.blank?
23
+ end
24
+ end
@@ -0,0 +1,156 @@
1
+
2
+ # メール認証情報コントローラ
3
+ class Credentials::EmailController < ApplicationController
4
+ EditFormClass = EmailCredentialEditForm
5
+
6
+ verify_method_post :only => [:create, :update_password, :destroy, :activate]
7
+ before_filter :authentication
8
+ before_filter :authentication_required, :except => [:activation, :activate, :activated]
9
+ before_filter :required_param_email_credential_id, :only => [:created, :edit_password, :update_password, :delete, :destroy]
10
+ before_filter :specified_email_credential_belongs_to_login_user, :only => [:created, :edit_password, :update_password, :delete, :destroy]
11
+ before_filter :required_param_activation_token, :only => [:activation, :activate, :activated]
12
+ before_filter :only_inactive_email_credential, :only => [:activation, :activate]
13
+
14
+ # GET /credentials/email/new
15
+ def new
16
+ @edit_form = EditFormClass.new
17
+ end
18
+
19
+ # GET /credentials/email/create
20
+ def create
21
+ @edit_form = EditFormClass.new(params[:edit_form])
22
+
23
+ @email_credential = @login_user.email_credentials.build
24
+ @email_credential.attributes = @edit_form.to_email_credential_hash
25
+
26
+ if @edit_form.valid? && @email_credential.save
27
+ # TODO: テスト
28
+ @activation_url = url_for(
29
+ :only_path => false,
30
+ :controller => "credentials/email",
31
+ :action => "activation",
32
+ :activation_token => @email_credential.activation_token)
33
+
34
+ # TODO: テスト
35
+ # MEMO: 即時性を優先し、非同期化しない
36
+ ActivationMailer.deliver_request_for_credential(
37
+ :recipients => @email_credential.email,
38
+ :activation_url => @activation_url)
39
+
40
+ set_notice("メール認証情報を追加しました。")
41
+ redirect_to(:action => "created", :email_credential_id => @email_credential.id)
42
+ else
43
+ @edit_form.password = nil
44
+ @edit_form.password_confirmation = nil
45
+ set_error_now("入力内容を確認してください。")
46
+ render(:action => "new")
47
+ end
48
+ end
49
+
50
+ # GET /credential/email/:email_credential_id/created
51
+ def created
52
+ # nop
53
+ end
54
+
55
+ # GET /credential/email/:email_credential_id/edit_password
56
+ def edit_password
57
+ @edit_form = EmailPasswordEditForm.new
58
+ end
59
+
60
+ # POST /credential/email/:email_credential_id/update_password
61
+ def update_password
62
+ @edit_form = EmailPasswordEditForm.new(params[:edit_form])
63
+
64
+ @email_credential.attributes = @edit_form.to_email_credential_hash
65
+
66
+ if @edit_form.valid? && @email_credential.save
67
+ set_notice("パスワードを変更しました。")
68
+ redirect_to(:controller => "/credentials")
69
+ else
70
+ @edit_form.password = nil
71
+ @edit_form.password_confirmation = nil
72
+ set_error_now("入力内容を確認してください。")
73
+ render(:action => "edit_password")
74
+ end
75
+ end
76
+
77
+ # GET /credential/email/:email_credential_id/delete
78
+ def delete
79
+ # nop
80
+ end
81
+
82
+ # POST /credential/email/:email_credential_id/destroy
83
+ def destroy
84
+ @email_credential.destroy
85
+
86
+ set_notice("メール認証情報を削除しました。")
87
+ redirect_to(:controller => "/credentials")
88
+ end
89
+
90
+ # GET /credential/email/token/:activation_token/activation
91
+ def activation
92
+ # nop
93
+ end
94
+
95
+ # POST /credential/email/token/:activation_token/activate
96
+ def activate
97
+ @email_credential.activate!
98
+
99
+ # TODO: テスト
100
+ # MEMO: 即時性を優先し、非同期化しない
101
+ ActivationMailer.deliver_complete_for_credential(
102
+ :recipients => @email_credential.email)
103
+
104
+ redirect_to(:action => "activated")
105
+ end
106
+
107
+ # GET /credential/email/token/:activation_token/activated
108
+ def activated
109
+ # nop
110
+ end
111
+
112
+ private
113
+
114
+ # FIXME: login_userに属することを同時に確認
115
+ def required_param_email_credential_id(email_credential_id = params[:email_credential_id])
116
+ @email_credential = EmailCredential.find_by_id(email_credential_id)
117
+ if @email_credential
118
+ return true
119
+ else
120
+ set_error("メール認証情報IDが正しくありません。")
121
+ redirect_to(root_path)
122
+ return false
123
+ end
124
+ end
125
+
126
+ def specified_email_credential_belongs_to_login_user
127
+ if @email_credential.user_id == @login_user.id
128
+ return true
129
+ else
130
+ set_error("メール認証情報IDが正しくありません。")
131
+ redirect_to(root_path)
132
+ return false
133
+ end
134
+ end
135
+
136
+ def required_param_activation_token(activation_token = params[:activation_token])
137
+ @email_credential = EmailCredential.find_by_activation_token(activation_token)
138
+ if @email_credential
139
+ return true
140
+ else
141
+ set_error("アクティベーショントークンが正しくありません。")
142
+ redirect_to(root_path)
143
+ return false
144
+ end
145
+ end
146
+
147
+ def only_inactive_email_credential
148
+ if @email_credential.activated?
149
+ set_error("既にアクティベーションされています。")
150
+ redirect_to(root_path)
151
+ return false
152
+ else
153
+ return true
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,85 @@
1
+
2
+ # OpenID認証情報コントローラ
3
+ class Credentials::OpenIdController < ApplicationController
4
+ verify_method_post :only => [:destroy]
5
+ before_filter :authentication
6
+ before_filter :authentication_required
7
+ before_filter :required_param_open_id_credential_id, :only => [:delete, :destroy]
8
+ before_filter :specified_open_id_credential_belongs_to_login_user, :only => [:delete, :destroy]
9
+
10
+ # GET /credentials/open_id/new
11
+ def new
12
+ @login_form = OpenIdLoginForm.new
13
+ end
14
+
15
+ # POST /credentials/open_id/create
16
+ # GET /credentials/open_id/create
17
+ def create
18
+ @login_form = OpenIdLoginForm.new(params[:login_form])
19
+
20
+ if params[:open_id_complete].nil? && !@login_form.valid?
21
+ set_error_now("入力内容を確認してください。")
22
+ render(:action => "new")
23
+ return
24
+ end
25
+
26
+ authenticate_with_open_id(@login_form.openid_url) { |result, identity_url|
27
+ @login_form.openid_url = identity_url
28
+ @status = result.status
29
+
30
+ if result.successful?
31
+ @open_id_credential = @login_user.open_id_credentials.find_or_initialize_by_identity_url(identity_url)
32
+
33
+ if @open_id_credential.new_record?
34
+ @open_id_credential.save!
35
+
36
+ set_notice("OpenID認証情報を追加しました。")
37
+ redirect_to(:controller => "/credentials", :action => "index")
38
+ else
39
+ set_error_now("既に使用されているOpenIDです。")
40
+ render(:action => "new")
41
+ end
42
+ else
43
+ set_error_now(result.message)
44
+ render(:action => "new")
45
+ end
46
+ }
47
+ end
48
+
49
+ # GET /credential/open_id/:open_id_credential_id/delete
50
+ def delete
51
+ # nop
52
+ end
53
+
54
+ # POST /credential/open_id/:open_id_credential_id/destroy
55
+ def destroy
56
+ @open_id_credential.destroy
57
+
58
+ set_notice("OpenID認証情報を削除しました。")
59
+ redirect_to(:controller => "/credentials")
60
+ end
61
+
62
+ private
63
+
64
+ # FIXME: login_userに属することを同時に確認
65
+ def required_param_open_id_credential_id(open_id_credential_id = params[:open_id_credential_id])
66
+ @open_id_credential = OpenIdCredential.find_by_id(open_id_credential_id)
67
+ if @open_id_credential
68
+ return true
69
+ else
70
+ set_error("OpenID認証情報IDが正しくありません。")
71
+ redirect_to(root_path)
72
+ return false
73
+ end
74
+ end
75
+
76
+ def specified_open_id_credential_belongs_to_login_user
77
+ if @open_id_credential.user_id == @login_user.id
78
+ return true
79
+ else
80
+ set_error("OpenID認証情報IDが正しくありません。")
81
+ redirect_to(root_path)
82
+ return false
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,14 @@
1
+
2
+ # 認証情報コントローラ
3
+ class CredentialsController < ApplicationController
4
+ before_filter :authentication
5
+ before_filter :authentication_required
6
+
7
+ # GET /credentials
8
+ def index
9
+ @open_id_credentials = @login_user.open_id_credentials.all(
10
+ :order => "open_id_credentials.identity_url ASC")
11
+ @email_credentials = @login_user.email_credentials.all(
12
+ :order => "email_credentials.email ASC")
13
+ end
14
+ end
@@ -0,0 +1,132 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # メール認証情報サインアップ
4
+ class Signup::EmailController < ApplicationController
5
+ EditFormClass = EmailCredentialEditForm
6
+
7
+ filter_parameter_logging :password
8
+ verify_method_post :only => [:validate, :create, :activate]
9
+ before_filter :clear_session_user_id, :only => [:index, :validate, :validated, :create, :created, :activation, :activate, :activated]
10
+ before_filter :clear_session_signup_form, :only => [:index, :validate, :activation, :activate, :activated]
11
+
12
+ # GET /signup/email
13
+ def index
14
+ @signup_form = EditFormClass.new
15
+ end
16
+
17
+ # POST /signup/email/validate
18
+ def validate
19
+ @signup_form = EditFormClass.new(params[:signup_form])
20
+
21
+ if @signup_form.valid?
22
+ session[:signup_form] = @signup_form.attributes
23
+ redirect_to(:action => "validated")
24
+ else
25
+ @signup_form.password = nil
26
+ @signup_form.password_confirmation = nil
27
+ set_error_now("入力内容を確認してください。")
28
+ render(:action => "index")
29
+ end
30
+ end
31
+
32
+ # GET /signup/email/validated
33
+ def validated
34
+ @signup_form = EditFormClass.new(session[:signup_form])
35
+
36
+ if @signup_form.valid?
37
+ render
38
+ else
39
+ set_error_now("入力内容を確認してください。")
40
+ render(:action => "index")
41
+ end
42
+ end
43
+
44
+ # POST /signup/email/create
45
+ def create
46
+ @signup_form = EditFormClass.new(session[:signup_form])
47
+
48
+ @user = User.new
49
+ @credential = @user.email_credentials.build
50
+ @credential.attributes = @signup_form.to_email_credential_hash
51
+
52
+ if @signup_form.valid? && @user.save
53
+ @activation_url = url_for(
54
+ :only_path => false,
55
+ :controller => "signup/email",
56
+ :action => "activation",
57
+ :activation_token => @credential.activation_token)
58
+
59
+ # TODO: テスト
60
+ # MEMO: 即時性を優先し、非同期化しない
61
+ ActivationMailer.deliver_request_for_signup(
62
+ :recipients => @credential.email,
63
+ :activation_url => @activation_url)
64
+
65
+ redirect_to(:action => "created")
66
+ else
67
+ set_error_now("入力内容を確認してください。")
68
+ render(:action => "index")
69
+ end
70
+ end
71
+
72
+ # GET /signup/email/created
73
+ def created
74
+ @signup_form = EditFormClass.new(session[:signup_form])
75
+ @credential = EmailCredential.find_by_email(@signup_form.email)
76
+ end
77
+
78
+ # GET /signup/email/activation/:activation_token
79
+ # FIXME: URLの見直し
80
+ # FIXME: 無効なアクティベーションキー、アクティベーション済みのキーはフィルタで弾く
81
+ def activation
82
+ @credential = EmailCredential.find_by_activation_token(params[:activation_token])
83
+ @activated = @credential.try(:activated?)
84
+ end
85
+
86
+ # POST /signup/email/activate
87
+ # FIXME: URLの見直し
88
+ # FIXME: 無効なアクティベーションキー、アクティベーション済みのキーはフィルタで弾く
89
+ def activate
90
+ @credential = EmailCredential.find_by_activation_token(params[:activation_token])
91
+
92
+ unless @credential
93
+ set_error("無効なアクティベーションキーです。")
94
+ redirect_to(root_path)
95
+ return
96
+ end
97
+
98
+ if @credential.activated?
99
+ set_error("既に本登録されています。")
100
+ redirect_to(root_path)
101
+ return
102
+ end
103
+
104
+ @credential.activate!
105
+
106
+ # TODO: テスト
107
+ # MEMO: 即時性を優先し、非同期化しない
108
+ ActivationMailer.deliver_complete_for_signup(
109
+ :recipients => @credential.email)
110
+
111
+ redirect_to(:action => "activated")
112
+ end
113
+
114
+ # GET /signup/email/activated
115
+ # FIXME: URLの見直し
116
+ # FIXME: 無効なアクティベーションキー、アクティベーション済みのキーはフィルタで弾く
117
+ def activated
118
+ # nop
119
+ end
120
+
121
+ private
122
+
123
+ def clear_session_user_id
124
+ session[:user_id] = nil
125
+ return true
126
+ end
127
+
128
+ def clear_session_signup_form
129
+ session[:signup_form] = nil
130
+ return true
131
+ end
132
+ end
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # OpenID認証情報サインアップ
4
+ # FIXME: 全体的に実装を整理
5
+ class Signup::OpenIdController < ApplicationController
6
+ # GET /signup/open_id
7
+ def index
8
+ session[:identity_url] = nil
9
+ @openid_url = nil
10
+ end
11
+
12
+ # POST /signup/open_id/authenticate
13
+ # GET /signup/open_id/authenticate
14
+ def authenticate
15
+ @openid_url = params[:openid_url]
16
+
17
+ failed = proc { |message|
18
+ flash[:error] = message
19
+ redirect_to(:action => "index")
20
+ }
21
+
22
+ authenticate_with_open_id(@openid_url) { |result, identity_url, sreg|
23
+ if result.successful?
24
+ if OpenIdCredential.exists?(:identity_url => identity_url)
25
+ failed["指定されたOpenIDは既に登録されているため、利用できません。"]
26
+ else
27
+ session[:identity_url] = identity_url
28
+ redirect_to(:action => "authenticated")
29
+ end
30
+ else
31
+ failed[result.message]
32
+ end
33
+ }
34
+ end
35
+
36
+ # GET /signup/open_id/authenticated
37
+ def authenticated
38
+ @identity_url = session[:identity_url]
39
+ end
40
+
41
+ # POST /signup/open_id/create
42
+ def create
43
+ @identity_url = session[:identity_url]
44
+
45
+ @user = User.new
46
+ @credential = @user.open_id_credentials.build
47
+ @credential.identity_url = @identity_url
48
+
49
+ @user.save!
50
+
51
+ # FIXME: ログイン状態にしないように変更
52
+ session[:identity_url] = nil
53
+ session[:user_id] = @user.id
54
+
55
+ redirect_to(:action => "created")
56
+ end
57
+
58
+ # GET /signup/open_id/created
59
+ def created
60
+ # nop
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+
2
+ # サインアップ
3
+ class SignupController < ApplicationController
4
+ # GET /signup
5
+ def index
6
+ # nop
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module ApplicationHelper
4
+ include MultiAuthHelper
5
+ end