/**
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.uberfire.backend.server.authz;
import java.net.URI;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
import javax.enterprise.event.Event;
import org.jboss.errai.security.shared.api.Role;
import org.jboss.errai.security.shared.api.RoleImpl;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.authz.AuthorizationPolicyStorage;
import org.uberfire.backend.events.AuthorizationPolicyDeployedEvent;
import org.uberfire.backend.server.WebAppSettings;
import org.uberfire.backend.server.security.RoleRegistry;
import org.uberfire.security.authz.AuthorizationPolicy;
import org.uberfire.security.authz.AuthorizationResult;
import org.uberfire.security.authz.Permission;
import org.uberfire.security.authz.PermissionCollection;
import org.uberfire.security.authz.PermissionManager;
import org.uberfire.security.authz.PermissionTypeRegistry;
import org.uberfire.security.impl.authz.DefaultPermissionManager;
import org.uberfire.security.impl.authz.DefaultPermissionTypeRegistry;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class AuthzPolicyDeployerTest {
@Mock
AuthorizationPolicyStorage storage;
@Mock
Event<AuthorizationPolicyDeployedEvent> event;
AuthorizationPolicyDeployer deployer;
PermissionManager permissionManager;
@Before
public void setUp() {
PermissionTypeRegistry permissionTypeRegistry = new DefaultPermissionTypeRegistry();
permissionManager = spy(new DefaultPermissionManager(permissionTypeRegistry));
deployer = new AuthorizationPolicyDeployer(storage,
permissionManager,
event);
RoleRegistry.get().clear();
}
@Test
public void testPolicyDir() throws Exception {
WebAppSettings.get().setRootDir("/test");
Path path = deployer.getPolicyDir();
Path expected = Paths.get(URI.create("file:///test/WEB-INF/classes"));
assertEquals(path,
expected);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidPolicy() throws Exception {
testPolicyLoad("WEB-INF/classes/invalid/security-policy.properties");
}
@Test
public void testPolicyLoad() throws Exception {
testPolicyLoad("WEB-INF/classes/security-policy.properties");
}
@Test
public void testPolicyLoad2() throws Exception {
testPolicyLoad("WEB-INF/classes/split/security-policy.properties");
}
public void testPolicyLoad(String path) throws Exception {
URL fileURL = Thread.currentThread().getContextClassLoader().getResource(path);
Path policyDir = Paths.get(fileURL.toURI()).getParent();
assertTrue(RoleRegistry.get().getRegisteredRoles().isEmpty());
deployer.deployPolicy(policyDir);
ArgumentCaptor<AuthorizationPolicy> policyCaptor = ArgumentCaptor.forClass(AuthorizationPolicy.class);
verify(storage).loadPolicy();
verify(storage).savePolicy(policyCaptor.capture());
verify(event).fire(any());
AuthorizationPolicy policy = policyCaptor.getValue();
verify(permissionManager).setAuthorizationPolicy(policy);
assertEquals(RoleRegistry.get().getRegisteredRoles().size(),
3);
Set<Role> roles = policy.getRoles();
assertEquals(roles.size(),
3);
Role adminRole = new RoleImpl("admin");
PermissionCollection permissions = policy.getPermissions(adminRole);
assertTrue(roles.contains(adminRole));
assertEquals(policy.getRoleDescription(adminRole),
"Administrator");
assertEquals(policy.getPriority(adminRole),
1);
assertEquals(permissions.collection().size(),
3);
Permission permission = permissions.get("perspective.read");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_GRANTED);
permission = permissions.get("perspective.read.SimplePerspective");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_DENIED);
Role userRole = new RoleImpl("user");
permissions = policy.getPermissions(userRole);
assertTrue(roles.contains(userRole));
assertEquals(policy.getRoleDescription(userRole),
"End user");
assertEquals(policy.getPriority(userRole),
2);
assertEquals(permissions.collection().size(),
4);
permission = permissions.get("perspective.read");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_DENIED);
permission = permissions.get("perspective.read.HomePerspective");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_GRANTED);
permission = permissions.get("perspective.read.SimplePerspective");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_GRANTED);
Role managerRole = new RoleImpl("manager");
permissions = policy.getPermissions(managerRole);
assertTrue(roles.contains(managerRole));
assertEquals(policy.getRoleDescription(managerRole),
"Manager");
assertEquals(policy.getPriority(managerRole),
3);
assertEquals(permissions.collection().size(),
3);
permission = permissions.get("perspective.read");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_GRANTED);
permission = permissions.get("repository.read.git://repo1");
assertNotNull(permission);
assertEquals(permission.getResult(),
AuthorizationResult.ACCESS_GRANTED);
}
@Test
public void testNothingToDeploy() throws Exception {
deployer.deployPolicy(null);
verify(storage,
never()).loadPolicy();
verify(storage,
never()).savePolicy(any());
}
@Test
public void testAlreadyDeployed() throws Exception {
when(storage.loadPolicy()).thenReturn(mock(AuthorizationPolicy.class));
deployer.deployPolicy(Paths.get(""));
verify(storage).loadPolicy();
verify(storage,
never()).savePolicy(any());
}
}