Project

General

Profile

Download (10.6 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.api.service;
2

    
3
import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertFalse;
5
import static org.junit.Assert.assertTrue;
6

    
7

    
8
import java.util.Iterator;
9
import java.util.Set;
10
import java.util.UUID;
11

    
12
import javax.sql.DataSource;
13

    
14
import org.apache.log4j.Logger;
15

    
16
import org.junit.Assert;
17
import org.junit.Before;
18
import org.junit.Test;
19
import org.junit.runner.RunWith;
20

    
21
import org.springframework.orm.hibernate3.HibernateTemplate;
22
import org.springframework.security.authentication.AuthenticationManager;
23
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
24
import org.springframework.security.authentication.dao.ReflectionSaltSource;
25
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
26
import org.springframework.security.core.Authentication;
27
import org.springframework.security.core.context.SecurityContext;
28
import org.springframework.security.core.context.SecurityContextHolder;
29

    
30
import org.springframework.test.annotation.Rollback;
31
import org.springframework.transaction.UnexpectedRollbackException;
32
import org.springframework.transaction.annotation.Transactional;
33
import org.unitils.database.util.TransactionMode;
34
import org.unitils.UnitilsJUnit4TestClassRunner;
35
import org.unitils.database.annotations.TestDataSource;
36
import org.unitils.database.util.TransactionMode;
37
import org.unitils.dbunit.annotation.DataSet;
38
import org.unitils.spring.annotation.SpringApplicationContext;
39
import org.unitils.spring.annotation.SpringBeanByName;
40
import org.unitils.spring.annotation.SpringBeanByType;
41

    
42
import eu.etaxonomy.cdm.model.common.User;
43
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
44

    
45
import eu.etaxonomy.cdm.model.description.Feature;
46
import eu.etaxonomy.cdm.model.description.TaxonDescription;
47
import eu.etaxonomy.cdm.model.description.TextData;
48

    
49
import eu.etaxonomy.cdm.model.media.Media;
50
import eu.etaxonomy.cdm.model.name.BotanicalName;
51
import eu.etaxonomy.cdm.model.name.Rank;
52
import eu.etaxonomy.cdm.model.taxon.Synonym;
53
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
54
import eu.etaxonomy.cdm.model.taxon.Taxon;
55
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
56
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
57
import eu.etaxonomy.cdm.permission.CdmPermissionEvaluator;
58
import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;
59

    
60
import org.springframework.security.access.AccessDeniedException;
61

    
62
@RunWith(UnitilsJUnit4TestClassRunner.class)
63
@SpringApplicationContext({"/eu/etaxonomy/cdm/applicationContextSecurity.xml"})
64
@Transactional
65
@DataSet
66
public class SecurityTest {
67
private static final Logger logger = Logger.getLogger(TaxonServiceImplTest.class);
68
	
69
	@SpringBeanByName
70
	private ITaxonService taxonService;
71
	
72
	@SpringBeanByName
73
	private IDescriptionService descriptionService;
74
	
75
	@SpringBeanByName
76
	private ITaxonNodeService taxonNodeService;
77
	
78
	@SpringBeanByName
79
	private IUserService userService;
80
	
81
	
82
	@TestDataSource
83
	protected DataSource dataSource;
84
	
85
	private Authentication authentication;
86
	
87
	@SpringBeanByName
88
	private AuthenticationManager authenticationManager;
89
	
90
	private UsernamePasswordAuthenticationToken token;
91
	
92
	@Before
93
	public void setUp(){
94
		token = new UsernamePasswordAuthenticationToken("ben", "sPePhAz6");
95
	}
96
	
97
	
98
	/**
99
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#saveTaxon(eu.etaxonomy.cdm.model.taxon.TaxonBase)}.
100
	 */
101
	@Test
102
	public final void testSaveTaxon() {
103
		/*
104
		Md5PasswordEncoder encoder =new Md5PasswordEncoder();
105
		ReflectionSaltSource saltSource = new ReflectionSaltSource();
106
		saltSource.setUserPropertyToUse("getUsername");
107
		User user = User.NewInstance("partEditor", "test4");
108
		System.err.println(encoder.encodePassword("test4", saltSource.getSalt(user)));
109
		
110
		*/
111
		authentication = authenticationManager.authenticate(token);
112
		SecurityContext context = SecurityContextHolder.getContext();
113
		context.setAuthentication(authentication);
114
		
115
		Taxon expectedTaxon = Taxon.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);
116
		UUID uuid = taxonService.save(expectedTaxon);
117
		TaxonBase<?> actualTaxon = taxonService.find(uuid);
118
		assertEquals(expectedTaxon, actualTaxon);
119
		
120
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
121
		authentication = authenticationManager.authenticate(token);
122
		context = SecurityContextHolder.getContext();
123
		context.setAuthentication(authentication);
124
		expectedTaxon = Taxon.NewInstance(BotanicalName.NewInstance(Rank.GENUS()), null);
125
		taxonService.save(actualTaxon);
126
		
127
		
128
	}
129
	@Test
130
	public void testUpdateUser(){
131
		
132
		authentication = authenticationManager.authenticate(token);
133
		SecurityContext context = SecurityContextHolder.getContext();
134
		context.setAuthentication(authentication);
135
		String username = "standardUser";
136
		String password = "pw";
137
		User user = User.NewInstance(username, password);
138
		
139
		userService.createUser(user);
140
		user.setEmailAddress("test@bgbm.org");
141
		
142
		userService.updateUser(user);
143
		userService.update(user);
144
		userService.saveOrUpdate(user);
145
	}
146
	
147
	@Test
148
	public final void testSaveOrUpdateTaxon() {
149
		authentication = authenticationManager.authenticate(token);
150
		SecurityContext context = SecurityContextHolder.getContext();
151
		context.setAuthentication(authentication);
152
		Taxon expectedTaxon = Taxon.NewInstance(null, null);
153
		UUID uuid = taxonService.save(expectedTaxon);
154
		TaxonBase<?> actualTaxon = taxonService.find(uuid);
155
		assertEquals(expectedTaxon, actualTaxon);
156
		
157
		actualTaxon.setName(BotanicalName.NewInstance(Rank.SPECIES()));
158
		taxonService.saveOrUpdate(actualTaxon);
159
		
160
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
161
		authentication = authenticationManager.authenticate(token);
162
		context = SecurityContextHolder.getContext();
163
		context.setAuthentication(authentication);
164
		actualTaxon = taxonService.find(uuid);
165
		actualTaxon.setName(BotanicalName.NewInstance(Rank.GENUS()));
166
		taxonService.saveOrUpdate(actualTaxon);
167
			
168
	}
169
	
170
	@Test
171
	public void testDeleteTaxon(){
172
		token = new UsernamePasswordAuthenticationToken("taxonomist", "test3");
173
		authentication = authenticationManager.authenticate(token);
174
		SecurityContext context = SecurityContextHolder.getContext();
175
		context.setAuthentication(authentication);
176
		Taxon actualTaxon = (Taxon)taxonService.find(UUID.fromString("7b8b5cb3-37ba-4dba-91ac-4c6ffd6ac331"));
177
		
178
		taxonService.delete(actualTaxon);
179
	}
180
	
181
	
182
	@Test
183
	public void testSaveOrUpdateDescription(){
184
		
185
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("descriptionEditor", "test"));
186
		SecurityContext context = SecurityContextHolder.getContext();
187
		context.setAuthentication(authentication);
188
		Taxon taxon = (Taxon) taxonService.find(UUID.fromString("7b8b5cb3-37ba-4dba-91ac-4c6ffd6ac331"));
189
		
190
		Set<TaxonDescription> descriptions = taxon.getDescriptions();
191
		
192
		Iterator<TaxonDescription> iterator = descriptions.iterator();
193
		
194
		TaxonDescription description = iterator.next();
195
		description = (TaxonDescription) descriptionService.find(description.getUuid());
196
		Iterator<DescriptionElementBase> elements = description.getElements().iterator();
197
		TextData textData = new TextData();
198
		textData.setFeature(Feature.ECOLOGY());
199
		Media media = Media.NewInstance();
200
		textData.addMedia(media);
201
		
202
		
203
		
204
		descriptionService.saveDescriptionElement(textData);
205
		description.addElement(textData);
206
		
207
		descriptionService.saveOrUpdate(description);
208
		
209
		taxon = (Taxon) taxonService.find(UUID.fromString("7b8b5cb3-37ba-4dba-91ac-4c6ffd6ac331"));
210
		descriptions = taxon.getDescriptions();
211
		
212
		iterator = descriptions.iterator();
213
		
214
		description = iterator.next();
215
		assertEquals(1,description.getElements().iterator().next().getMedia().size());
216
		
217
	}
218
	
219
	@Test
220
	public void testAllowOnlyAccessToPartOfTree(){
221
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
222
		SecurityContext context = SecurityContextHolder.getContext();
223
		context.setAuthentication(authentication);
224
		
225
		Taxon tribe = (Taxon)taxonService.find(UUID.fromString("928a0167-98cd-4555-bf72-52116d067625"));
226
		Taxon taxon = (Taxon)taxonService.find(UUID.fromString("bc09aca6-06fd-4905-b1e7-cbf7cc65d783"));
227
		Iterator<TaxonNode> it = tribe.getTaxonNodes().iterator();
228
		TaxonNode node = it.next();
229
		
230
		CdmPermissionEvaluator permissionEvaluator = new CdmPermissionEvaluator();
231
		assertFalse(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
232
		node = node.getChildNodes().iterator().next();
233
		System.err.println(node.getUuid()); 
234
		assertTrue(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
235
		node = node.getChildNodes().iterator().next();
236
		assertTrue(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
237
		TaxonDescription description = TaxonDescription.NewInstance(taxon);
238
		
239
		taxonNodeService.saveOrUpdate(node);
240
		assertFalse(permissionEvaluator.hasPermission(authentication, description, "UPDATE"));
241
		
242
		
243
	}
244
	
245
	@Test
246
	public void testCascadingInSpringSecurity(){
247
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
248
		SecurityContext context = SecurityContextHolder.getContext();
249
		context.setAuthentication(authentication);
250
		CdmPermissionEvaluator permissionEvaluator = new CdmPermissionEvaluator();
251
		Taxon taxon = (Taxon)taxonService.find(UUID.fromString("bc09aca6-06fd-4905-b1e7-cbf7cc65d783"));
252
		TaxonDescription description = TaxonDescription.NewInstance(taxon);
253
		assertFalse(permissionEvaluator.hasPermission(authentication, description, "UPDATE"));
254
		//during cascading the permissions are not evaluated
255
		taxonService.saveOrUpdate(taxon);
256
		
257
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("descriptionEditor", "test"));
258
		context = SecurityContextHolder.getContext();
259
		context.setAuthentication(authentication);
260
		taxon = (Taxon)taxonService.find(UUID.fromString("928a0167-98cd-4555-bf72-52116d067625"));
261
		description = TaxonDescription.NewInstance(taxon);
262
		assertTrue(permissionEvaluator.hasPermission(authentication, description, "UPDATE"));
263
		
264
	}
265
	
266
	@Test
267
	public void testSaveSynonym(){
268
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
269
		SecurityContext context = SecurityContextHolder.getContext();
270
		context.setAuthentication(authentication);
271
		Synonym syn = Synonym.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);
272
		taxonService.saveOrUpdate(syn);
273
		
274
	}
275
}
(9-9/15)