import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.web.UserRole;
-import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.util.stream.Collectors;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import static org.sonar.server.measure.ws.MeasuresWsParametersBuilder.createMetricKeysParameter;
import static org.sonar.server.measure.ws.MetricDtoToWsMetric.metricDtoToWsMetric;
import static org.sonar.server.measure.ws.SnapshotDtoToWsPeriods.snapshotToWsPeriods;
-import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonar.server.ws.WsUtils.checkRequest;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION_COMPONENT)
.setDescription(format("Return component with specified measures. The %s or the %s parameter must be provided.<br>" +
- "Requires one of the following permissions:" +
- "<ul>" +
- "<li>'Administer System'</li>" +
- "<li>'Administer' rights on the specified project</li>" +
- "<li>'Browse' on the specified project</li>" +
- "</ul>",
+ "Requires the following permission: 'Browse' on the project of specified component.",
PARAM_COMPONENT_ID, PARAM_COMPONENT_KEY))
.setResponseExample(getClass().getResource("component-example.json"))
.setSince("5.4")
private void checkPermissions(ComponentDto baseComponent) {
String projectUuid = firstNonNull(baseComponent.projectUuid(), baseComponent.uuid());
- if (!userSession.hasPermission(GlobalPermissions.SYSTEM_ADMIN) &&
- !userSession.hasComponentUuidPermission(UserRole.ADMIN, projectUuid) &&
- !userSession.hasComponentUuidPermission(UserRole.USER, projectUuid)) {
- throw insufficientPrivilegesException();
- }
+ userSession.checkComponentUuidPermission(UserRole.USER, projectUuid);
}
}
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION_COMPONENT_TREE)
.setDescription(format("Navigate through components based on the chosen strategy with specified measures. The %s or the %s parameter must be provided.<br>" +
- "Requires one of the following permissions:" +
- "<ul>" +
- " <li>'Administer System'</li>" +
- " <li>'Administer' rights on the specified project</li>" +
- " <li>'Browse' on the specified project</li>" +
- "</ul>" +
+ "Requires the following permission: 'Browse' on the specified project.<br>" +
"When limiting search with the %s parameter, directories are not returned.",
PARAM_BASE_COMPONENT_ID, PARAM_BASE_COMPONENT_KEY, Param.TEXT_QUERY))
.setResponseExample(getClass().getResource("component_tree-example.json"))
import static org.sonar.server.measure.ws.ComponentTreeAction.STRATEGIES;
import static org.sonar.server.measure.ws.ComponentTreeAction.WITH_MEASURES_ONLY_METRIC_SORT_FILTER;
import static org.sonar.server.measure.ws.SnapshotDtoToWsPeriods.snapshotToWsPeriods;
-import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
public class ComponentTreeDataLoader {
private static final Set<String> QUALIFIERS_ELIGIBLE_FOR_BEST_VALUE = newHashSet(Qualifiers.FILE, Qualifiers.UNIT_TEST_FILE);
private void checkPermissions(ComponentDto baseComponent) {
String projectUuid = firstNonNull(baseComponent.projectUuid(), baseComponent.uuid());
- if (!userSession.hasComponentUuidPermission(UserRole.ADMIN, projectUuid) &&
- !userSession.hasComponentUuidPermission(UserRole.USER, projectUuid)) {
- throw insufficientPrivilegesException();
- }
+ userSession.checkComponentUuidPermission(UserRole.USER, projectUuid);
}
private enum IsFileComponent implements Predicate<ComponentDto> {
.setInternal(true)
.setDescription("Search for project measures ordered by project names.<br>" +
"At most %d projects can be provided.<br>" +
- "Requires 'Browse' on the provided projects",
+ "Returns the projects with the 'Browse' permission.",
SearchRequest.MAX_NB_PROJECTS)
.setSince("6.2")
.setResponseExample(getClass().getResource("search-example.json"))
this.userSession = userSession;
}
+ private static SearchHistoryRequest toWsRequest(Request request) {
+ return SearchHistoryRequest.builder()
+ .setComponent(request.mandatoryParam(PARAM_COMPONENT))
+ .setMetrics(request.mandatoryParamAsStrings(PARAM_METRICS))
+ .setFrom(request.param(PARAM_FROM))
+ .setTo(request.param(PARAM_TO))
+ .setPage(request.mandatoryParamAsInt(Param.PAGE))
+ .setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE))
+ .build();
+ }
+
@Override
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION_SEARCH_HISTORY)
.setDescription("Search measures history of a component.<br>" +
"Measures are ordered chronologically.<br>" +
- "Pagination applies to the number of measures for each metric.")
+ "Pagination applies to the number of measures for each metric.<br>" +
+ "Requires the following permission: 'Browse' on the specified component")
.setResponseExample(getClass().getResource("search_history-example.json"))
.setSince("6.3")
.setHandler(this);
return metrics;
}
- private static SearchHistoryRequest toWsRequest(Request request) {
- return SearchHistoryRequest.builder()
- .setComponent(request.mandatoryParam(PARAM_COMPONENT))
- .setMetrics(request.mandatoryParamAsStrings(PARAM_METRICS))
- .setFrom(request.param(PARAM_FROM))
- .setTo(request.param(PARAM_TO))
- .setPage(request.mandatoryParamAsInt(Param.PAGE))
- .setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE))
- .build();
- }
-
}
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.api.utils.DateUtils.parseDateTime;
+import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN;
import static org.sonar.db.component.ComponentTesting.newDeveloper;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newProjectCopy;
@Before
public void setUp() {
- userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+ userSession.login().setRoot().setGlobalPermissions(SYSTEM_ADMIN);
}
@Test
@Test
public void provided_project() {
componentDb.insertComponent(newProjectDto(db.getDefaultOrganization(), PROJECT_UUID));
- userSession.anonymous().addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
+ userSession.addProjectUuidPermissions(UserRole.USER, PROJECT_UUID);
insertNclocMetric();
ComponentWsResponse response = newRequest(PROJECT_UUID, "ncloc");
@Test
public void fail_when_not_enough_permission() {
- userSession.setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
+ userSession.login().setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
componentDb.insertProjectAndSnapshot(newProjectDto(db.organizations().insert(), PROJECT_UUID));
insertNclocMetric();
@Before
public void setUp() {
- userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+ userSession.login().setRoot().setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
resourceTypes.setChildrenQualifiers(Qualifiers.MODULE, Qualifiers.FILE, Qualifiers.DIRECTORY);
resourceTypes.setLeavesQualifiers(Qualifiers.FILE, Qualifiers.UNIT_TEST_FILE);
}
.setPeriodMode(1, "last_version")
.setPeriodDate(3, System.currentTimeMillis())
.setPeriodMode(3, "last_analysis"));
- userSession.anonymous().addProjectUuidPermissions(UserRole.ADMIN, "project-uuid");
+ userSession.anonymous().addProjectUuidPermissions(UserRole.USER, "project-uuid");
ComponentDto directoryDto = newDirectory(projectDto, "directory-uuid", "path/to/directory").setName("directory-1");
componentDb.insertComponent(directoryDto);
ComponentDto file = newFileDto(directoryDto, null, "file-uuid").setName("file-1");
public void load_measures_with_best_value() {
ComponentDto projectDto = newProjectDto(db.getDefaultOrganization(), "project-uuid");
SnapshotDto projectSnapshot = componentDb.insertProjectAndSnapshot(projectDto);
- userSession.anonymous().addProjectUuidPermissions(UserRole.ADMIN, "project-uuid");
+ userSession.anonymous().addProjectUuidPermissions(UserRole.USER, "project-uuid");
ComponentDto directoryDto = newDirectory(projectDto, "directory-uuid", "path/to/directory").setName("directory-1");
componentDb.insertComponent(directoryDto);
ComponentDto file = newFileDto(directoryDto, null, "file-uuid").setName("file-1");
@Test
public void use_best_value_for_rating() {
- userSession.anonymous().addProjectUuidPermissions(UserRole.ADMIN, "project-uuid");
+ userSession.anonymous().addProjectUuidPermissions(UserRole.USER, "project-uuid");
ComponentDto projectDto = newProjectDto(db.getDefaultOrganization(), "project-uuid");
componentDb.insertComponent(projectDto);
SnapshotDto projectSnapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(projectDto)
assertThat(result.since()).isEqualTo("6.2");
assertThat(result.params()).hasSize(2);
assertThat(result.responseExampleAsString()).isNotEmpty();
- assertThat(result.description()).isEqualToIgnoringWhitespace("" +
- "Search for project measures ordered by project names.<br>" +
- "At most 100 projects can be provided.<br>" +
- "Requires 'Browse' on the provided projects");
}
private SearchWsResponse call(@Nullable List<String> keys, @Nullable List<String> metrics) {