1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*
* Copyright (c) 2013 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());
}
}
|