| /* |
| * Copyright (c) 2013, 2015 Eike Stepper (Berlin, Germany) and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Esteban Dugueperoux - initial API and implementation |
| */ |
| package org.eclipse.emf.cdo.tests.bugzilla; |
| |
| import org.eclipse.emf.cdo.CDOState; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.eresource.EresourcePackage; |
| import org.eclipse.emf.cdo.security.Access; |
| import org.eclipse.emf.cdo.security.FilterPermission; |
| import org.eclipse.emf.cdo.security.Realm; |
| import org.eclipse.emf.cdo.security.Role; |
| import org.eclipse.emf.cdo.security.SecurityFactory; |
| import org.eclipse.emf.cdo.security.User; |
| import org.eclipse.emf.cdo.server.security.ISecurityManager; |
| import org.eclipse.emf.cdo.server.security.SecurityManagerUtil; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.tests.AbstractCDOTest; |
| import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesAfter; |
| import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesBefore; |
| import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig; |
| import org.eclipse.emf.cdo.tests.model1.Category; |
| import org.eclipse.emf.cdo.tests.model1.Company; |
| import org.eclipse.emf.cdo.tests.model1.Product1; |
| import org.eclipse.emf.cdo.transaction.CDOTransaction; |
| import org.eclipse.emf.cdo.util.CDOUtil; |
| |
| import org.eclipse.net4j.util.security.IPasswordCredentials; |
| import org.eclipse.net4j.util.security.PasswordCredentials; |
| |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| |
| import java.util.Collections; |
| |
| /** |
| * Bug 422170 - [Security] NPE on Permissions update for detached objects. |
| * |
| * @author Esteban Dugueperoux |
| */ |
| @CleanRepositoriesBefore(reason = "TEST_SECURITY_MANAGER") |
| @CleanRepositoriesAfter(reason = "TEST_SECURITY_MANAGER") |
| public class Bugzilla_422170_Test extends AbstractCDOTest |
| { |
| private static final String SHARED_RESOURCE_NAME = "sharedResource.model1"; |
| |
| private static final String RENAMED_SHARED_RESOURCE_NAME = "sharedResourceRenamed.model1"; |
| |
| private static final IPasswordCredentials USER_1_CREDENTIALS = new PasswordCredentials("user1", "12345"); |
| |
| private static final IPasswordCredentials USER_2_CREDENTIALS = new PasswordCredentials("user2", "54321"); |
| |
| @Override |
| public void setUp() throws Exception |
| { |
| super.setUp(); |
| |
| ISecurityManager securityManager = SecurityManagerUtil.createSecurityManager("/security", getServerContainer()); |
| |
| // Start repository |
| getTestProperties().put(RepositoryConfig.PROP_TEST_SECURITY_MANAGER, securityManager); |
| getRepository(); |
| |
| ISecurityManager.RealmOperation realmOperation = new ISecurityManager.RealmOperation() |
| { |
| public void execute(Realm realm) |
| { |
| User user1 = realm.addUser(USER_1_CREDENTIALS); |
| user1.setDefaultAccessOverride(Access.READ); |
| Role user1Role = realm.addRole("user1Role"); |
| FilterPermission filterPermission = SecurityFactory.eINSTANCE.createFilterPermission(Access.WRITE, |
| SecurityFactory.eINSTANCE.createOrFilter(SecurityFactory.eINSTANCE.createPackageFilter(getModel1Package()), |
| SecurityFactory.eINSTANCE.createPackageFilter(EresourcePackage.eINSTANCE), |
| SecurityFactory.eINSTANCE.createResourceFilter(getResourcePath(SHARED_RESOURCE_NAME)), |
| SecurityFactory.eINSTANCE.createResourceFilter(getResourcePath(RENAMED_SHARED_RESOURCE_NAME)))); |
| user1Role.getPermissions().add(filterPermission); |
| user1.getRoles().add(user1Role); |
| |
| User user2 = realm.addUser(USER_2_CREDENTIALS); |
| user2.setDefaultAccessOverride(Access.READ); |
| Role user2Role = realm.addRole("user2Role"); |
| filterPermission = SecurityFactory.eINSTANCE.createFilterPermission(Access.WRITE, |
| SecurityFactory.eINSTANCE.createOrFilter(SecurityFactory.eINSTANCE.createPackageFilter(getModel1Package()), |
| SecurityFactory.eINSTANCE.createPackageFilter(EresourcePackage.eINSTANCE), |
| SecurityFactory.eINSTANCE.createResourceFilter(getResourcePath(SHARED_RESOURCE_NAME)), |
| SecurityFactory.eINSTANCE.createResourceFilter(getResourcePath(RENAMED_SHARED_RESOURCE_NAME)))); |
| user2Role.getPermissions().add(filterPermission); |
| user2.getRoles().add(user2Role); |
| } |
| }; |
| |
| securityManager.modify(realmOperation); |
| } |
| |
| public void testPermissionsWithDetachedObject() throws Exception |
| { |
| Company obeoCompany = getModel1Factory().createCompany(); |
| Category productsCategory = getModel1Factory().createCategory(); |
| obeoCompany.getCategories().add(productsCategory); |
| Product1 smartEAProduct = getModel1Factory().createProduct1(); |
| productsCategory.getProducts().add(smartEAProduct); |
| |
| CDOSession session1 = openSession(USER_1_CREDENTIALS); |
| CDOTransaction transaction1 = session1.openTransaction(); |
| CDOResource sharedResourceForUser1 = transaction1.createResource(getResourcePath(SHARED_RESOURCE_NAME)); |
| sharedResourceForUser1.getContents().add(obeoCompany); |
| sharedResourceForUser1.save(Collections.emptyMap()); |
| |
| CDOSession session2 = openSession(USER_2_CREDENTIALS); |
| CDOTransaction transaction2 = session2.openTransaction(); |
| CDOResource sharedResourceForUser2 = transaction2.getResource(getResourcePath(SHARED_RESOURCE_NAME)); |
| Company obeoCompanyForUser2 = (Company)sharedResourceForUser2.getContents().get(0); |
| Category categoryForUser2 = obeoCompanyForUser2.getCategories().get(0); |
| |
| EcoreUtil.delete(categoryForUser2); |
| sharedResourceForUser2.setName(RENAMED_SHARED_RESOURCE_NAME); |
| commitAndSync(transaction2, transaction1); |
| |
| assertEquals(CDOState.INVALID, CDOUtil.getCDOObject(productsCategory).cdoState()); |
| assertEquals(CDOState.INVALID, CDOUtil.getCDOObject(smartEAProduct).cdoState()); |
| } |
| } |