Skip to content

Commit 0cc23ee

Browse files
committed
Validate use of 'root' user by Tasks
* Matches the logic from the Process model for run_action_user default behavior when root not allowed * Relies on ProcessUserPolicy for validation
1 parent b6bd7b9 commit 0cc23ee

File tree

2 files changed

+88
-28
lines changed

2 files changed

+88
-28
lines changed

app/models/runtime/task_model.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def permitted_users
6666
end
6767

6868
def docker_run_action_user
69-
droplet.docker_user.presence || AppModel::DEFAULT_CONTAINER_USER
69+
droplet&.docker_user.presence || (Config.config.get(:allow_process_root_user) ? AppModel::DEFAULT_DOCKER_CONTAINER_USER : AppModel::DEFAULT_CONTAINER_USER)
7070
end
7171

7272
def running_state?

spec/unit/models/runtime/task_model_spec.rb

Lines changed: 87 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -204,51 +204,111 @@ module VCAP::CloudController
204204
task.droplet.update(execution_metadata: droplet_execution_metadata)
205205
end
206206

207-
context 'when the task has a user specified' do
207+
context 'when root user is allowed' do
208208
before do
209-
task.update(user: 'ContainerUser')
209+
TestConfig.override(allow_process_root_user: true)
210210
end
211211

212-
it 'returns the user' do
213-
expect(task.run_action_user).to eq('ContainerUser')
212+
context 'when the task has a user specified' do
213+
before do
214+
task.update(user: 'ContainerUser')
215+
end
216+
217+
it 'returns the user' do
218+
expect(task.run_action_user).to eq('ContainerUser')
219+
end
214220
end
215-
end
216221

217-
context 'when the droplet execution metadata specifies a user' do
218-
it 'returns the specified user' do
219-
expect(task.run_action_user).to eq('cnb')
222+
context 'when the droplet execution metadata specifies a user' do
223+
it 'returns the specified user' do
224+
expect(task.run_action_user).to eq('cnb')
225+
end
220226
end
221-
end
222227

223-
context 'when the droplet execution metadata DOES NOT specify a user' do
224-
let(:droplet_execution_metadata) { '{"entrypoint":["/image-entrypoint.sh"]}' }
228+
context 'when the droplet execution metadata DOES NOT specify a user' do
229+
let(:droplet_execution_metadata) { '{"entrypoint":["/image-entrypoint.sh"]}' }
225230

226-
it 'defaults the user to root' do
227-
expect(task.run_action_user).to eq('root')
231+
it 'defaults the user to root' do
232+
expect(task.run_action_user).to eq('root')
233+
end
228234
end
229-
end
230235

231-
context 'when the droplet execution metadata is an empty string' do
232-
let(:droplet_execution_metadata) { '' }
236+
context 'when the droplet execution metadata is an empty string' do
237+
let(:droplet_execution_metadata) { '' }
233238

234-
it 'defaults the user to root' do
235-
expect(task.run_action_user).to eq('root')
239+
it 'defaults the user to root' do
240+
expect(task.run_action_user).to eq('root')
241+
end
236242
end
237-
end
238243

239-
context 'when the droplet execution metadata is nil' do
240-
let(:droplet_execution_metadata) { nil }
244+
context 'when the droplet execution metadata is nil' do
245+
let(:droplet_execution_metadata) { nil }
241246

242-
it 'defaults the user to root' do
243-
expect(task.run_action_user).to eq('root')
247+
it 'defaults the user to root' do
248+
expect(task.run_action_user).to eq('root')
249+
end
250+
end
251+
252+
context 'when the droplet execution metadata has invalid json' do
253+
let(:droplet_execution_metadata) { '{' }
254+
255+
it 'defaults the user to root' do
256+
expect(task.run_action_user).to eq('root')
257+
end
244258
end
245259
end
246260

247-
context 'when the droplet execution metadata has invalid json' do
248-
let(:droplet_execution_metadata) { '{' }
261+
context 'when root user is not allowed' do
262+
before do
263+
TestConfig.override(allow_process_root_user: false)
264+
end
249265

250-
it 'defaults the user to root' do
251-
expect(task.run_action_user).to eq('root')
266+
context 'when the task has a user specified' do
267+
before do
268+
task.update(user: 'ContainerUser')
269+
end
270+
271+
it 'returns the user' do
272+
expect(task.run_action_user).to eq('ContainerUser')
273+
end
274+
end
275+
276+
context 'when the droplet execution metadata specifies a user' do
277+
it 'returns the specified user' do
278+
expect(task.run_action_user).to eq('cnb')
279+
end
280+
end
281+
282+
context 'when the droplet execution metadata DOES NOT specify a user' do
283+
let(:droplet_execution_metadata) { '{"entrypoint":["/image-entrypoint.sh"]}' }
284+
285+
it 'defaults the user to vcap' do
286+
expect(task.run_action_user).to eq('vcap')
287+
end
288+
end
289+
290+
context 'when the droplet execution metadata is an empty string' do
291+
let(:droplet_execution_metadata) { '' }
292+
293+
it 'defaults the user to vcap' do
294+
expect(task.run_action_user).to eq('vcap')
295+
end
296+
end
297+
298+
context 'when the droplet execution metadata is nil' do
299+
let(:droplet_execution_metadata) { nil }
300+
301+
it 'defaults the user to vcap' do
302+
expect(task.run_action_user).to eq('vcap')
303+
end
304+
end
305+
306+
context 'when the droplet execution metadata has invalid json' do
307+
let(:droplet_execution_metadata) { '{' }
308+
309+
it 'defaults the user to vcap' do
310+
expect(task.run_action_user).to eq('vcap')
311+
end
252312
end
253313
end
254314
end

0 commit comments

Comments
 (0)