diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-10-23 17:53:31 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-10-23 17:53:31 +0200 |
commit | 8e0036b88494eec45a570694e8a19d645eb6b7b9 (patch) | |
tree | 90a0006c275c273c0ef82e666dc133719457d1bf | |
parent | 2f18e4fff0cf5adb9ae5586d535814a6f4bef48f (diff) | |
download | sonarqube-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)
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); |