Fix Incorrect owner group matching behaviour for creating projects
This change fixes a critical bug that might add a wrong group as an owner of a project being created by ssh commands. Before this fix, when the --owner argument does not match any group, the commands tried to find a group whose name starts with the argument instead of throwing an error to notify the user. This behaviour seemed to be insecure and this fix prevents the commands to create the project and throws an error if the --owner argument is not valid, that is, if there is no exact match for the group name. In total, the ssh commands that are affected by this change are: CreateGroupCommand, CreateProjectCommand, ListGroupsCommand, and SetMembersCommand. Moreover, it makes more sense to use exactSuggestion instead of bestSuggestion for those commands as well. Bug: Issue 3655 Change-Id: Icec00651b4268a2b70799f1cba739db5248b04f5
This commit is contained in:
parent
81de6fcbe0
commit
fe1a9138fa
@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (C) 2015 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.acceptance.ssh;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static com.google.common.truth.Truth.assert_;
|
||||||
|
|
||||||
|
import com.google.gerrit.acceptance.AbstractDaemonTest;
|
||||||
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
|
import com.google.gerrit.server.project.ProjectState;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CreateProjectIT extends AbstractDaemonTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withValidGroupName() throws Exception {
|
||||||
|
String newGroupName = "newGroup";
|
||||||
|
adminSession.put("/groups/" + newGroupName);
|
||||||
|
String newProjectName = "newProject";
|
||||||
|
sshSession.exec("gerrit create-project --branch master --owner "
|
||||||
|
+ newGroupName + " " + newProjectName);
|
||||||
|
assert_().withFailureMessage(sshSession.getError())
|
||||||
|
.that(sshSession.hasError()).isFalse();
|
||||||
|
ProjectState projectState =
|
||||||
|
projectCache.get(new Project.NameKey(newProjectName));
|
||||||
|
assertThat(projectState).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withInvalidGroupName() throws Exception {
|
||||||
|
String newGroupName = "newGroup";
|
||||||
|
adminSession.put("/groups/" + newGroupName);
|
||||||
|
String wrongGroupName = "newG";
|
||||||
|
String newProjectName = "newProject";
|
||||||
|
sshSession.exec("gerrit create-project --branch master --owner "
|
||||||
|
+ wrongGroupName + " " + newProjectName);
|
||||||
|
assert_().withFailureMessage(sshSession.getError())
|
||||||
|
.that(sshSession.hasError()).isTrue();
|
||||||
|
ProjectState projectState =
|
||||||
|
projectCache.get(new Project.NameKey(newProjectName));
|
||||||
|
assertThat(projectState).isNull();
|
||||||
|
}
|
||||||
|
}
|
@ -43,7 +43,7 @@ public class AccountGroupUUIDHandler extends OptionHandler<AccountGroup.UUID> {
|
|||||||
public final int parseArguments(final Parameters params)
|
public final int parseArguments(final Parameters params)
|
||||||
throws CmdLineException {
|
throws CmdLineException {
|
||||||
final String n = params.getParameter(0);
|
final String n = params.getParameter(0);
|
||||||
final GroupReference group = GroupBackends.findBestSuggestion(groupBackend, n);
|
GroupReference group = GroupBackends.findExactSuggestion(groupBackend, n);
|
||||||
if (group == null) {
|
if (group == null) {
|
||||||
throw new CmdLineException(owner, "Group \"" + n + "\" does not exist");
|
throw new CmdLineException(owner, "Group \"" + n + "\" does not exist");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user