Skip to content

Commit 2243965

Browse files
author
Nuo Yan
committed
fixing users, default admin can now be deleted. Last admin user cannot be deleted. If no admin user exists, on webui start, the default admin user will be created
1 parent 927a74d commit 2243965

5 files changed

Lines changed: 40 additions & 17 deletions

File tree

chef-server-api/lib/chef-server-api.rb

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,6 @@ def self.activate
7777

7878
Chef::Log.info('Loading roles')
7979
Chef::Role.sync_from_disk_to_couchdb
80-
81-
# Create the default WebUI admin user "admin" if not already exists
82-
begin
83-
user = Chef::WebUIUser.load(Chef::Config[:web_ui_admin_user_name])
84-
rescue Chef::Exceptions::CouchDBNotFound => e
85-
user = Chef::WebUIUser.new
86-
user.name = Chef::Config[:web_ui_admin_user_name]
87-
user.set_password(Chef::Config[:web_ui_admin_default_password])
88-
user.admin = true
89-
user.save
90-
end
9180

9281
# Create the signing key and certificate
9382
Chef::Certificate.generate_signing_ca

chef-server-webui/app/controllers/application.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,26 @@ def logout_and_redirect_to_login
8989
redirect(slice_url(:users_login), {:message => { :error => $! }, :permanent => true})
9090
end
9191

92+
93+
def is_admin(name)
94+
user = Chef::WebUIUser.load(name)
95+
return user.admin
96+
end
97+
98+
#return true if there is only one admin left, false otehrwise
99+
def is_last_admin
100+
count = 0
101+
users = Chef::WebUIUser.list
102+
users.each do |u|
103+
user = Chef::WebUIUser.load(u)
104+
if user.admin
105+
count = count + 1
106+
return false if count == 2
107+
end
108+
end
109+
true
110+
end
111+
92112
def authorized_node
93113
# if session[:level] == :admin
94114
# Chef::Log.debug("Authorized as Administrator")

chef-server-webui/app/controllers/users.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def logout
151151

152152
def destroy
153153
begin
154-
raise Forbidden, "The default admin user cannot be deleted" if params[:user_id] == Chef::Config[:web_ui_admin_user_name]
154+
raise Forbidden, "The last admin user cannot be deleted" if (is_admin(params[:user_id]) && is_last_admin)
155155
raise Forbidden, "A non-admin user can only delete itself" if (params[:user_id] != session[:user] && session[:level] != :admin)
156156
@user = Chef::WebUIUser.load(params[:user_id])
157157
@user.destroy

chef-server-webui/lib/chef-server-webui.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,13 @@ def self.setup_router(scope)
132132
begin
133133
user = Chef::WebUIUser.load(Chef::Config[:web_ui_admin_user_name])
134134
rescue Chef::Exceptions::CouchDBNotFound => e
135-
user = Chef::WebUIUser.new
136-
user.name = Chef::Config[:web_ui_admin_user_name]
137-
user.set_password(Chef::Config[:web_ui_admin_default_password])
138-
user.admin = true
139-
user.save
135+
unless Chef::WebUIUser.admin_exist
136+
user = Chef::WebUIUser.new
137+
user.name = Chef::Config[:web_ui_admin_user_name]
138+
user.set_password(Chef::Config[:web_ui_admin_default_password])
139+
user.admin = true
140+
user.save
141+
end
140142
end
141143

142144
end

chef/lib/chef/webui_user.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@ def self.create_design_document
152152
Chef::CouchDB.new.create_design_document("users", DESIGN_DOCUMENT)
153153
end
154154

155+
#return true if an admin user exists. this is pretty expensive (O(n)), should think of a better way (nuo)
156+
def self.admin_exist
157+
users = self.list
158+
users.each do |u|
159+
user = self.load(u)
160+
if user.admin
161+
return user.name
162+
end
163+
end
164+
nil
165+
end
166+
155167
protected
156168

157169
def generate_salt

0 commit comments

Comments
 (0)