multi_auth 0.0.1

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 (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