blob: 2ccbcda1624fb3bf3a5e733c268a1de313b4e3ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.ambari.server.controller.internal;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import org.apache.ambari.server.actionmanager.ActionDBAccessor;
import org.apache.ambari.server.actionmanager.ActionManager;
import org.apache.ambari.server.actionmanager.StageFactory;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.AbstractRootServiceResponseFactory;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
import org.apache.ambari.server.controller.KerberosHelper;
import org.apache.ambari.server.controller.spi.ClusterController;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.spi.SystemException;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.dao.PermissionDAO;
import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
import org.apache.ambari.server.orm.dao.UserDAO;
import org.apache.ambari.server.orm.entities.PermissionEntity;
import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
import org.apache.ambari.server.orm.entities.RoleAuthorizationEntity;
import org.apache.ambari.server.scheduler.ExecutionScheduler;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.authorization.AuthorizationException;
import org.apache.ambari.server.security.authorization.Users;
import org.apache.ambari.server.security.encryption.CredentialStoreService;
import org.apache.ambari.server.security.encryption.CredentialStoreServiceImpl;
import org.apache.ambari.server.stack.StackManagerFactory;
import org.apache.ambari.server.stageplanner.RoleGraphFactory;
import org.apache.ambari.server.stageplanner.RoleGraphFactoryImpl;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.ConfigFactory;
import org.apache.ambari.server.state.ServiceComponentFactory;
import org.apache.ambari.server.state.ServiceComponentHostFactory;
import org.apache.ambari.server.state.ServiceFactory;
import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
import org.apache.ambari.server.state.stack.OsFamily;
import org.easymock.EasyMockSupport;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import javax.persistence.EntityManager;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import static org.easymock.EasyMock.*;
/**
* UserAuthorizationResourceProvider tests.
*/
public class UserAuthorizationResourceProviderTest extends EasyMockSupport {
@Before
public void setup() throws Exception {
resetAll();
}
@After
public void cleanup() {
SecurityContextHolder.getContext().setAuthentication(null);
}
@Test
public void testGetResources_Administrator() throws Exception {
getResourcesTest(TestAuthenticationFactory.createAdministrator("admin"), "User1");
}
@Test
public void testGetResources_NonAdministrator_Self() throws Exception {
getResourcesTest(TestAuthenticationFactory.createClusterAdministrator("User1", 2L), "User1");
}
@Test(expected = AuthorizationException.class)
public void testGetResources_NonAdministrator_Other() throws Exception {
getResourcesTest(TestAuthenticationFactory.createClusterAdministrator("User1", 2L), "User10");
}
@Test(expected = SystemException.class)
public void testCreateResources() throws Exception {
Injector injector = createInjector();
replayAll();
// Set the authenticated user to a non-administrator
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createClusterAdministrator("user1", 2L));
AmbariManagementController managementController = injector.getInstance(AmbariManagementController.class);
UserAuthorizationResourceProvider provider = new UserAuthorizationResourceProvider(managementController);
provider.createResources(createNiceMock(Request.class));
verifyAll();
}
@Test(expected = SystemException.class)
public void testUpdateResources() throws Exception {
Injector injector = createInjector();
replayAll();
// Set the authenticated user to a non-administrator
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createClusterAdministrator("user1", 2L));
AmbariManagementController managementController = injector.getInstance(AmbariManagementController.class);
UserAuthorizationResourceProvider provider = new UserAuthorizationResourceProvider(managementController);
provider.updateResources(createNiceMock(Request.class), null);
verifyAll();
}
@Test(expected = SystemException.class)
public void testDeleteResources() throws Exception {
Injector injector = createInjector();
replayAll();
// Set the authenticated user to a non-administrator
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createClusterAdministrator("user1", 2L));
AmbariManagementController managementController = injector.getInstance(AmbariManagementController.class);
UserAuthorizationResourceProvider provider = new UserAuthorizationResourceProvider(managementController);
provider.deleteResources(createNiceMock(Request.class), null);
verifyAll();
}
private void getResourcesTest(Authentication authentication, String requestedUsername) throws Exception {
Injector injector = createInjector();
Resource clusterResource = createMock(Resource.class);
expect(clusterResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_PERMISSION_NAME_PROPERTY_ID))
.andReturn("CLUSTER.DO_SOMETHING")
.anyTimes();
expect(clusterResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_TYPE_PROPERTY_ID))
.andReturn("CLUSTER")
.anyTimes();
expect(clusterResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_CLUSTER_NAME_PROPERTY_ID))
.andReturn("Cluster Name")
.anyTimes();
Resource viewResource = createMock(Resource.class);
expect(viewResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_PERMISSION_NAME_PROPERTY_ID))
.andReturn("VIEW.DO_SOMETHING")
.anyTimes();
expect(viewResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_TYPE_PROPERTY_ID))
.andReturn("VIEW")
.anyTimes();
expect(viewResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_VIEW_NAME_PROPERTY_ID))
.andReturn("View Name")
.anyTimes();
expect(viewResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_VIEW_VERSION_PROPERTY_ID))
.andReturn("View Version")
.anyTimes();
expect(viewResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_INSTANCE_NAME_PROPERTY_ID))
.andReturn("View Instance Name")
.anyTimes();
Resource adminResource = createMock(Resource.class);
expect(adminResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_PERMISSION_NAME_PROPERTY_ID))
.andReturn("ADMIN.DO_SOMETHING")
.anyTimes();
expect(adminResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_TYPE_PROPERTY_ID))
.andReturn("ADMIN")
.anyTimes();
expect(adminResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_CLUSTER_NAME_PROPERTY_ID))
.andReturn(null)
.anyTimes();
Resource emptyResource = createMock(Resource.class);
expect(emptyResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_PERMISSION_NAME_PROPERTY_ID))
.andReturn("EMPTY.DO_SOMETHING")
.anyTimes();
expect(emptyResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_TYPE_PROPERTY_ID))
.andReturn("ADMIN")
.anyTimes();
expect(emptyResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_CLUSTER_NAME_PROPERTY_ID))
.andReturn(null)
.anyTimes();
Resource nullResource = createMock(Resource.class);
expect(nullResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_PERMISSION_NAME_PROPERTY_ID))
.andReturn("NULL.DO_SOMETHING")
.anyTimes();
expect(nullResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_TYPE_PROPERTY_ID))
.andReturn("ADMIN")
.anyTimes();
expect(nullResource.getPropertyValue(UserPrivilegeResourceProvider.PRIVILEGE_CLUSTER_NAME_PROPERTY_ID))
.andReturn(null)
.anyTimes();
Set<Resource> userPrivilegeResources = new HashSet<Resource>();
userPrivilegeResources.add(clusterResource);
userPrivilegeResources.add(viewResource);
userPrivilegeResources.add(adminResource);
userPrivilegeResources.add(emptyResource);
userPrivilegeResources.add(nullResource);
ResourceProvider userPrivilegeProvider = createMock(ResourceProvider.class);
expect(userPrivilegeProvider.getResources(anyObject(Request.class), anyObject(Predicate.class)))
.andReturn(userPrivilegeResources);
ClusterController clusterController = createMock(ClusterController.class);
expect(clusterController.ensureResourceProvider(Resource.Type.UserPrivilege))
.andReturn(userPrivilegeProvider)
.anyTimes();
ResourceTypeEntity clusterResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(clusterResourceTypeEntity.getId()).andReturn(1).anyTimes();
ResourceTypeEntity viewResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(viewResourceTypeEntity.getId()).andReturn(2).anyTimes();
ResourceTypeEntity adminResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(adminResourceTypeEntity.getId()).andReturn(3).anyTimes();
ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
expect(resourceTypeDAO.findByName("CLUSTER")).andReturn(clusterResourceTypeEntity).anyTimes();
expect(resourceTypeDAO.findByName("VIEW")).andReturn(viewResourceTypeEntity).anyTimes();
expect(resourceTypeDAO.findByName("ADMIN")).andReturn(adminResourceTypeEntity).anyTimes();
RoleAuthorizationEntity clusterRoleAuthorizationEntity = createMock(RoleAuthorizationEntity.class);
expect(clusterRoleAuthorizationEntity.getAuthorizationId()).andReturn("CLUSTER.DO_SOMETHING").anyTimes();
expect(clusterRoleAuthorizationEntity.getAuthorizationName()).andReturn("CLUSTER DO_SOMETHING").anyTimes();
RoleAuthorizationEntity viewRoleAuthorizationEntity = createMock(RoleAuthorizationEntity.class);
expect(viewRoleAuthorizationEntity.getAuthorizationId()).andReturn("VIEW.DO_SOMETHING").anyTimes();
expect(viewRoleAuthorizationEntity.getAuthorizationName()).andReturn("VIEW DO_SOMETHING").anyTimes();
RoleAuthorizationEntity adminRoleAuthorizationEntity = createMock(RoleAuthorizationEntity.class);
expect(adminRoleAuthorizationEntity.getAuthorizationId()).andReturn("ADMIN.DO_SOMETHING").anyTimes();
expect(adminRoleAuthorizationEntity.getAuthorizationName()).andReturn("ADMIN DO_SOMETHING").anyTimes();
Collection<RoleAuthorizationEntity> clusterPermissionAuthorizations = Collections.singleton(clusterRoleAuthorizationEntity);
Collection<RoleAuthorizationEntity> viewPermissionAuthorizations = Collections.singleton(viewRoleAuthorizationEntity);
Collection<RoleAuthorizationEntity> adminPermissionAuthorizations = Collections.singleton(adminRoleAuthorizationEntity);
PermissionEntity clusterPermissionEntity = createMock(PermissionEntity.class);
expect(clusterPermissionEntity.getAuthorizations())
.andReturn(clusterPermissionAuthorizations)
.anyTimes();
PermissionEntity viewPermissionEntity = createMock(PermissionEntity.class);
expect(viewPermissionEntity.getAuthorizations())
.andReturn(viewPermissionAuthorizations)
.anyTimes();
PermissionEntity adminPermissionEntity = createMock(PermissionEntity.class);
expect(adminPermissionEntity.getAuthorizations())
.andReturn(adminPermissionAuthorizations)
.anyTimes();
PermissionEntity emptyPermissionEntity = createMock(PermissionEntity.class);
expect(emptyPermissionEntity.getAuthorizations())
.andReturn(Collections.<RoleAuthorizationEntity>emptyList())
.anyTimes();
PermissionEntity nullPermissionEntity = createMock(PermissionEntity.class);
expect(nullPermissionEntity.getAuthorizations())
.andReturn(null)
.anyTimes();
PermissionDAO permissionDAO = injector.getInstance(PermissionDAO.class);
expect(permissionDAO.findPermissionByNameAndType("CLUSTER.DO_SOMETHING", clusterResourceTypeEntity))
.andReturn(clusterPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("VIEW.DO_SOMETHING", viewResourceTypeEntity))
.andReturn(viewPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("ADMIN.DO_SOMETHING", adminResourceTypeEntity))
.andReturn(adminPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("EMPTY.DO_SOMETHING", adminResourceTypeEntity))
.andReturn(emptyPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("NULL.DO_SOMETHING", adminResourceTypeEntity))
.andReturn(nullPermissionEntity)
.anyTimes();
replayAll();
AmbariMetaInfo ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
ambariMetaInfo.init();
// Set the authenticated user to a administrator
SecurityContextHolder.getContext().setAuthentication(authentication);
AmbariManagementController managementController = injector.getInstance(AmbariManagementController.class);
UserAuthorizationResourceProvider.init(permissionDAO, resourceTypeDAO);
UserAuthorizationResourceProvider provider = new UserAuthorizationResourceProvider(managementController);
setClusterController(provider, clusterController);
Predicate predicate = new PredicateBuilder()
.property(UserAuthorizationResourceProvider.USERNAME_PROPERTY_ID).equals(requestedUsername)
.toPredicate();
Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
Assert.assertEquals(3, resources.size());
LinkedList<String> expectedIds = new LinkedList<String>();
expectedIds.add("CLUSTER.DO_SOMETHING");
expectedIds.add("VIEW.DO_SOMETHING");
expectedIds.add("ADMIN.DO_SOMETHING");
for (Resource resource : resources) {
String authorizationId = (String) resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_ID_PROPERTY_ID);
switch (authorizationId) {
case "CLUSTER.DO_SOMETHING":
Assert.assertEquals("CLUSTER DO_SOMETHING", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_NAME_PROPERTY_ID));
Assert.assertEquals("CLUSTER", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_RESOURCE_TYPE_PROPERTY_ID));
Assert.assertEquals("Cluster Name", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_CLUSTER_NAME_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_NAME_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_VERSION_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_INSTANCE_NAME_PROPERTY_ID));
break;
case "VIEW.DO_SOMETHING":
Assert.assertEquals("VIEW DO_SOMETHING", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_NAME_PROPERTY_ID));
Assert.assertEquals("VIEW", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_RESOURCE_TYPE_PROPERTY_ID));
Assert.assertEquals("View Name", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_NAME_PROPERTY_ID));
Assert.assertEquals("View Version", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_VERSION_PROPERTY_ID));
Assert.assertEquals("View Instance Name", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_INSTANCE_NAME_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_CLUSTER_NAME_PROPERTY_ID));
break;
case "ADMIN.DO_SOMETHING":
Assert.assertEquals("ADMIN DO_SOMETHING", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_NAME_PROPERTY_ID));
Assert.assertEquals("ADMIN", resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_RESOURCE_TYPE_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_CLUSTER_NAME_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_NAME_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_VERSION_PROPERTY_ID));
Assert.assertNull(resource.getPropertyValue(UserAuthorizationResourceProvider.AUTHORIZATION_VIEW_INSTANCE_NAME_PROPERTY_ID));
break;
}
expectedIds.remove();
}
Assert.assertEquals(0, expectedIds.size());
verifyAll();
}
private void setClusterController(UserAuthorizationResourceProvider provider, ClusterController clusterController) throws Exception {
Class<?> c = provider.getClass();
Field f = c.getDeclaredField("clusterController");
f.setAccessible(true);
f.set(provider, clusterController);
}
private Injector createInjector() throws Exception {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
bind(ActionDBAccessor.class).toInstance(createNiceMock(ActionDBAccessor.class));
bind(ExecutionScheduler.class).toInstance(createNiceMock(ExecutionScheduler.class));
bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
bind(AmbariMetaInfo.class).toInstance(createMock(AmbariMetaInfo.class));
bind(ActionManager.class).toInstance(createNiceMock(ActionManager.class));
bind(org.apache.ambari.server.actionmanager.RequestFactory.class).toInstance(createNiceMock(org.apache.ambari.server.actionmanager.RequestFactory.class));
bind(RequestExecutionFactory.class).toInstance(createNiceMock(RequestExecutionFactory.class));
bind(StageFactory.class).toInstance(createNiceMock(StageFactory.class));
bind(RoleGraphFactory.class).to(RoleGraphFactoryImpl.class);
bind(Clusters.class).toInstance(createNiceMock(Clusters.class));
bind(AbstractRootServiceResponseFactory.class).toInstance(createNiceMock(AbstractRootServiceResponseFactory.class));
bind(StackManagerFactory.class).toInstance(createNiceMock(StackManagerFactory.class));
bind(ConfigFactory.class).toInstance(createNiceMock(ConfigFactory.class));
bind(ConfigGroupFactory.class).toInstance(createNiceMock(ConfigGroupFactory.class));
bind(ServiceFactory.class).toInstance(createNiceMock(ServiceFactory.class));
bind(ServiceComponentFactory.class).toInstance(createNiceMock(ServiceComponentFactory.class));
bind(ServiceComponentHostFactory.class).toInstance(createNiceMock(ServiceComponentHostFactory.class));
bind(PasswordEncoder.class).toInstance(createNiceMock(PasswordEncoder.class));
bind(KerberosHelper.class).toInstance(createNiceMock(KerberosHelper.class));
bind(Users.class).toInstance(createMock(Users.class));
bind(AmbariManagementController.class).to(AmbariManagementControllerImpl.class);
bind(CredentialStoreService.class).to(CredentialStoreServiceImpl.class);
bind(UserDAO.class).toInstance(createMock(UserDAO.class));
bind(ResourceTypeDAO.class).toInstance(createMock(ResourceTypeDAO.class));
bind(PermissionDAO.class).toInstance(createMock(PermissionDAO.class));
}
});
}
}