Skip to content

Commit fb624e3

Browse files
committed
Enable UAA shadow user creation for POST /v3/users
1 parent 3670d31 commit fb624e3

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

app/actions/user_create.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,21 @@ class Error < StandardError
44
end
55

66
def create(message:)
7-
user = User.create(guid: message.guid)
7+
begin
8+
shadow_user = User.create_uaa_shadow_user(message.username, message.origin) if message.username && message.origin
9+
rescue CF::UAA::TargetError => e
10+
raise e unless e.info['error'] == 'scim_resource_already_exists'
11+
12+
existing_guid = e.info['user_id']
13+
end
14+
15+
user_guid = existing_guid || shadow_user['id'] || message.guid
16+
17+
user = User.create(guid: user_guid)
818
User.db.transaction do
919
MetadataUpdate.update(user, message)
1020
end
21+
1122
user
1223
rescue Sequel::ValidationFailed => e
1324
validation_error!(message, e)
@@ -16,7 +27,11 @@ def create(message:)
1627
private
1728

1829
def validation_error!(message, error)
19-
error!("User with guid '#{message.guid}' already exists.") if error.errors.on(:guid)&.any? { |e| [:unique].include?(e) }
30+
error!("User with guid '#{message.guid}' already exists.") if message.guid && error.errors.on(:guid)&.any? { |e| [:unique].include?(e) }
31+
32+
if !message.guid && error.errors.on(:guid)&.any? { |e| [:unique].include?(e) }
33+
error!("User with username '#{message.username}' and origin '#{message.origin}' already exists.")
34+
end
2035

2136
error!(error.message)
2237
end

app/models/runtime/user.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,11 @@ def self.uaa_users_info(user_guids)
252252
uaa_username_lookup_client.users_for_ids(user_guids)
253253
end
254254

255+
def self.create_uaa_shadow_user(username, origin)
256+
uaa_shadow_user_creation_client = CloudController::DependencyLocator.instance.uaa_shadow_user_creation_client
257+
uaa_shadow_user_creation_client.create_shadow_user(username, origin)
258+
end
259+
255260
def self.user_visibility_filter(_)
256261
full_dataset_filter
257262
end

lib/cloud_controller/uaa/uaa_client.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ def origins_for_username(username)
9696
raise UaaUnavailable
9797
end
9898

99+
def create_shadow_user(username, origin)
100+
with_cache_retry { scim.add(:user, { username: username, origin: origin, emails: [{ primary: true, value: username}]}) }
101+
end
102+
99103
def info
100104
CF::UAA::Info.new(uaa_target, uaa_connection_opts)
101105
end

0 commit comments

Comments
 (0)