aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2014-10-23 17:53:31 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2014-10-23 17:53:31 +0200
commit8e0036b88494eec45a570694e8a19d645eb6b7b9 (patch)
tree90a0006c275c273c0ef82e666dc133719457d1bf
parent2f18e4fff0cf5adb9ae5586d535814a6f4bef48f (diff)
downloadsonarqube-8e0036b88494eec45a570694e8a19d645eb6b7b9.tar.gz
sonarqube-8e0036b88494eec45a570694e8a19d645eb6b7b9.zip
SONAR-5753 Should not fail when updating permission on Views and Devs (as they have no uuid for the moment)
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java5
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java6
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java18
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java26
5 files changed, 59 insertions, 10 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java
index f03ec5a6cb4..49885ce2be8 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java
@@ -45,7 +45,10 @@ public class ComponentCleanerService implements ServerComponent {
throw new IllegalArgumentException("Only project can be deleted");
}
purgeDao.deleteResourceTree(project.getId());
- deletePermissionIndexes(session, project.uuid());
+ String uuid = project.uuid();
+ if (uuid != null) {
+ deletePermissionIndexes(session, uuid);
+ }
session.commit();
} finally {
session.close();
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
index a70778c3277..65efcd21924 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
@@ -49,11 +49,7 @@ public class SynchronizeProjectPermissionsStep implements AnalysisReportStep {
if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) {
// TODO Remove this db call by inserting the project uuid in the report
AuthorizedComponentDto project = dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session);
- String uuid = project.uuid();
- if (uuid == null) {
- throw new IllegalArgumentException(String.format("No uuid for project %s", project));
- }
- permissionService.synchronizePermissions(session, uuid);
+ permissionService.synchronizePermissions(session, project.uuid());
session.commit();
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java b/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java
index eda3b0b66af..4e300960ba7 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java
@@ -275,9 +275,15 @@ public class InternalPermissionService implements ServerComponent {
}
}
- public void synchronizePermissions(DbSession session, String projectUuid) {
- dbClient.issueAuthorizationDao().synchronizeAfter(session,
- index.get(IssueAuthorizationIndex.class).getLastSynchronization(),
- ImmutableMap.of(IssueAuthorizationDao.PROJECT_UUID, projectUuid));
+ public void synchronizePermissions(DbSession session, @Nullable String projectUuid) {
+ if (projectUuid != null) {
+ // Views and Dev Cockpit have no uuid, but it's not an problem because they are not existing in the issue authorization index, so there's nothing to remove
+ dbClient.issueAuthorizationDao().synchronizeAfter(session,
+ index.get(IssueAuthorizationIndex.class).getLastSynchronization(),
+ ImmutableMap.of(IssueAuthorizationDao.PROJECT_UUID, projectUuid));
+ } else {
+ // TODO Set this log in debug mode to not poluate the logs.
+ LOG.info("Try to synchronize issues permissions on a project without UUID, ignore");
+ }
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java
index 5b2f5fce325..4cee6b86da3 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceMediumTest.java
@@ -24,6 +24,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
+import org.sonar.api.resources.Qualifiers;
import org.sonar.api.security.DefaultGroups;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
@@ -90,6 +91,23 @@ public class ComponentCleanerServiceMediumTest {
assertThat(tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.uuid())).isNull();
}
+ @Test
+ public void not_fail_when_deleting_a_view() throws Exception {
+ ComponentDto project = ComponentTesting.newProjectDto()
+ .setQualifier(Qualifiers.VIEW)
+ .setUuid(null)
+ .setProjectUuid(null);
+ db.componentDao().insert(session, project);
+
+ // view can be seen by anyone
+ tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
+ db.issueAuthorizationDao().synchronizeAfter(session, new Date(0));
+
+ session.commit();
+
+ service.delete(project.getKey());
+ }
+
@Test(expected = IllegalArgumentException.class)
public void fail_to_delete_not_project() throws Exception {
ComponentDto project = ComponentTesting.newProjectDto();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java
index ed2c9496911..2e15f30a630 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/permission/InternalPermissionServiceMediumTest.java
@@ -25,6 +25,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
+import org.sonar.api.resources.Qualifiers;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.persistence.DbSession;
@@ -151,6 +152,31 @@ public class InternalPermissionServiceMediumTest {
assertThat(issueAuthorizationDoc).isNull();
}
+ @Test
+ public void add_component_user_permission_on_a_view() throws Exception {
+ ComponentDto view = ComponentTesting.newProjectDto()
+ .setKey("MASTER")
+ .setQualifier(Qualifiers.VIEW)
+ .setUuid(null)
+ .setProjectUuid(null);
+ db.componentDao().insert(session, view);
+ session.commit();
+
+ MockUserSession.set().setLogin("admin").addProjectPermissions(UserRole.ADMIN, view.key());
+
+ UserDto user = new UserDto().setLogin("john").setName("John");
+ db.userDao().insert(session, user);
+ session.commit();
+
+ assertThat(tester.get(RoleDao.class).selectUserPermissions(session, user.getLogin(), view.getId())).isEmpty();
+
+ service.addPermission(params(user.getLogin(), null, view.key(), UserRole.USER));
+ session.commit();
+
+ // Check in db
+ assertThat(tester.get(RoleDao.class).selectUserPermissions(session, user.getLogin(), view.getId())).hasSize(1);
+ }
+
private Map<String, Object> params(@Nullable String login, @Nullable String group, @Nullable String component, String permission) {
Map<String, Object> params = Maps.newHashMap();
params.put("user", login);