Project

General

Profile

Download (9.32 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.ArrayList;
9
import java.util.Collection;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.Set;
13
import java.util.UUID;
14

    
15
import javax.sql.DataSource;
16

    
17
import org.apache.log4j.Logger;
18

    
19
import org.junit.Assert;
20
import org.junit.Before;
21
import org.junit.Ignore;
22
import org.junit.Test;
23
import org.junit.runner.RunWith;
24

    
25
import org.springframework.beans.factory.annotation.Autowired;
26
import org.springframework.security.access.vote.RoleVoter;
27
import org.springframework.security.authentication.AuthenticationManager;
28
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
29
import org.springframework.security.authentication.dao.ReflectionSaltSource;
30
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
31
import org.springframework.security.core.Authentication;
32
import org.springframework.security.core.GrantedAuthority;
33
import org.springframework.security.core.context.SecurityContext;
34
import org.springframework.security.core.context.SecurityContextHolder;
35

    
36

    
37
import org.unitils.database.annotations.Transactional;
38
import org.unitils.UnitilsJUnit4TestClassRunner;
39
import org.unitils.database.annotations.TestDataSource;
40
import org.unitils.database.util.TransactionMode;
41
import org.unitils.dbunit.annotation.DataSet;
42
import org.unitils.spring.annotation.SpringApplicationContext;
43
import org.unitils.spring.annotation.SpringBeanByName;
44

    
45

    
46
import eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator;
47
import eu.etaxonomy.cdm.api.service.config.TaxonServiceConfiguratorImpl;
48
import eu.etaxonomy.cdm.api.service.pager.Pager;
49
import eu.etaxonomy.cdm.database.EvaluationFailedException;
50
import eu.etaxonomy.cdm.model.common.User;
51

    
52

    
53
import eu.etaxonomy.cdm.model.description.Feature;
54
import eu.etaxonomy.cdm.model.description.TaxonDescription;
55
import eu.etaxonomy.cdm.model.description.TextData;
56

    
57
import eu.etaxonomy.cdm.model.media.Media;
58
import eu.etaxonomy.cdm.model.name.BotanicalName;
59
import eu.etaxonomy.cdm.model.name.Rank;
60
import eu.etaxonomy.cdm.model.taxon.Synonym;
61

    
62
import eu.etaxonomy.cdm.model.taxon.Taxon;
63
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
64
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
65
import eu.etaxonomy.cdm.permission.CdmPermissionEvaluator;
66
import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;
67

    
68

    
69

    
70

    
71
@RunWith(UnitilsJUnit4TestClassRunner.class)
72
@SpringApplicationContext({"/eu/etaxonomy/cdm/applicationContextSecurity.xml"})
73
@Transactional(TransactionMode.DISABLED)
74
@DataSet
75
public class SecurityTest {
76
private static final Logger logger = Logger.getLogger(TaxonServiceImplTest.class);
77
	
78
	@SpringBeanByName
79
	private ITaxonService taxonService;
80
	
81
	@SpringBeanByName
82
	private IDescriptionService descriptionService;
83
	
84
	@SpringBeanByName
85
	private ITaxonNodeService taxonNodeService;
86
	
87
	@SpringBeanByName
88
	private IUserService userService;
89
	
90
	
91
	@TestDataSource
92
	protected DataSource dataSource;
93
	
94
	private Authentication authentication;
95
	
96
	@SpringBeanByName
97
	private AuthenticationManager authenticationManager;
98
	
99
	
100
	
101
	private UsernamePasswordAuthenticationToken token;
102
	
103
		
104
	@Before
105
	public void setUp(){
106
		token = new UsernamePasswordAuthenticationToken("ben", "sPePhAz6");
107
	}
108
	
109
	
110
	/**
111
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#saveTaxon(eu.etaxonomy.cdm.model.taxon.TaxonBase)}.
112
	 */
113
	@Test
114
	public final void testSaveTaxon() {
115
		/*
116
		Md5PasswordEncoder encoder =new Md5PasswordEncoder();
117
		ReflectionSaltSource saltSource = new ReflectionSaltSource();
118
		saltSource.setUserPropertyToUse("getUsername");
119
		User user = User.NewInstance("partEditor", "test4");
120
		System.err.println(encoder.encodePassword("test4", saltSource.getSalt(user)));
121
		
122
		*/
123
		authentication = authenticationManager.authenticate(token);
124
		SecurityContext context = SecurityContextHolder.getContext();
125
		context.setAuthentication(authentication);
126
		
127
		Taxon expectedTaxon = Taxon.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);
128
		UUID uuid = taxonService.save(expectedTaxon);
129
		TaxonBase<?> actualTaxon = taxonService.load(uuid);
130
		assertEquals(expectedTaxon, actualTaxon);
131
		
132
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
133
		authentication = authenticationManager.authenticate(token);
134
		context = SecurityContextHolder.getContext();
135
		context.setAuthentication(authentication);
136
		expectedTaxon = Taxon.NewInstance(BotanicalName.NewInstance(Rank.GENUS()), null);
137
		taxonService.saveOrUpdate(actualTaxon);
138
		
139
		
140
	}
141
	@Test
142
	public void testUpdateUser(){
143
		
144
		authentication = authenticationManager.authenticate(token);
145
		SecurityContext context = SecurityContextHolder.getContext();
146
		context.setAuthentication(authentication);
147
		String username = "standardUser";
148
		String password = "pw";
149
		User user = User.NewInstance(username, password);
150
		
151
		userService.createUser(user);
152
		user.setEmailAddress("test@bgbm.org");
153
		
154
		userService.updateUser(user);
155
		userService.update(user);
156
		userService.saveOrUpdate(user);
157
	}
158
	
159
	@Test
160
	public final void testSaveOrUpdateTaxon() {
161
		authentication = authenticationManager.authenticate(token);
162
		SecurityContext context = SecurityContextHolder.getContext();
163
		context.setAuthentication(authentication);
164
		Taxon expectedTaxon = Taxon.NewInstance(null, null);
165
		UUID uuid = taxonService.save(expectedTaxon);
166
		TaxonBase<?> actualTaxon = taxonService.load(uuid);
167
		assertEquals(expectedTaxon, actualTaxon);
168
		
169
		actualTaxon.setName(BotanicalName.NewInstance(Rank.SPECIES()));
170
		taxonService.saveOrUpdate(actualTaxon);
171
		
172
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
173
		authentication = authenticationManager.authenticate(token);
174
		context = SecurityContextHolder.getContext();
175
		context.setAuthentication(authentication);
176
		actualTaxon = taxonService.load(uuid);
177
		actualTaxon.setName(BotanicalName.NewInstance(Rank.GENUS()));
178
		taxonService.saveOrUpdate(actualTaxon);
179
			
180
	}
181
	
182
	
183
	
184
	@Test
185
	public void testCascadingInSpringSecurityAccesDenied(){
186
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
187
		SecurityContext context = SecurityContextHolder.getContext();
188
		context.setAuthentication(authentication);
189
		CdmPermissionEvaluator permissionEvaluator = new CdmPermissionEvaluator();
190
		
191
		Taxon taxon =(Taxon) taxonService.load(UUID.fromString("bc09aca6-06fd-4905-b1e7-cbf7cc65d783"));
192
		TaxonDescription description = TaxonDescription.NewInstance(taxon);
193
		description.setTitleCache("test");
194
		assertFalse(permissionEvaluator.hasPermission(authentication, description, "UPDATE"));
195
		System.err.println(permissionEvaluator.hasPermission(authentication, taxon, "UPDATE"));
196
		Collection<GrantedAuthority> authorities = authentication.getAuthorities();
197
		for (GrantedAuthority authority: authorities){
198
			System.err.println(authority.getAuthority());
199
		}
200
		//during cascading the permissions are not evaluated, but with hibernate listener every database transaction can be interrupted, but how to manage it, 
201
		//when someone has the rights to save descriptions, but not taxa (the editor always saves everything by saving the taxon)
202
		taxonService.saveOrUpdate(taxon);
203
		
204
		
205
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("descriptionEditor", "test"));
206
		context = SecurityContextHolder.getContext();
207
		context.setAuthentication(authentication);
208
		
209
		//taxonService.saveOrUpdate(taxon);
210
		
211
				
212
		descriptionService.saveOrUpdate(description);
213
		
214
		
215
		
216
	}
217
	
218
	@Test
219
	public void testCascadingInSpring(){
220
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("descriptionEditor", "test"));
221
		SecurityContext context = SecurityContextHolder.getContext();
222
		context.setAuthentication(authentication);
223
		Taxon taxon = (Taxon)taxonService.load(UUID.fromString("928a0167-98cd-4555-bf72-52116d067625"));
224
		TaxonDescription description = TaxonDescription.NewInstance(taxon);
225
		CdmPermissionEvaluator permissionEvaluator = new CdmPermissionEvaluator();
226
		assertTrue(permissionEvaluator.hasPermission(authentication, description, "UPDATE"));
227
		
228
		descriptionService.saveOrUpdate(description);
229
		
230
		taxon = (Taxon)taxonService.load(UUID.fromString("928a0167-98cd-4555-bf72-52116d067625"));
231
		Set<TaxonDescription> descriptions = taxon.getDescriptions();
232
		assertTrue(descriptions.contains(description));
233
	}
234
	
235
	@Test
236
	
237
	public void testSaveSynonym(){
238
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
239
		SecurityContext context = SecurityContextHolder.getContext();
240
		context.setAuthentication(authentication);
241
		
242
		Synonym syn = Synonym.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);
243
		taxonService.saveOrUpdate(syn);
244
		
245
	}
246
	
247
	public static void main(String[] args){
248
		Md5PasswordEncoder encoder =new Md5PasswordEncoder();
249
	
250
		ReflectionSaltSource saltSource = new ReflectionSaltSource();
251
		saltSource.setUserPropertyToUse("getUsername");
252
		User user = User.NewInstance("admin", "xyz");
253
		System.err.println(encoder.encodePassword("test4", saltSource.getSalt(user)));
254
	}
255
}
(9-9/16)