lib/uaa/cli/group.rb in cf-uaac-3.13.0 vs lib/uaa/cli/group.rb in cf-uaac-3.13.1
- old
+ new
@@ -104,33 +104,111 @@
raise BadResponse, "no id found in response of current members" unless id
s << id
}
end
- def update_members(scim, name, attr, users, add = true)
- group = scim_get_object(scim, :group, gname(name))
- old_ids = id_set(group[attr] || [])
- new_ids = id_set(scim.ids(:user, *users))
- if add
- raise "not all users found, none added" unless new_ids.size == users.size
- group[attr] = (old_ids + new_ids).to_a
- raise "no new users given" unless group[attr].size > old_ids.size
- else
- raise "not all users found, none deleted" unless new_ids.size == users.size
- group[attr] = (old_ids - new_ids).to_a
- raise "no existing users to delete" unless group[attr].size < old_ids.size
- group.delete(attr) if group[attr].empty?
+ def find_members(scim, members)
+ found_members = []
+
+ scim.ids(:user, *members).each do |member|
+ found_members << {
+ 'type' => 'USER',
+ 'value' => member['id'],
+ 'origin' => member['origin']
+ }
+ end
+
+ found_members
+ end
+
+ def union(old_members, new_members)
+ old_ids = id_set(old_members)
+ all_members = old_members.clone
+
+ new_members.each do |member|
+ unless old_ids.include?(member['value'])
+ all_members << member
end
- scim.put(:group, group)
- "success"
+ end
+
+ all_members
end
+ def difference(old_members, new_members)
+ new_ids = id_set(new_members)
+
+ old_members.reject do |member|
+ new_ids.include?(member['value'])
+ end
+ end
+
+ def add_members(scim, name, members)
+ group = scim_get_object(scim, :group, gname(name))
+
+ old_members = (group['members'] || [])
+ new_members = find_members(scim, members)
+
+ unless new_members.size == members.size
+ raise 'not all users found, none added'
+ end
+
+ group['members'] = union(old_members, new_members)
+
+ unless group['members'].size > old_members.size
+ raise 'no new users given'
+ end
+
+ scim.put(:group, group)
+ 'success'
+ end
+
+ def delete_members(scim, name, members)
+ group = scim_get_object(scim, :group, gname(name))
+
+ old_members = (group['members'] || [])
+ new_members = find_members(scim, members)
+
+ unless new_members.size == members.size
+ raise 'not all users found, none deleted'
+ end
+
+ group['members'] = difference(old_members, new_members)
+
+ unless group['members'].size < old_members.size
+ raise 'no existing users to delete'
+ end
+
+ group.delete('members') if group['members'].empty?
+
+ scim.put(:group, group)
+ 'success'
+ end
+
+ def update_members(scim, name, attr, users, add = true)
+ group = scim_get_object(scim, :group, gname(name))
+ old_ids = id_set(group[attr] || [])
+ new_ids = id_set(scim.ids(:user, *users))
+ if add
+ raise 'not all users found, none added' unless new_ids.size == users.size
+ group[attr] = (old_ids + new_ids).to_a
+ raise 'no new users given' unless group[attr].size > old_ids.size
+ else
+ raise 'not all users found, none deleted' unless new_ids.size == users.size
+ group[attr] = (old_ids - new_ids).to_a
+ raise 'no existing users to delete' unless group[attr].size < old_ids.size
+ group.delete(attr) if group[attr].empty?
+ end
+
+ scim.put(:group, group)
+ 'success'
+ end
+
desc "member add [name] [users...]", "add members to a group" do |name, *users|
- pp scim_request { |scim| update_members(scim, name, "members", users) }
+ pp scim_request { |scim| add_members(scim, name, users) }
end
desc "member delete [name] [users...]", "remove members from a group" do |name, *users|
- pp scim_request { |scim| update_members(scim, name, "members", users, false) }
+ pp scim_request { |scim| delete_members(scim, name, users) }
end
desc "group reader add [name] [users...]", "add users who can read the members" do |name, *users|
pp scim_request { |scim| update_members(scim, name, "readers", users) }
end