/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. */ package org.opensolaris.opengrok.web; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import javax.servlet.http.HttpServletRequest; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.opensolaris.opengrok.authorization.AuthControlFlag; import org.opensolaris.opengrok.authorization.AuthorizationFramework; import org.opensolaris.opengrok.authorization.AuthorizationStack; import org.opensolaris.opengrok.authorization.IAuthorizationPlugin; import org.opensolaris.opengrok.authorization.TestPlugin; import org.opensolaris.opengrok.configuration.Group; import org.opensolaris.opengrok.configuration.Project; import org.opensolaris.opengrok.configuration.RuntimeEnvironment; import org.opensolaris.opengrok.history.RepoRepository; import org.opensolaris.opengrok.history.RepositoryInfo; public class ProjectHelperTestBase { protected static String pluginDirectory; protected static AuthorizationStack stack; protected static Set<Group> groups; protected static Map<String,Project> projects; protected static List<RepositoryInfo> repositories; protected static RuntimeEnvironment env; protected static Map<Project, List<RepositoryInfo>> repositories_map; protected AuthorizationFramework instance; protected PageConfig cfg; protected ProjectHelper helper; protected static Project createRepository( int index, int number, int cnt, boolean grouped, boolean allowed, List<RepositoryInfo> rps, Map<String,Project> prjs, Map<Project, List<RepositoryInfo>> map) { Project p = createProject(index, number, grouped, allowed, true, rps, prjs, map); for (int i = 0; i < cnt; i++) { RepositoryInfo info = new RepoRepository(); info.setParent(p.getName() + "_" + i); info.setDirectoryName(p.getPath()); rps.add(info); List<RepositoryInfo> infos = map.get(p); if (infos == null) { infos = new ArrayList<>(); } infos.add(info); map.put(p, infos); } return p; } protected static Project createProject( int index, int number, boolean grouped, boolean allowed, boolean repository, List<RepositoryInfo> rps, Map<String,Project> prjs, Map<Project, List<RepositoryInfo>> map) { Project p = new Project( (allowed ? "allowed_" : "") + (grouped ? "grouped_" : "ungrouped_") + (repository ? "repository" : "project") + "_" + index + "_" + number); prjs.put(p.getName(), p); return p; } protected static void createGroups( int start, int cnt, boolean allowed, List<RepositoryInfo> rps, Map<Project, List<RepositoryInfo>> map, Map<String,Project> prjs, List<Group> grps) { for (int i = start; i < start + cnt; i++) { Group g = new Group(); g.setName((allowed ? "allowed_" : "") + "group_" + i); String pattern = ""; pattern += createProject(i, 1, true, false, false, rps, prjs, map).getName() + "|"; pattern += createProject(i, 2, true, false, false, rps, prjs, map).getName() + "|"; pattern += createProject(i, 1, true, true, false, rps, prjs, map).getName() + "|"; pattern += createProject(i, 2, true, true, false, rps, prjs, map).getName() + "|"; pattern += createRepository(i, 1, 1, true, false, rps, prjs, map).getName() + "|"; pattern += createRepository(i, 2, 1, true, false, rps, prjs, map).getName() + "|"; pattern += createRepository(i, 1, 1, true, true, rps, prjs, map).getName() + "|"; pattern += createRepository(i, 2, 1, true, true, rps, prjs, map).getName(); g.setPattern(pattern); grps.add(g); } } @SuppressWarnings("unchecked") protected static Map<Project, List<RepositoryInfo>> getRepositoriesMap() { try { Field field = RuntimeEnvironment.class.getDeclaredField("repository_map"); field.setAccessible(true); return (Map<Project, List<RepositoryInfo>>) field.get(RuntimeEnvironment.getInstance()); } catch (Throwable ex) { Assert.fail("invoking getRepositoriesMap should not throw an exception"); } return null; } protected static void setRepositoriesMap(Map<Project, List<RepositoryInfo>> map) { try { Field field = RuntimeEnvironment.class.getDeclaredField("repository_map"); field.setAccessible(true); field.set(RuntimeEnvironment.getInstance(), map); } catch (Throwable ex) { Assert.fail("invoking getRepositoriesMap should not throw an exception"); } } /** * The setup should create a structure like this. * * Group: allowed_group_2 * projects: * allowed_grouped_project_2_1,allowed_grouped_project_2_2, * grouped_project_2_1,grouped_project_2_2 * repositories: * allowed_grouped_repository_2_1,allowed_grouped_repository_2_2, * grouped_repository_2_1,grouped_repository_2_2 * * Group: allowed_group_3 * projects: * allowed_grouped_project_3_1,allowed_grouped_project_3_2, * grouped_project_3_1,grouped_project_3_2 * repositories: * allowed_grouped_repository_3_1,allowed_grouped_repository_3_2, * grouped_repository_3_1,grouped_repository_3_2 * * Group: group_0 * projects: * allowed_grouped_project_0_1,allowed_grouped_project_0_2, * grouped_project_0_1,grouped_project_0_2 * repositories: * allowed_grouped_repository_0_1,allowed_grouped_repository_0_2, * grouped_repository_0_1,grouped_repository_0_2 * * Group: group_1 * projects: * allowed_grouped_project_1_1,allowed_grouped_project_1_2, * grouped_project_1_1,grouped_project_1_2 * repositories: * allowed_grouped_repository_1_1,allowed_grouped_repository_1_2, * grouped_repository_1_1,grouped_repository_1_2 * * ungrouped projects: * ungrouped_project_0_1,ungrouped_project_1_1, * allowed_ungrouped_project_2_1, allowed_ungrouped_project_3_1 * * ungrouped repositories: * ungrouped_repository_0_1, ungrouped_repository_1_1, * allowed_ungrouped_repository_2_1, allowed_ungrouped_repository_3_1 * */ @BeforeClass public static void setUpClass() { env = RuntimeEnvironment.getInstance(); pluginDirectory = env.getPluginDirectory(); stack = env.getPluginStack(); groups = env.getGroups(); projects = env.getProjects(); repositories = env.getRepositories(); repositories_map = getRepositoriesMap(); env.setPluginDirectory(null); List<Group> grps = new ArrayList<>(); Map<String,Project> prjs = new HashMap<>(); List<RepositoryInfo> rps = new ArrayList<>(); Map<Project, List<RepositoryInfo>> map = new TreeMap<>(); createGroups(0, 2, false, rps, map, prjs, grps); createGroups(2, 2, true, rps, map, prjs, grps); for (int i = 0; i < 2; i++) { createProject(i, 1, false, false, false, rps, prjs, map); } for (int i = 0 + 2; i < 2 + 2; i++) { createProject(i, 1, false, true, false, rps, prjs, map); } for (int i = 0; i < 2; i++) { createRepository(i, 1, 1, false, false, rps, prjs, map); } for (int i = 0 + 2; i < 2 + 2; i++) { createRepository(i, 1, 1, false, true, rps, prjs, map); } setRepositoriesMap(map); env.setProjects(prjs); env.setGroups(new TreeSet<>(grps)); env.setRepositories(rps); env.register(); } @AfterClass public static void tearDownClass() { env.setPluginDirectory(pluginDirectory); env.setPluginStack(stack); setRepositoriesMap(repositories_map); env.setProjects(projects); env.setGroups(groups); env.setRepositories(repositories); env.register(); } protected void invokeRemoveAll() { AuthorizationFramework.getInstance().removeAll(AuthorizationFramework.getInstance().getStack()); AuthorizationFramework.getInstance().setStack(new AuthorizationStack(AuthControlFlag.REQUIRED, "default-stack")); } protected void invokeAddPlugin(IAuthorizationPlugin plugin) { AuthorizationFramework.getInstance().addPlugin(AuthorizationFramework.getInstance().getStack(), plugin); } protected AuthorizationFramework getInstance() { return AuthorizationFramework.getInstance(); } protected HttpServletRequest getRequest() { return new DummyHttpServletRequest() { }; } @Before public void setUp() { Assert.assertEquals("Should contain 4 groups", 4, env.getGroups().size()); Assert.assertEquals("Should contain 40 project", 40, env.getProjects().size()); Assert.assertEquals("Should contain 20 repositories", 20, env.getRepositories().size()); Assert.assertNotNull("Repository map should not be null", env.getProjectRepositoriesMap()); Assert.assertEquals("Repository map should contain 20 project", 20, env.getProjectRepositoriesMap().size()); invokeRemoveAll(); instance = getInstance(); IAuthorizationPlugin plugin = new TestPlugin() { @Override public boolean isAllowed(HttpServletRequest request, Project project) { return project.getName().startsWith("allowed"); } @Override public boolean isAllowed(HttpServletRequest request, Group group) { return group.getName().startsWith("allowed"); } }; invokeAddPlugin(plugin); cfg = PageConfig.get(getRequest()); helper = cfg.getProjectHelper(); } }