Merge "Support managing visible external groups within internal groups"
This commit is contained in:
@@ -67,7 +67,7 @@ public class GroupControl {
|
|||||||
if (group == null) {
|
if (group == null) {
|
||||||
throw new NoSuchGroupException(groupId);
|
throw new NoSuchGroupException(groupId);
|
||||||
}
|
}
|
||||||
return new GroupControl(user.get(), group);
|
return controlFor(GroupDescriptions.forAccountGroup(group));
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupControl controlFor(final AccountGroup.UUID groupId)
|
public GroupControl controlFor(final AccountGroup.UUID groupId)
|
||||||
@@ -76,10 +76,14 @@ public class GroupControl {
|
|||||||
if (group == null) {
|
if (group == null) {
|
||||||
throw new NoSuchGroupException(groupId);
|
throw new NoSuchGroupException(groupId);
|
||||||
}
|
}
|
||||||
return new GroupControl(user.get(), group);
|
return controlFor(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupControl controlFor(final AccountGroup group) {
|
public GroupControl controlFor(AccountGroup group) {
|
||||||
|
return controlFor(GroupDescriptions.forAccountGroup(group));
|
||||||
|
}
|
||||||
|
|
||||||
|
public GroupControl controlFor(GroupDescription.Basic group) {
|
||||||
return new GroupControl(user.get(), group);
|
return new GroupControl(user.get(), group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,10 +115,6 @@ public class GroupControl {
|
|||||||
group = gd;
|
group = gd;
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupControl(CurrentUser who, AccountGroup ag) {
|
|
||||||
this(who, GroupDescriptions.forAccountGroup(ag));
|
|
||||||
}
|
|
||||||
|
|
||||||
public GroupDescription.Basic getGroup() {
|
public GroupDescription.Basic getGroup() {
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import com.google.common.base.Strings;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.gerrit.common.data.GroupDescription;
|
||||||
import com.google.gerrit.common.errors.NoSuchGroupException;
|
import com.google.gerrit.common.errors.NoSuchGroupException;
|
||||||
import com.google.gerrit.extensions.restapi.AuthException;
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
@@ -94,28 +95,31 @@ public class AddIncludedGroups implements RestModifyView<GroupResource, Input> {
|
|||||||
Account.Id me = ((IdentifiedUser) control.getCurrentUser()).getAccountId();
|
Account.Id me = ((IdentifiedUser) control.getCurrentUser()).getAccountId();
|
||||||
|
|
||||||
for (String includedGroup : input.groups) {
|
for (String includedGroup : input.groups) {
|
||||||
|
GroupDescription.Basic d;
|
||||||
try {
|
try {
|
||||||
GroupResource includedGroupResource = groupsCollection.get().parse(includedGroup);
|
d = groupsCollection.get().parse(includedGroup);
|
||||||
if (!control.canAddGroup(includedGroupResource.getGroupUUID())) {
|
} catch (ResourceNotFoundException e) {
|
||||||
throw new AuthException(String.format("Cannot add group: %s",
|
badRequest.addError(new NoSuchGroupException(includedGroup));
|
||||||
includedGroupResource.getName()));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!newIncludedGroups.containsKey(includedGroupResource.getGroupUUID())) {
|
if (!control.canAddGroup(d.getGroupUUID())) {
|
||||||
|
throw new AuthException(String.format("Cannot add group: %s",
|
||||||
|
d.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newIncludedGroups.containsKey(d.getGroupUUID())) {
|
||||||
AccountGroupIncludeByUuid.Key agiKey =
|
AccountGroupIncludeByUuid.Key agiKey =
|
||||||
new AccountGroupIncludeByUuid.Key(group.getId(),
|
new AccountGroupIncludeByUuid.Key(group.getId(),
|
||||||
includedGroupResource.getGroupUUID());
|
d.getGroupUUID());
|
||||||
AccountGroupIncludeByUuid agi = db.accountGroupIncludesByUuid().get(agiKey);
|
AccountGroupIncludeByUuid agi = db.accountGroupIncludesByUuid().get(agiKey);
|
||||||
if (agi == null) {
|
if (agi == null) {
|
||||||
agi = new AccountGroupIncludeByUuid(agiKey);
|
agi = new AccountGroupIncludeByUuid(agiKey);
|
||||||
newIncludedGroups.put(includedGroupResource.getGroupUUID(), agi);
|
newIncludedGroups.put(d.getGroupUUID(), agi);
|
||||||
newIncludedGroupsAudits.add(new AccountGroupIncludeByUuidAudit(agi, me));
|
newIncludedGroupsAudits.add(new AccountGroupIncludeByUuidAudit(agi, me));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result.add(new GroupInfo(includedGroupResource.getGroup()));
|
result.add(new GroupInfo(d));
|
||||||
} catch (ResourceNotFoundException e) {
|
|
||||||
badRequest.addError(new NoSuchGroupException(includedGroup));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
badRequest.failOnError();
|
badRequest.failOnError();
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.google.gerrit.server.group;
|
|||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.gerrit.common.data.GlobalCapability;
|
import com.google.gerrit.common.data.GlobalCapability;
|
||||||
|
import com.google.gerrit.common.data.GroupDescription;
|
||||||
import com.google.gerrit.common.data.GroupDescriptions;
|
import com.google.gerrit.common.data.GroupDescriptions;
|
||||||
import com.google.gerrit.common.errors.NameAlreadyUsedException;
|
import com.google.gerrit.common.errors.NameAlreadyUsedException;
|
||||||
import com.google.gerrit.common.errors.PermissionDeniedException;
|
import com.google.gerrit.common.errors.PermissionDeniedException;
|
||||||
@@ -107,8 +108,8 @@ class CreateGroup implements RestModifyView<TopLevelResource, Input> {
|
|||||||
private AccountGroup.Id owner(Input input) throws BadRequestException {
|
private AccountGroup.Id owner(Input input) throws BadRequestException {
|
||||||
if (input.ownerId != null) {
|
if (input.ownerId != null) {
|
||||||
try {
|
try {
|
||||||
GroupResource rsrc = groups.parse(Url.decode(input.ownerId));
|
GroupDescription.Basic d = groups.parse(Url.decode(input.ownerId));
|
||||||
AccountGroup owner = GroupDescriptions.toAccountGroup(rsrc.getGroup());
|
AccountGroup owner = GroupDescriptions.toAccountGroup(d);
|
||||||
if (owner == null) {
|
if (owner == null) {
|
||||||
throw new BadRequestException("ownerId must be internal group");
|
throw new BadRequestException("ownerId must be internal group");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ package com.google.gerrit.server.group;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.gerrit.common.data.GroupDescription;
|
||||||
import com.google.gerrit.common.errors.NoSuchGroupException;
|
import com.google.gerrit.common.errors.NoSuchGroupException;
|
||||||
import com.google.gerrit.extensions.restapi.AuthException;
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
@@ -74,24 +75,24 @@ public class DeleteIncludedGroups implements RestModifyView<GroupResource, Input
|
|||||||
final BadRequestHandler badRequest = new BadRequestHandler("removing included groups");
|
final BadRequestHandler badRequest = new BadRequestHandler("removing included groups");
|
||||||
|
|
||||||
for (final String includedGroup : input.groups) {
|
for (final String includedGroup : input.groups) {
|
||||||
|
GroupDescription.Basic d;
|
||||||
try {
|
try {
|
||||||
final GroupResource includedGroupResource = groupsCollection.get().parse(includedGroup);
|
d = groupsCollection.get().parse(includedGroup);
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
if (!control.canRemoveGroup(includedGroupResource.getGroupUUID())) {
|
badRequest.addError(new NoSuchGroupException(includedGroup));
|
||||||
throw new AuthException(String.format("Cannot delete group: %s",
|
continue;
|
||||||
includedGroupResource.getName()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final AccountGroupIncludeByUuid g =
|
if (!control.canRemoveGroup(d.getGroupUUID())) {
|
||||||
includedGroups.remove(includedGroupResource.getGroupUUID());
|
throw new AuthException(String.format("Cannot delete group: %s",
|
||||||
|
d.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
AccountGroupIncludeByUuid g = includedGroups.remove(d.getGroupUUID());
|
||||||
if (g != null) {
|
if (g != null) {
|
||||||
toRemove.add(g);
|
toRemove.add(g);
|
||||||
}
|
}
|
||||||
} catch (ResourceNotFoundException e) {
|
|
||||||
badRequest.addError(new NoSuchGroupException(includedGroup));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
badRequest.failOnError();
|
badRequest.failOnError();
|
||||||
|
|
||||||
if (!toRemove.isEmpty()) {
|
if (!toRemove.isEmpty()) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
package com.google.gerrit.server.group;
|
package com.google.gerrit.server.group;
|
||||||
|
|
||||||
|
import com.google.gerrit.common.data.GroupDescription;
|
||||||
import com.google.gerrit.common.data.GroupReference;
|
import com.google.gerrit.common.data.GroupReference;
|
||||||
import com.google.gerrit.common.errors.NoSuchGroupException;
|
import com.google.gerrit.common.errors.NoSuchGroupException;
|
||||||
import com.google.gerrit.extensions.registration.DynamicMap;
|
import com.google.gerrit.extensions.registration.DynamicMap;
|
||||||
@@ -81,23 +82,28 @@ public class GroupsCollection implements
|
|||||||
} else if(!(user instanceof IdentifiedUser)) {
|
} else if(!(user instanceof IdentifiedUser)) {
|
||||||
throw new ResourceNotFoundException(id);
|
throw new ResourceNotFoundException(id);
|
||||||
}
|
}
|
||||||
return parse(id.get());
|
|
||||||
|
GroupControl ctl = groupControlFactory.controlFor(parse(id.get()));
|
||||||
|
if (!ctl.isVisible()) {
|
||||||
|
throw new ResourceNotFoundException(id);
|
||||||
|
}
|
||||||
|
return new GroupResource(ctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupResource parse(String id) throws ResourceNotFoundException {
|
GroupDescription.Basic parse(String id) throws ResourceNotFoundException {
|
||||||
try {
|
|
||||||
AccountGroup.UUID uuid = new AccountGroup.UUID(id);
|
AccountGroup.UUID uuid = new AccountGroup.UUID(id);
|
||||||
if (groupBackend.handles(uuid)) {
|
if (groupBackend.handles(uuid)) {
|
||||||
return check(id, groupControlFactory.controlFor(uuid));
|
GroupDescription.Basic d = groupBackend.get(uuid);
|
||||||
|
if (d != null) {
|
||||||
|
return d;
|
||||||
}
|
}
|
||||||
} catch (NoSuchGroupException noSuchGroup) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Might be a legacy AccountGroup.Id.
|
// Might be a legacy AccountGroup.Id.
|
||||||
if (id.matches("^[1-9][0-9]*$")) {
|
if (id.matches("^[1-9][0-9]*$")) {
|
||||||
try {
|
try {
|
||||||
AccountGroup.Id legacyId = AccountGroup.Id.parse(id);
|
AccountGroup.Id legacyId = AccountGroup.Id.parse(id);
|
||||||
return check(id, groupControlFactory.controlFor(legacyId));
|
return groupControlFactory.controlFor(legacyId).getGroup();
|
||||||
} catch (IllegalArgumentException invalidId) {
|
} catch (IllegalArgumentException invalidId) {
|
||||||
} catch (NoSuchGroupException e) {
|
} catch (NoSuchGroupException e) {
|
||||||
}
|
}
|
||||||
@@ -106,23 +112,15 @@ public class GroupsCollection implements
|
|||||||
// Might be a group name, be nice and accept unique names.
|
// Might be a group name, be nice and accept unique names.
|
||||||
GroupReference ref = GroupBackends.findExactSuggestion(groupBackend, id);
|
GroupReference ref = GroupBackends.findExactSuggestion(groupBackend, id);
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
try {
|
GroupDescription.Basic d = groupBackend.get(ref.getUUID());
|
||||||
return check(id, groupControlFactory.controlFor(ref.getUUID()));
|
if (d != null) {
|
||||||
} catch (NoSuchGroupException e) {
|
return d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ResourceNotFoundException(id);
|
throw new ResourceNotFoundException(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GroupResource check(String id, GroupControl ctl)
|
|
||||||
throws ResourceNotFoundException {
|
|
||||||
if (ctl.isVisible()) {
|
|
||||||
return new GroupResource(ctl);
|
|
||||||
}
|
|
||||||
throw new ResourceNotFoundException(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public CreateGroup create(TopLevelResource root, IdString name) {
|
public CreateGroup create(TopLevelResource root, IdString name) {
|
||||||
|
|||||||
@@ -63,9 +63,7 @@ public class IncludedGroupsCollection implements
|
|||||||
throw new ResourceNotFoundException(id);
|
throw new ResourceNotFoundException(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupDescription.Basic member =
|
GroupDescription.Basic member = groupsCollection.get().parse(id.get());
|
||||||
groupsCollection.get().parse(id.get()).getGroup();
|
|
||||||
|
|
||||||
if (isMember(parent, member)
|
if (isMember(parent, member)
|
||||||
&& resource.getControl().canSeeGroup(member.getGroupUUID())) {
|
&& resource.getControl().canSeeGroup(member.getGroupUUID())) {
|
||||||
return new IncludedGroupResource(resource, member);
|
return new IncludedGroupResource(resource, member);
|
||||||
|
|||||||
Reference in New Issue
Block a user