View Javadoc

1   /*
2   jGuard is a security framework based on top of jaas (java authentication and authorization security).
3   it is written for web applications, to resolve simply, access control problems.
4   version $Name:  $
5   http://sourceforge.net/projects/jguard/
6   
7   Copyright (C) 2004  Charles GAY
8   
9   This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13  
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  Lesser General Public License for more details.
18  
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  
23  
24  jGuard project home page:
25  http://sourceforge.net/projects/jguard/
26  
27  */
28  package net.sf.jguard.core.provisioning;
29  
30  
31  import java.util.Collections;
32  import java.util.HashSet;
33  import java.util.Set;
34  
35  import javax.security.auth.Subject;
36  
37  import net.sf.jguard.core.authentication.AuthenticationException;
38  import net.sf.jguard.core.authentication.credentials.JGuardCredential;
39  import net.sf.jguard.core.organization.Organization;
40  import org.slf4j.Logger;
41  import org.slf4j.LoggerFactory;
42  
43  /**
44   * template used to validate user registration and to build the corresponding
45   * Subject object.
46   * @author <a href="mailto:diabolo512@users.sourceforge.net">Charles Gay</a>
47   * @author <a href="mailto:tandilero@users.sourceforge.net">Maximiliano Batelli</a>
48   *
49   */
50  public class SubjectTemplate extends EntityTemplate {
51  
52      private static final Logger logger = LoggerFactory.getLogger(SubjectTemplate.class.getName());
53     
54      private Set missingPrivateRequiredCred;
55      private Set missingPublicRequiredCred;
56      private Set unknownPrivateOptionalCred;
57      private Set unknownPublicOptionalCred;
58      private Set privateRequiredCredentials;
59      private Set publicRequiredCredentials;
60      private Set publicOptionalCredentials;
61      private Set privateOptionalCredentials;
62  
63      
64      private Long id;
65      //principals created during registration
66      private Set principals;
67  
68  	/**
69  	 * constructor.
70  	 */
71  	public SubjectTemplate(){
72              super();
73              //data used for all the users during registration
74              missingPrivateRequiredCred = new HashSet();
75              missingPublicRequiredCred = new HashSet();
76              unknownPrivateOptionalCred = new HashSet();
77              unknownPublicOptionalCred= new HashSet();
78              privateOptionalCredentials = new HashSet();
79              privateRequiredCredentials = new HashSet();
80              publicOptionalCredentials = new HashSet();
81              publicRequiredCredentials = new HashSet();
82              principals = new HashSet();	
83  	}
84  
85  	
86  
87  	/**
88  	 * remove unknown credentials and return missing credentials set.
89  	 * @param user
90  	 * @return mssing credentials
91  	 * @throws AuthenticationException
92  	 */
93  	public Set validateRequiredCredentialsFromUser(Subject user)throws AuthenticationException{
94  		Set missingCredentials = new HashSet();
95  		Set credentialsNotRegistered = null;
96  		//we remove unknown credentials
97  		Set userPublicRequiredCredentials = getCredentials(getPublicRequiredCredentials(), user.getPublicCredentials(JGuardCredential.class));
98  		Set missingPublicCredentials =  validateCredentialSet(getPublicRequiredCredentials(), userPublicRequiredCredentials);
99  		missingCredentials.addAll(missingPublicCredentials);
100 
101 		Set userPublicOptionalCredentials = getCredentials(getPublicOptionalCredentials(), user.getPublicCredentials(JGuardCredential.class));
102 		credentialsNotRegistered = filterCredentialSet(getPublicOptionalCredentials(), userPublicOptionalCredentials);
103 		if(credentialsNotRegistered.size()>0){
104 		  logger.warn(" there are some unknown credentials filled by the user during the registration process: ");
105 		  logger.warn(credentialsNotRegistered.toString());
106 		}
107 		
108 
109 		Set userPrivateRequiredCredentials = getCredentials(getPrivateRequiredCredentials(), user.getPrivateCredentials(JGuardCredential.class));
110 		Set missingPrivateCredentials = validateCredentialSet(getPrivateRequiredCredentials(), userPrivateRequiredCredentials);
111 		missingCredentials.addAll(missingPrivateCredentials);
112 		
113 		Set userPrivateOptionalCredentials = getCredentials(getPrivateOptionalCredentials(), user.getPrivateCredentials(JGuardCredential.class));
114 		credentialsNotRegistered = filterCredentialSet(getPrivateOptionalCredentials(), userPrivateOptionalCredentials);
115 		if(credentialsNotRegistered.size()>0){
116 		  logger.warn(" there are some unknown credentials filled by the user during the registration process: ");
117 		  logger.warn(credentialsNotRegistered.toString());
118 		}
119 		
120 		return missingCredentials;
121 	}
122 
123 
124 	
125 	/**
126 	 * build a Subject from a SubjectTemplate.
127 	 * @param user SubjectTemplate used to build the Subject object
128 	 * @return subject built
129 	 */
130 	public Subject toSubject(SubjectTemplate user,Organization organization){
131 
132 		Set principalsForRegisteredUsers = new HashSet();
133 		principalsForRegisteredUsers.addAll((getPrincipals()));
134                 
135                 //add to the user its organization
136                 principalsForRegisteredUsers.add(organization);
137 
138 		Set publicCredentials = user.getPublicCredentials();
139 		Set privateCredentials = user.getPrivateCredentials();
140 
141 		Subject subject = new Subject(false,principalsForRegisteredUsers,publicCredentials,privateCredentials);
142 		return subject;
143 	}
144         
145         
146 
147 	/**
148 	 * build a Subject from a validated SubjectTemplate.
149 	 * @return subject built
150 	 */
151 	public Subject toSubject(Organization organization){
152 		return toSubject(this,organization);
153 	}
154         
155         public final Set getMissingPublicRequiredCred() {
156 		return missingPublicRequiredCred;
157 	}
158 
159 	public final Set getUnknownPrivateOptionalCred() {
160 		return unknownPrivateOptionalCred;
161 	}
162 	public final Set getUnknownPublicOptionalCred() {
163 		return unknownPublicOptionalCred;
164 	}
165 	 /**
166 	 * implements a deep copy of object
167 	 * @see java.lang.Object#clone()
168 	 */
169 	public Object clone() throws CloneNotSupportedException{
170 
171 		SubjectTemplate clone = new SubjectTemplate();
172 		clone.setPrincipals(new HashSet(principals));
173 		clone.setPrivateOptionalCredentials(JGuardCredential.cloneCredentialsSet(getPrivateOptionalCredentials()));
174 		clone.setPrivateRequiredCredentials(JGuardCredential.cloneCredentialsSet(getPrivateRequiredCredentials()));
175 		clone.setPublicOptionalCredentials(JGuardCredential.cloneCredentialsSet(getPublicOptionalCredentials()));
176 		clone.setPublicRequiredCredentials(JGuardCredential.cloneCredentialsSet(getPublicRequiredCredentials()));
177 		return clone;
178         }
179 
180 /**
181 	 * return a read-only SubjectTemplate.
182 	 * this method is inspired from the
183 	 * Collections.unmodifiableCollection(Collection c), which
184 	 * is part of the JDK.
185 	 * @return read-only SubjectTemplate
186 	 */
187 	public SubjectTemplate unmodifiableSubjectTemplate() throws CloneNotSupportedException{
188             
189         SubjectTemplate readOnly = (SubjectTemplate)this.clone();
190         
191         //principal stuff
192         readOnly.principals = (Collections.unmodifiableSet(principals));
193  
194         //credential stuff
195         readOnly.setPrivateOptionalCredentials((Collections.unmodifiableSet(getPrivateOptionalCredentials())));
196         readOnly.setPrivateRequiredCredentials((Collections.unmodifiableSet(getPrivateRequiredCredentials())));
197         readOnly.setPublicOptionalCredentials(((Collections.unmodifiableSet(getPublicOptionalCredentials()))));
198         readOnly.setPublicRequiredCredentials((Collections.unmodifiableSet(getPublicRequiredCredentials())));
199 
200 		return readOnly;
201 	}
202          
203          
204         public final Set getMissingPrivateRequiredCred() {
205 		return missingPrivateRequiredCred;
206 	}
207          
208         public void setPrivateRequiredCredentials(Set privateCredentials) {
209                 this.privateRequiredCredentials = privateCredentials;
210 	}
211 
212 	public void setPublicRequiredCredentials(Set publicCredentials) {
213                 this.publicRequiredCredentials = publicCredentials;
214 	}
215         
216         public Set getPrivateOptionalCredentials() {
217 		return privateOptionalCredentials;
218 	}
219 	public void setPrivateOptionalCredentials(Set privateOptionalCredentials) {
220 		this.privateOptionalCredentials = privateOptionalCredentials;
221 	}
222 	public Set getPublicOptionalCredentials() {
223 		return publicOptionalCredentials;
224 	}
225 	public void setPublicOptionalCredentials(Set publicOptionalCredentials) {
226 		this.publicOptionalCredentials =  publicOptionalCredentials;
227 	}
228         
229          public Set getPublicRequiredCredentials() {
230 		return publicRequiredCredentials;
231 	}
232 
233 	public Set getPrivateRequiredCredentials() {
234 		return privateRequiredCredentials;
235 	}
236         
237         public Set getPublicCredentials(){
238 		Set publicCredentials = getPublicOptionalCredentials();
239 		publicCredentials.addAll(getPublicRequiredCredentials());
240 		return publicCredentials;
241 	}
242         
243 
244 	public Set getPrivateCredentials(){
245 		Set privateCredentials = getPrivateOptionalCredentials();
246 		privateCredentials.addAll(getPrivateRequiredCredentials());
247 		return privateCredentials;
248 
249 	}
250         
251         public Set getRequiredCredentials(){
252             Set requiredCredentials = new HashSet(getPublicRequiredCredentials());
253             requiredCredentials.addAll(getPrivateRequiredCredentials());
254             return requiredCredentials;
255 	}
256                 
257                 /**
258 	 * validate the EntityTemplate candidate.
259 	 * @param user the subjectTemplate which is candidate
260 	 * to be transformed into a Subject object.
261 	 * @throws AuthenticationException when the user does not content mandatory fields
262 	 */
263 	public void validateTemplate(SubjectTemplate candidate)throws RegistrationException{
264 
265 		if(candidate.getPrivateRequiredCredentials()==null){
266 			logger.warn("private required credentials set from user is null ");
267 			candidate.setPrivateRequiredCredentials(new HashSet());
268 		}
269 		if(candidate.getPrivateOptionalCredentials()==null){
270 			logger.warn("private optional credentials set from user is null ");
271 			candidate.setPrivateOptionalCredentials(new HashSet());
272 		}
273 		if(candidate.getPublicRequiredCredentials()==null){
274 			logger.warn("public required credentials set from user is null ");
275 			candidate.setPublicRequiredCredentials(new HashSet());
276 		}
277 		if(candidate.getPublicOptionalCredentials()==null){
278 			logger.warn("public optional credentials set from user is null ");
279 			candidate.setPublicOptionalCredentials(new HashSet());
280 		}
281 
282 		missingPrivateRequiredCred =
283 			validateCredentialSet(getPrivateRequiredCredentials(),candidate.getPrivateRequiredCredentials());
284 		if(missingPrivateRequiredCred.size()>0){
285 			throw new RegistrationException("missing private credentials required :"+missingPrivateRequiredCred,new HashSet(),missingPrivateRequiredCred);
286 		}
287 
288 		missingPublicRequiredCred =
289 			validateCredentialSet(getPublicRequiredCredentials(),candidate.getPublicRequiredCredentials());
290 		if(missingPrivateRequiredCred.size()>0){
291 			throw new RegistrationException("missing public credentials required :"+missingPublicRequiredCred,missingPublicRequiredCred,new HashSet());
292 		}
293 
294 		unknownPrivateOptionalCred =
295 			filterCredentialSet(getPrivateOptionalCredentials(),candidate.getPrivateOptionalCredentials());
296 		if(unknownPrivateOptionalCred.size()>0){
297                     logger.warn(" user has filled unknown optional private credentials :");
298                     logger.warn(unknownPrivateOptionalCred.toString());
299 		}
300 		unknownPublicOptionalCred =
301 			filterCredentialSet(getPublicOptionalCredentials(),candidate.getPublicOptionalCredentials());
302 		if(unknownPublicOptionalCred.size()>0){
303 			logger.warn(" user has filled unknown optional public credentials :");
304 			logger.warn(unknownPublicOptionalCred.toString());
305 		}
306 	}
307 
308     public Long getId() {
309         return id;
310     }
311 
312     public void setId(Long id) {
313         this.id = id;
314     }
315 
316     
317     public Set getPrincipals() {
318             return principals;
319     }
320     /**
321      * defined the principals automatically granted to the registered user.
322      * @param principals
323      */
324     public void setPrincipals(Set principals) {
325             this.principals = principals;
326     }
327 
328 }