File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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")
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments