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.
- data/Rakefile +1 -0
- data/app/controllers/identities.rb +160 -0
- data/app/controllers/profiles.rb +61 -0
- data/app/controllers/sessions.rb +78 -0
- data/app/controllers/user_mailer.rb +30 -0
- data/app/controllers/user_management.rb +9 -0
- data/app/controllers/users_app.rb +9 -0
- data/app/helpers/users/authorization.rb +65 -0
- data/app/helpers/users/general.rb +22 -0
- data/app/models/avatar_file.rb +33 -0
- data/app/models/user.rb +105 -0
- data/app/models/user/email_verification_token.rb +20 -0
- data/app/models/user/forgot_password_token.rb +12 -0
- data/app/static/open_id.js +2 -0
- data/app/static/openid-selector/css/openid.css +45 -0
- data/app/static/openid-selector/demo.html +58 -0
- data/app/static/openid-selector/demoOpenIDClient.html +69 -0
- data/app/static/openid-selector/images/aol.gif +0 -0
- data/app/static/openid-selector/images/blogger.ico +0 -0
- data/app/static/openid-selector/images/claimid.ico +0 -0
- data/app/static/openid-selector/images/facebook.gif +0 -0
- data/app/static/openid-selector/images/flickr.ico +0 -0
- data/app/static/openid-selector/images/google.gif +0 -0
- data/app/static/openid-selector/images/livejournal.ico +0 -0
- data/app/static/openid-selector/images/myopenid.ico +0 -0
- data/app/static/openid-selector/images/openid-inputicon.gif +0 -0
- data/app/static/openid-selector/images/openid.gif +0 -0
- data/app/static/openid-selector/images/technorati.ico +0 -0
- data/app/static/openid-selector/images/verisign.gif +0 -0
- data/app/static/openid-selector/images/verisign.ico +0 -0
- data/app/static/openid-selector/images/vidoop.ico +0 -0
- data/app/static/openid-selector/images/wordpress.ico +0 -0
- data/app/static/openid-selector/images/yahoo.gif +0 -0
- data/app/static/openid-selector/js/jquery-1.2.6.min.js +32 -0
- data/app/static/openid-selector/js/openid-client/jquery.query-2.1.3.js +220 -0
- data/app/static/openid-selector/js/openid-client/openid-client-config.js +20 -0
- data/app/static/openid-selector/js/openid-client/openid-client.js +63 -0
- data/app/static/openid-selector/js/openid-jquery.js +240 -0
- data/app/static/openid-selector/openid-client/checkid_immediate_response.html +3 -0
- data/app/static/openid-selector/openid-client/checkid_setup_response.html +3 -0
- data/app/static/themes/default/users.css +947 -0
- data/app/static/themes/default/users.less +4 -0
- data/app/views/controllers/identities/enter_email_form.html.haml +6 -0
- data/app/views/controllers/identities/finish_email_registration_form.html.haml +23 -0
- data/app/views/controllers/identities/finish_open_id_registration_form.html.haml +12 -0
- data/app/views/controllers/identities/forgot_password_form.html.haml +6 -0
- data/app/views/controllers/identities/reset_password_form.html.haml +9 -0
- data/app/views/controllers/identities/update_password_form.html.haml +11 -0
- data/app/views/controllers/profiles/_form.html.haml +15 -0
- data/app/views/controllers/profiles/_roles.html.haml +6 -0
- data/app/views/controllers/profiles/_user.html.haml +24 -0
- data/app/views/controllers/profiles/actions.js.haml +12 -0
- data/app/views/controllers/profiles/all.html.haml +3 -0
- data/app/views/controllers/profiles/show.html.haml +1 -0
- data/app/views/controllers/sessions/_open_id_form.html.haml +16 -0
- data/app/views/controllers/sessions/_password_form.html.haml +13 -0
- data/app/views/controllers/sessions/login.html.haml +8 -0
- data/app/views/controllers/sessions/status.html.haml +1 -0
- data/app/views/themes/default/user.html.haml +8 -0
- data/app/views/users/_menu.html.haml +6 -0
- data/app/views/users/layout.html.haml +10 -0
- data/app/views/users/layout.js.haml +1 -0
- data/config/locales/en.yml +103 -0
- data/config/locales/ru.yml +105 -0
- data/config/routes.rb +18 -0
- metadata +71 -7
data/Rakefile
CHANGED
@@ -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,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
|