]> source.dussan.org Git - sonarqube.git/commitdiff
Add support for Views in ApplyPermissionsStep
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 14 Sep 2015 13:02:34 +0000 (15:02 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 16 Sep 2015 09:00:08 +0000 (11:00 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/step/ApplyPermissionsStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/ApplyPermissionsStepTest.java

index 187c2f0ac778d7f265e37851de9608127536405a..0f56a3e1fd3af178fa3ad0d5629844616684ba09 100644 (file)
@@ -32,6 +32,8 @@ import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler;
 import org.sonar.server.computation.component.TreeRootHolder;
 import org.sonar.server.computation.component.TypeAwareVisitorAdapter;
 
+import static org.sonar.server.computation.component.Component.Type.PROJECT;
+import static org.sonar.server.computation.component.Component.Type.VIEW;
 import static org.sonar.server.computation.component.ComponentVisitor.Order.PRE_ORDER;
 
 /**
@@ -54,11 +56,16 @@ public class ApplyPermissionsStep implements ComputationStep {
   @Override
   public void execute() {
     new DepthTraversalTypeAwareCrawler(
-      new TypeAwareVisitorAdapter(CrawlerDepthLimit.PROJECT, PRE_ORDER) {
+      new TypeAwareVisitorAdapter(CrawlerDepthLimit.reportMaxDepth(PROJECT).withViewsMaxDepth(VIEW), PRE_ORDER) {
         @Override
         public void visitProject(Component project) {
           execute(project);
         }
+
+        @Override
+        public void visitView(Component view) {
+          execute(view);
+        }
       }).visit(treeRootHolder.getRoot());
   }
 
index c7433470457fcf9c02bbb88dfe68bc68b4921033..d84f34739028df633007b571395fe012a5e9e746 100644 (file)
@@ -38,18 +38,23 @@ import org.sonar.db.permission.PermissionTemplateDto;
 import org.sonar.db.user.GroupRoleDto;
 import org.sonar.server.computation.batch.TreeRootHolderRule;
 import org.sonar.server.computation.component.Component;
-import org.sonar.server.computation.component.DbIdsRepositoryImpl;
+import org.sonar.server.computation.component.MutableDbIdsRepositoryRule;
 import org.sonar.server.computation.component.ReportComponent;
+import org.sonar.server.computation.component.ViewsComponent;
 import org.sonar.test.DbTests;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.db.component.ComponentTesting.newView;
 import static org.sonar.db.permission.PermissionTemplateTesting.newPermissionTemplateDto;
+import static org.sonar.server.computation.component.Component.Type.PROJECT;
+import static org.sonar.server.computation.component.Component.Type.VIEW;
 
 @Category(DbTests.class)
 public class ApplyPermissionsStepTest extends BaseStepTest {
 
-  private static final String PROJECT_KEY = "PROJECT_KEY";
-  private static final String PROJECT_UUID = "PROJECT_UUID";
+  private static final String ROOT_KEY = "ROOT_KEY";
+  private static final String ROOT_UUID = "ROOT_UUID";
+  private static final long SOME_DATE = 1000L;
 
   @Rule
   public DbTester dbTester = DbTester.create(System2.INSTANCE);
@@ -57,14 +62,15 @@ public class ApplyPermissionsStepTest extends BaseStepTest {
   @Rule
   public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
 
+  @Rule
+  public MutableDbIdsRepositoryRule dbIdsRepository = MutableDbIdsRepositoryRule.create(treeRootHolder);
+
   DbSession dbSession;
 
   DbClient dbClient = dbTester.getDbClient();
 
   Settings settings;
 
-  DbIdsRepositoryImpl dbIdsRepository;
-
   ApplyPermissionsStep step;
 
   @Before
@@ -73,8 +79,6 @@ public class ApplyPermissionsStepTest extends BaseStepTest {
 
     settings = new Settings();
 
-    dbIdsRepository = new DbIdsRepositoryImpl();
-
     step = new ApplyPermissionsStep(dbClient, dbIdsRepository, new PermissionRepository(dbClient, settings), treeRootHolder);
   }
 
@@ -84,39 +88,34 @@ public class ApplyPermissionsStepTest extends BaseStepTest {
   }
 
   @Test
-  public void grant_permission() {
-    ComponentDto projectDto = ComponentTesting.newProjectDto(PROJECT_UUID).setKey(PROJECT_KEY);
+  public void grant_permission_for_report() {
+    ComponentDto projectDto = ComponentTesting.newProjectDto(ROOT_UUID).setKey(ROOT_KEY);
     dbClient.componentDao().insert(dbSession, projectDto);
 
     // Create a permission template containing browse permission for anonymous group
-    PermissionTemplateDto permissionTemplateDto = dbClient.permissionTemplateDao().insert(dbSession, newPermissionTemplateDto().setName("Default"));
-    settings.setProperty("sonar.permission.template.default", permissionTemplateDto.getKee());
-    dbClient.permissionTemplateDao().insertGroupPermission(permissionTemplateDto.getId(), null, UserRole.USER);
-    dbSession.commit();
+    createDefaultPermissionTemplate(UserRole.USER);
 
-    Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid(PROJECT_UUID).setKey(PROJECT_KEY).build();
+    Component project = ReportComponent.builder(PROJECT, 1).setUuid(ROOT_UUID).setKey(ROOT_KEY).build();
     dbIdsRepository.setComponentId(project, projectDto.getId());
     treeRootHolder.setRoot(project);
 
     step.execute();
     dbSession.commit();
 
-    assertThat(dbClient.componentDao().selectOrFailByKey(dbSession, PROJECT_KEY).getAuthorizationUpdatedAt()).isNotNull();
+    assertThat(dbClient.componentDao().selectOrFailByKey(dbSession, ROOT_KEY).getAuthorizationUpdatedAt()).isNotNull();
     assertThat(dbClient.roleDao().selectGroupPermissions(dbSession, DefaultGroups.ANYONE, projectDto.getId())).containsOnly(UserRole.USER);
   }
 
   @Test
-  public void nothing_to_do() {
-    long authorizationUpdatedAt = 1000L;
-
-    ComponentDto projectDto = ComponentTesting.newProjectDto(PROJECT_UUID).setKey(PROJECT_KEY).setAuthorizationUpdatedAt(authorizationUpdatedAt);
+  public void nothing_to_do_for_report() {
+    ComponentDto projectDto = ComponentTesting.newProjectDto(ROOT_UUID).setKey(ROOT_KEY).setAuthorizationUpdatedAt(SOME_DATE);
     dbClient.componentDao().insert(dbSession, projectDto);
     // Permissions are already set on the project
     dbClient.roleDao().insertGroupRole(dbSession, new GroupRoleDto().setRole(UserRole.USER).setGroupId(null).setResourceId(projectDto.getId()));
 
     dbSession.commit();
 
-    Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid(PROJECT_UUID).setKey(PROJECT_KEY).build();
+    Component project = ReportComponent.builder(PROJECT, 1).setUuid(ROOT_UUID).setKey(ROOT_KEY).build();
     dbIdsRepository.setComponentId(project, projectDto.getId());
     treeRootHolder.setRoot(project);
 
@@ -124,7 +123,54 @@ public class ApplyPermissionsStepTest extends BaseStepTest {
     dbSession.commit();
 
     // Check that authorization updated at has not been changed -> Nothing has been done
-    assertThat(projectDto.getAuthorizationUpdatedAt()).isEqualTo(authorizationUpdatedAt);
+    assertThat(projectDto.getAuthorizationUpdatedAt()).isEqualTo(SOME_DATE);
+  }
+
+  @Test
+  public void grant_permission_for_view() {
+    ComponentDto viewDto = newView(ROOT_UUID).setKey(ROOT_KEY);
+    dbClient.componentDao().insert(dbSession, viewDto);
+
+    String permission = UserRole.USER;
+    // Create a permission template containing browse permission for anonymous group
+    createDefaultPermissionTemplate(permission);
+
+    Component project = ViewsComponent.builder(VIEW, ROOT_KEY).setUuid(ROOT_UUID).build();
+    dbIdsRepository.setComponentId(project, viewDto.getId());
+    treeRootHolder.setRoot(project);
+
+    step.execute();
+    dbSession.commit();
+
+    assertThat(dbClient.componentDao().selectOrFailByKey(dbSession, ROOT_KEY).getAuthorizationUpdatedAt()).isNotNull();
+    assertThat(dbClient.roleDao().selectGroupPermissions(dbSession, DefaultGroups.ANYONE, viewDto.getId())).containsOnly(permission);
+  }
+
+  @Test
+  public void nothing_to_do_for_view() {
+    ComponentDto viewDto = newView(ROOT_UUID).setKey(ROOT_KEY).setAuthorizationUpdatedAt(SOME_DATE);
+    dbClient.componentDao().insert(dbSession, viewDto);
+    // Permissions are already set on the view
+    dbClient.roleDao().insertGroupRole(dbSession, new GroupRoleDto().setRole(UserRole.USER).setGroupId(null).setResourceId(viewDto.getId()));
+
+    dbSession.commit();
+
+    Component project = ReportComponent.builder(PROJECT, 1).setUuid(ROOT_UUID).setKey(ROOT_KEY).build();
+    dbIdsRepository.setComponentId(project, viewDto.getId());
+    treeRootHolder.setRoot(project);
+
+    step.execute();
+    dbSession.commit();
+
+    // Check that authorization updated at has not been changed -> Nothing has been done
+    assertThat(viewDto.getAuthorizationUpdatedAt()).isEqualTo(SOME_DATE);
+  }
+
+  private void createDefaultPermissionTemplate(String permission) {
+    PermissionTemplateDto permissionTemplateDto = dbClient.permissionTemplateDao().insert(dbSession, newPermissionTemplateDto().setName("Default"));
+    settings.setProperty("sonar.permission.template.default", permissionTemplateDto.getKee());
+    dbClient.permissionTemplateDao().insertGroupPermission(permissionTemplateDto.getId(), null, permission);
+    dbSession.commit();
   }
 
   @Override