rad_users 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 (66) hide show
  1. data/Rakefile +1 -0
  2. data/app/controllers/identities.rb +160 -0
  3. data/app/controllers/profiles.rb +61 -0
  4. data/app/controllers/sessions.rb +78 -0
  5. data/app/controllers/user_mailer.rb +30 -0
  6. data/app/controllers/user_management.rb +9 -0
  7. data/app/controllers/users_app.rb +9 -0
  8. data/app/helpers/users/authorization.rb +65 -0
  9. data/app/helpers/users/general.rb +22 -0
  10. data/app/models/avatar_file.rb +33 -0
  11. data/app/models/user.rb +105 -0
  12. data/app/models/user/email_verification_token.rb +20 -0
  13. data/app/models/user/forgot_password_token.rb +12 -0
  14. data/app/static/open_id.js +2 -0
  15. data/app/static/openid-selector/css/openid.css +45 -0
  16. data/app/static/openid-selector/demo.html +58 -0
  17. data/app/static/openid-selector/demoOpenIDClient.html +69 -0
  18. data/app/static/openid-selector/images/aol.gif +0 -0
  19. data/app/static/openid-selector/images/blogger.ico +0 -0
  20. data/app/static/openid-selector/images/claimid.ico +0 -0
  21. data/app/static/openid-selector/images/facebook.gif +0 -0
  22. data/app/static/openid-selector/images/flickr.ico +0 -0
  23. data/app/static/openid-selector/images/google.gif +0 -0
  24. data/app/static/openid-selector/images/livejournal.ico +0 -0
  25. data/app/static/openid-selector/images/myopenid.ico +0 -0
  26. data/app/static/openid-selector/images/openid-inputicon.gif +0 -0
  27. data/app/static/openid-selector/images/openid.gif +0 -0
  28. data/app/static/openid-selector/images/technorati.ico +0 -0
  29. data/app/static/openid-selector/images/verisign.gif +0 -0
  30. data/app/static/openid-selector/images/verisign.ico +0 -0
  31. data/app/static/openid-selector/images/vidoop.ico +0 -0
  32. data/app/static/openid-selector/images/wordpress.ico +0 -0
  33. data/app/static/openid-selector/images/yahoo.gif +0 -0
  34. data/app/static/openid-selector/js/jquery-1.2.6.min.js +32 -0
  35. data/app/static/openid-selector/js/openid-client/jquery.query-2.1.3.js +220 -0
  36. data/app/static/openid-selector/js/openid-client/openid-client-config.js +20 -0
  37. data/app/static/openid-selector/js/openid-client/openid-client.js +63 -0
  38. data/app/static/openid-selector/js/openid-jquery.js +240 -0
  39. data/app/static/openid-selector/openid-client/checkid_immediate_response.html +3 -0
  40. data/app/static/openid-selector/openid-client/checkid_setup_response.html +3 -0
  41. data/app/static/themes/default/users.css +947 -0
  42. data/app/static/themes/default/users.less +4 -0
  43. data/app/views/controllers/identities/enter_email_form.html.haml +6 -0
  44. data/app/views/controllers/identities/finish_email_registration_form.html.haml +23 -0
  45. data/app/views/controllers/identities/finish_open_id_registration_form.html.haml +12 -0
  46. data/app/views/controllers/identities/forgot_password_form.html.haml +6 -0
  47. data/app/views/controllers/identities/reset_password_form.html.haml +9 -0
  48. data/app/views/controllers/identities/update_password_form.html.haml +11 -0
  49. data/app/views/controllers/profiles/_form.html.haml +15 -0
  50. data/app/views/controllers/profiles/_roles.html.haml +6 -0
  51. data/app/views/controllers/profiles/_user.html.haml +24 -0
  52. data/app/views/controllers/profiles/actions.js.haml +12 -0
  53. data/app/views/controllers/profiles/all.html.haml +3 -0
  54. data/app/views/controllers/profiles/show.html.haml +1 -0
  55. data/app/views/controllers/sessions/_open_id_form.html.haml +16 -0
  56. data/app/views/controllers/sessions/_password_form.html.haml +13 -0
  57. data/app/views/controllers/sessions/login.html.haml +8 -0
  58. data/app/views/controllers/sessions/status.html.haml +1 -0
  59. data/app/views/themes/default/user.html.haml +8 -0
  60. data/app/views/users/_menu.html.haml +6 -0
  61. data/app/views/users/layout.html.haml +10 -0
  62. data/app/views/users/layout.js.haml +1 -0
  63. data/config/locales/en.yml +103 -0
  64. data/config/locales/ru.yml +105 -0
  65. data/config/routes.rb +18 -0
  66. metadata +71 -7
data/Rakefile CHANGED
@@ -12,6 +12,7 @@ project(
12
12
  name: "users",
13
13
  official_name: 'rad_users',
14
14
  summary: "User Management for RadKit Framework",
15
+ dirs: ['app', 'config'],
15
16
  gem: true,
16
17
 
17
18
  author: "Alexey Petrushin",
@@ -0,0 +1,160 @@
1
+ class Identities < UserManagement
2
+ # TODO3 filter password logging
3
+ # filter_parameter_logging :password, :password_confirmation, :old_password
4
+
5
+ rad.extension :user_identities, self
6
+
7
+ before :login_required, only: [
8
+ :update_password_form, :update_password,
9
+ :destroy
10
+ ]
11
+
12
+ before :login_not_required, only: [
13
+ :enter_email_form, :enter_email,
14
+ :finish_email_registration_form, :finish_email_registration,
15
+
16
+ :finish_open_id_registration_form, :finish_open_id_registration,
17
+
18
+ :reset_password_form, :reset_password,
19
+ :forgot_password_form, :forgot_password
20
+ ]
21
+
22
+ persist_params # only: [:finish_open_id_registration_form, :finish_open_id_registration]
23
+
24
+ layout '/users/layout'
25
+
26
+ #
27
+ # Email and Password
28
+ #
29
+ def enter_email_form
30
+ @token = Models::User::EmailVerificationToken.new
31
+ end
32
+ allow_get_for :enter_email_form
33
+
34
+ def enter_email
35
+ @token = Models::User::EmailVerificationToken.new params.token
36
+ @token.expires_at = 2.weeks.from_now
37
+ if @token.save
38
+ UserMailer.email_verification(@token).deliver
39
+ flash.sticky_info = t :email_verification_code_sent, email: @token.email
40
+ redirect_to :follow_email_link
41
+ else
42
+ render action: :enter_email_form
43
+ end
44
+ end
45
+
46
+ def follow_email_link
47
+ end
48
+ allow_get_for :follow_email_link
49
+
50
+ def finish_email_registration_form
51
+ @token = Models::User::EmailVerificationToken.by_token params.token
52
+ raise_user_error t(:invalid_email_verification_token) unless @token
53
+
54
+ @user = Models::User.new
55
+ end
56
+ allow_get_for :finish_email_registration_form
57
+
58
+ def finish_email_registration
59
+ @token = Models::User::EmailVerificationToken.by_token params.token
60
+
61
+ @user = Models::User.new
62
+ @user.email = @token.email
63
+ %w{name password password_confirmation}.each do |a|
64
+ @user.send "#{a}=", params.user[a] if params.user?
65
+ end
66
+
67
+ if @user.activate and @user.save
68
+ @token.destroy
69
+ flash.sticky_info = t :successfully_registered
70
+ redirect_to login_path #(_return_to: nil)
71
+ else
72
+ render action: :finish_email_registration_form
73
+ end
74
+ end
75
+
76
+ def forgot_password_form
77
+ end
78
+ allow_get_for :forgot_password_form
79
+
80
+ def forgot_password
81
+ @email = params.email
82
+ user = Models::User.first state: 'active', email: @email
83
+ if user
84
+ token = Models::User::ForgotPasswordToken.create! user: user
85
+ UserMailer.forgot_password(token).deliver
86
+ flash.sticky_info = t :sucessfully_reset_password, email: @email
87
+ redirect_to default_path
88
+ else
89
+ flash.sticky_error = t :failed_reset_password, email: @email
90
+ render action: :forgot_password_form
91
+ end
92
+ end
93
+
94
+ def reset_password_form
95
+ @token = Models::User::ForgotPasswordToken.by_token params.token
96
+ raise_user_error t(:invalid_reset_password_token) unless @token
97
+ @user = @token.user
98
+ end
99
+ allow_get_for :reset_password_form
100
+
101
+ def reset_password
102
+ @token = Models::User::ForgotPasswordToken.by_token params.token
103
+ raise_user_error t(:invalid_reset_password_token) unless @token
104
+ @user = @token.user
105
+
106
+ @user.password = params.user['password']
107
+ @user.password_confirmation = params.user['password_confirmation']
108
+
109
+ if @user.save
110
+ @token.destroy
111
+ flash.sticky_info = t :password_restored
112
+ redirect_to login_path(_return_to: nil)
113
+ else
114
+ render action: :reset_password_form
115
+ end
116
+ end
117
+
118
+ def update_password_form
119
+ @user = Models::User.current
120
+ # render action: :update_password_form
121
+ end
122
+ allow_get_for :update_password_form
123
+
124
+ def update_password
125
+ @user = Models::User.current
126
+
127
+ if @user.update_password(params.user['password'], params.user['password_confirmation'], params.old_password) and @user.save
128
+ flash.sticky_info = t :password_updated
129
+ redirect_to default_path
130
+ else
131
+ render action: :update_password_form
132
+ end
133
+ end
134
+
135
+
136
+ #
137
+ # Open Id
138
+ #
139
+ def finish_open_id_registration_form
140
+ @user = Models::User.new
141
+ @token = Models::SecureToken.by_token! params.token
142
+ end
143
+ allow_get_for :finish_open_id_registration_form
144
+
145
+ def finish_open_id_registration
146
+ @token = Models::SecureToken.by_token! params.token
147
+ @user = Models::User.new
148
+ @user.name = params.user['name']
149
+ @user.open_ids << @token[:open_id]
150
+
151
+ if @user.activate and @user.save
152
+ @token.destroy
153
+ flash.sticky_info = t :successfull_open_id_registration
154
+ set_current_user_with_updating_session @user
155
+ redirect_to return_to_path_for_login
156
+ else
157
+ render action: :finish_open_id_registration_form
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,61 @@
1
+ class Profiles < UsersApp
2
+ prepare_model(
3
+ Models::User, finder: :find_by_name,
4
+ only: [:show, :edit, :update, :add_role, :remove_role]
5
+ )
6
+
7
+ # require_permission :view, only: :show do
8
+ # @user
9
+ # end
10
+
11
+ layout '/users/layout'
12
+
13
+ helper Helpers::Users::Authorization
14
+
15
+ allow_get_for :all, :show, :edit
16
+
17
+ def all
18
+ @users = Models::User.all
19
+ end
20
+
21
+ def show
22
+ end
23
+
24
+
25
+ require_permission(:update_profile, only: [:edit, :update]){@user}
26
+ def edit
27
+ end
28
+
29
+ def update
30
+ access_denied if @user.anonymous? and !Models::User.current.admin?
31
+
32
+ if @user.update_attributes params[:user]
33
+ flash[:info] = t :user_updated
34
+ # redirect_to action: :show
35
+ else
36
+ render action: :edit
37
+ end
38
+ end
39
+
40
+ def add_role
41
+ require_permission "add_#{params[:role]}_role"
42
+
43
+ @user.add_role params[:role]
44
+ @user.save!
45
+ @user.reload
46
+ flash[:info] = t :role_granted
47
+ render action: :update
48
+ end
49
+
50
+ def remove_role
51
+ require_permission "remove_#{params[:role]}_role"
52
+
53
+ @user.remove_role params[:role]
54
+ @user.save!
55
+ @user.reload
56
+ flash[:info] = t :role_removed
57
+ render action: :update
58
+ end
59
+
60
+ active_menu{:users}
61
+ end
@@ -0,0 +1,78 @@
1
+ class Sessions < UserManagement
2
+ # TODO3 filter password logging
3
+ # filter_parameter_logging :password
4
+
5
+ persist_params
6
+
7
+ include OpenIdAuthentication
8
+
9
+ rad.extension :user_sessions, self
10
+
11
+ before :login_not_required, only: :login
12
+
13
+ layout '/users/layout'
14
+
15
+ allow_get_for :login, :logout, :status
16
+
17
+ def login
18
+ if using_open_id?
19
+ open_id_authentication
20
+ elsif request.post?
21
+ password_authentication
22
+ end
23
+ end
24
+
25
+ def logout
26
+ unless Models::User.current.anonymous?
27
+ set_current_user_with_updating_session Models::User.anonymous
28
+ flash.info = t :successfully_logged_out
29
+ end
30
+ redirect_to return_to_path_for_logout
31
+ end
32
+
33
+ def status; end
34
+
35
+ protected
36
+ def open_id_authentication
37
+ # params['return_to'] = request.url
38
+ # hack to save all url with :_return_to
39
+ # puts params['return_to']
40
+ # render action: 'new'
41
+ # return
42
+
43
+ # return_to = request.url.gsub("_ret")
44
+
45
+ authenticate_with_open_id nil, 'return_to' => request.url do |result, identity_url, registration|
46
+
47
+ if result.successful?
48
+ if @user = Models::User.authenticate_by_open_id(identity_url)
49
+ set_current_user_with_updating_session @user
50
+ flash.info = t :successfully_logged_in
51
+ redirect_to return_to_path_for_login
52
+ else
53
+ token = Models::SecureToken.new
54
+ token[:open_id] = identity_url
55
+ token.save!
56
+ flash.sticky_info = t :successfully_identified_by_open_id
57
+ redirect_to finish_open_id_registration_form_identities_path(token: token.token)
58
+ end
59
+ else
60
+ flash.error = result.message || t(:invalid_identity, identity: identity_url)
61
+ end
62
+
63
+ end
64
+ end
65
+
66
+ def password_authentication
67
+ if @user = Models::User.authenticate_by_password(params.name, params.password)
68
+ set_current_user_with_updating_session @user
69
+ flash.info = t :successfully_logged_in
70
+
71
+ redirect_to return_to_path_for_login
72
+ else
73
+ @errors = t :invalid_login
74
+ @name = params.name
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,30 @@
1
+ class UserMailer
2
+ inherit Rad::Mailer::MailerController
3
+
4
+ def email_verification token
5
+ @to = token.email
6
+ @from = rad.users.email
7
+ @subject = t :email_verification_title, host: rad.users.host
8
+ # sent_on Time.now
9
+
10
+ @body = t(
11
+ :email_verification_text,
12
+ host: rad.users.host,
13
+ url: finish_email_registration_form_identities_path(host: rad.users.host, token: token.token)
14
+ )
15
+ end
16
+
17
+ def forgot_password token
18
+ @to = token.user.email
19
+ @from = rad.users.email
20
+ @subject = t :forgot_password_title, name: token.user.name, host: rad.users.host
21
+ # sent_on Time.now
22
+
23
+ @body = t(
24
+ :forgot_password_text,
25
+ name: token.user.name,
26
+ host: rad.users.host,
27
+ url: reset_password_form_identities_path(host: rad.users.host, token: token.token)
28
+ )
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ class UserManagement < Controllers::BaseApp
2
+ helper Helpers::Users::General
3
+
4
+ inherit Users::ControllerHelper
5
+
6
+ protect_from_forgery
7
+
8
+ rad.extension :user_management, self
9
+ end
@@ -0,0 +1,9 @@
1
+ class UsersApp < Controllers::App
2
+ helper Helpers::Users::General
3
+
4
+ inherit Users::ControllerHelper
5
+
6
+ protect_from_forgery
7
+
8
+ rad.extension :users_app, self
9
+ end
@@ -0,0 +1,65 @@
1
+ module Authorization
2
+ def roles_control_links_for user
3
+ links = []
4
+
5
+ # Ordered Roles
6
+ %w{member manager}.each do |role|
7
+ unless user.roles.include? role
8
+ if can? "add_#{role}_role"
9
+ links << add_role_link(t("add_#{role}_role"), user, role)
10
+ end
11
+ else
12
+ text = t(role)
13
+ if can? "remove_#{role}_role"
14
+ link = remove_role_link(t("remove_#{role}_role"), user, role)
15
+ links << "#{text} (#{link})"
16
+ else
17
+ links << text
18
+ end
19
+ end
20
+ end
21
+
22
+ # Custom Roles
23
+ rad.config.custom_roles.each do |role|
24
+ unless user.roles.include? role
25
+ if can? "add_custom_role"
26
+ links << add_role_link(t(:add_custom_role, role: role), user, role)
27
+ end
28
+ else
29
+ text = t(:custom_role, role: role)
30
+ if can? "remove_custom_role"
31
+ link = remove_role_link(t(:remove_custom_role, role: role), user, role)
32
+ links << "#{text} (#{link})"
33
+ else
34
+ links << text
35
+ end
36
+ end
37
+ end
38
+
39
+ # Admin Roles
40
+ unless user.roles.include? 'admin'
41
+ if can? "add_admin_role"
42
+ links << add_role_link(t(:add_admin_role), user, 'admin')
43
+ end
44
+ else
45
+ text = t(:admin)
46
+ if can? "remove_admin_role"
47
+ link = remove_role_link(t(:remove_admin_role), user, 'admin')
48
+ links << "#{text} (#{link})"
49
+ else
50
+ links << text
51
+ end
52
+ end
53
+
54
+ links
55
+ end
56
+
57
+ protected
58
+ def add_role_link text, user, role
59
+ link_to text, add_role_profile_path(user, role: role, format: :js), method: :post
60
+ end
61
+
62
+ def remove_role_link text, user, role
63
+ link_to text, remove_role_profile_path(user, role: role, format: :js), method: :post
64
+ end
65
+ end
@@ -0,0 +1,22 @@
1
+ # TODO3 'unite this with SaaS '
2
+ module General
3
+ def main_menu
4
+ @@menu ||= [
5
+ # [:home, all_pages_path],
6
+ # [:accounts, all_accounts_path, :global_administration],
7
+ [:users, all_profiles_path],
8
+ ]
9
+
10
+ unless @active_menu.blank?
11
+ (@@menu.collect do |key, link, permission|
12
+ unless permission and !can?(permission)
13
+ [t(key), link, key == @active_menu]
14
+ else
15
+ nil
16
+ end
17
+ end).compact
18
+ else
19
+ []
20
+ end
21
+ end
22
+ end