1 /**
2 *
3 * Copyright 2003-2004 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.geronimo.security.util;
19
20 import java.lang.reflect.Constructor;
21 import java.security.AccessController;
22 import java.security.PrivilegedActionException;
23 import java.security.PrivilegedExceptionAction;
24 import java.util.Set;
25 import javax.security.auth.Subject;
26 import javax.security.auth.x500.X500Principal;
27 import javax.security.jacc.PolicyContext;
28 import javax.security.jacc.PolicyContextException;
29 import javax.security.jacc.PolicyContextHandler;
30
31 import org.apache.geronimo.common.DeploymentException;
32 import org.apache.geronimo.common.GeronimoSecurityException;
33 import org.apache.geronimo.security.DomainPrincipal;
34 import org.apache.geronimo.security.PrimaryDomainPrincipal;
35 import org.apache.geronimo.security.PrimaryPrincipal;
36 import org.apache.geronimo.security.PrimaryRealmPrincipal;
37 import org.apache.geronimo.security.RealmPrincipal;
38 import org.apache.geronimo.security.deploy.DefaultDomainPrincipal;
39 import org.apache.geronimo.security.deploy.DefaultPrincipal;
40 import org.apache.geronimo.security.deploy.DefaultRealmPrincipal;
41 import org.apache.geronimo.security.deploy.PrincipalInfo;
42
43
44 /**
45 * A collection of utility functions that assist with the configuration of
46 * <code>PolicyConfiguration</code>s.
47 *
48 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
49 * @see javax.security.jacc.PolicyConfiguration
50 * @see "JSR 115" Java Authorization Contract for Containers
51 */
52 public class ConfigurationUtil {
53
54 /**
55 * Create an X500Principal from a deployment description.
56 *
57 * @param name the distinguished name of the principal
58 * @return an X500Principal from a deployment description
59 */
60 public static X500Principal generateX500Principal(String name) {
61 return new X500Principal(name);
62 }
63
64 /**
65 * Create a Principal from a deployment description.
66 *
67 * @param principalInfo the deployment description of the principal to be created.
68 * @param classLoader
69 * @return a RealmPrincipal from a deployment description
70 */
71 public static java.security.Principal generatePrincipal(final PrincipalInfo principalInfo, ClassLoader classLoader) {
72 return generatePrincipal(principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
73 }
74
75 public static java.security.Principal generatePrincipal(final String className, final String principalName, final ClassLoader classLoader) {
76 try {
77 return (java.security.Principal) AccessController.doPrivileged(new PrivilegedExceptionAction() {
78 public Object run() throws Exception {
79 Class clazz = classLoader.loadClass(className);
80 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
81 return (java.security.Principal) constructor.newInstance(new Object[]{principalName});
82 }
83 });
84 } catch (PrivilegedActionException e) {
85 e.printStackTrace();
86 if (e.getException() != null) {
87 e.getException().printStackTrace();
88 }
89 return null;
90 }
91 }
92
93 /**
94 * Create a RealmPrincipal from a deployment description.
95 *
96 * @param principalInfo the deployment description of the principal to be created.
97 * @param classLoader
98 * @return a RealmPrincipal from a deployment description
99 */
100 public static RealmPrincipal generateRealmPrincipal(final String realm, final String loginDomain, final PrincipalInfo principalInfo, ClassLoader classLoader) {
101 return generateRealmPrincipal(realm, loginDomain, principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
102 }
103
104 public static RealmPrincipal generateRealmPrincipal(final String realm, final String loginDomain, final String className, final String principalName,
105 ClassLoader classLoader)
106 {
107 return new RealmPrincipal(realm, loginDomain, generatePrincipal(className, principalName, classLoader));
108 }
109
110 /**
111 * Create a DomainPrincipal from a deployment description.
112 *
113 * @param principalInfo the deployment description of the principal to be created.
114 * @param classLoader
115 * @return a RealmPrincipal from a deployment description
116 */
117 public static DomainPrincipal generateDomainPrincipal(final String loginDomain, final PrincipalInfo principalInfo, ClassLoader classLoader) {
118 return generateDomainPrincipal(loginDomain, principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
119 }
120
121 public static DomainPrincipal generateDomainPrincipal(final String loginDomain, final String className, final String principalName, ClassLoader classLoader) {
122 return new DomainPrincipal(loginDomain, generatePrincipal(className, principalName, classLoader));
123 }
124
125 /**
126 * Create a RealmPrincipal from a deployment description.
127 *
128 * @param principalInfo the deployment description of the principal to be created.
129 * @param classLoader
130 * @return a PrimaryRealmPrincipal from a deployment description
131 */
132 public static PrimaryRealmPrincipal generatePrimaryRealmPrincipal(final String realm, final String domain, final PrincipalInfo principalInfo, ClassLoader classLoader) throws DeploymentException {
133 return generatePrimaryRealmPrincipal(realm, domain, principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
134 }
135
136 public static PrimaryRealmPrincipal generatePrimaryRealmPrincipal(final String realm, final String domain, final String className, final String principalName,
137 final ClassLoader classLoader) throws DeploymentException
138 {
139 try {
140 return (PrimaryRealmPrincipal) AccessController.doPrivileged(new PrivilegedExceptionAction() {
141 public Object run() throws Exception {
142 java.security.Principal p = null;
143 Class clazz = classLoader.loadClass(className);
144 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
145 p = (java.security.Principal) constructor.newInstance(new Object[]{principalName});
146
147 return new PrimaryRealmPrincipal(realm, domain, p);
148 }
149 });
150 } catch (PrivilegedActionException pae) {
151 throw new DeploymentException("Unable to create realm principal", pae.getException());
152 }
153 }
154
155 /**
156 * Create a DomainPrincipal from a deployment description.
157 *
158 * @param principalInfo the deployment description of the principal to be created.
159 * @param classLoader
160 * @return a PrimaryDomainPrincipal from a deployment description
161 */
162 public static PrimaryDomainPrincipal generatePrimaryDomainPrincipal(final String domain, final PrincipalInfo principalInfo, ClassLoader classLoader) throws DeploymentException {
163 return generatePrimaryDomainPrincipal(domain, principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
164 }
165
166 public static PrimaryDomainPrincipal generatePrimaryDomainPrincipal(final String domain, final String className, final String principalName,
167 final ClassLoader classLoader) throws DeploymentException
168 {
169 try {
170 return (PrimaryDomainPrincipal) AccessController.doPrivileged(new PrivilegedExceptionAction() {
171 public Object run() throws Exception {
172 java.security.Principal p = null;
173 Class clazz = classLoader.loadClass(className);
174 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
175 p = (java.security.Principal) constructor.newInstance(new Object[]{principalName});
176
177 return new PrimaryDomainPrincipal(domain, p);
178 }
179 });
180 } catch (PrivilegedActionException pae) {
181 throw new DeploymentException("Unable to create domain principal", pae.getException());
182 }
183 }
184
185 /**
186 * Create a Principal from a deployment description.
187 *
188 * @param principalInfo the deployment description of the principal to be created.
189 * @param classLoader
190 * @return a Principal from a deployment description
191 */
192 public static PrimaryPrincipal generatePrimaryPrincipal(final PrincipalInfo principalInfo, ClassLoader classLoader) throws DeploymentException {
193 return generatePrimaryPrincipal(principalInfo.getClassName(), principalInfo.getPrincipalName(), classLoader);
194 }
195
196 public static PrimaryPrincipal generatePrimaryPrincipal(final String className, final String principalName, final ClassLoader classLoader) throws DeploymentException {
197 try {
198 return (PrimaryPrincipal) AccessController.doPrivileged(new PrivilegedExceptionAction() {
199 public Object run() throws Exception {
200 java.security.Principal p = null;
201 Class clazz = classLoader.loadClass(className);
202 Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class});
203 p = (java.security.Principal) constructor.newInstance(new Object[]{principalName});
204
205 return new PrimaryPrincipal(p);
206 }
207 });
208 } catch (PrivilegedActionException pae) {
209 throw new DeploymentException("Unable to create principal", pae.getException());
210 }
211 }
212
213 /**
214 * Generate the default principal from the security config.
215 *
216 * @param defaultPrincipal
217 * @param classLoader
218 * @return the default principal
219 */
220 public static Subject generateDefaultSubject(DefaultPrincipal defaultPrincipal, ClassLoader classLoader) throws DeploymentException {
221 if (defaultPrincipal == null) {
222 throw new GeronimoSecurityException("No DefaultPrincipal configuration supplied");
223 }
224 Subject defaultSubject = new Subject();
225 java.security.Principal principal;
226 java.security.Principal primaryPrincipal;
227
228 if (defaultPrincipal instanceof DefaultRealmPrincipal) {
229 DefaultRealmPrincipal defaultRealmPrincipal = (DefaultRealmPrincipal) defaultPrincipal;
230 principal = generateRealmPrincipal(defaultRealmPrincipal.getRealm(), defaultRealmPrincipal.getDomain(), defaultRealmPrincipal.getPrincipal(), classLoader);
231 primaryPrincipal = generatePrimaryRealmPrincipal(defaultRealmPrincipal.getRealm(), defaultRealmPrincipal.getDomain(), defaultRealmPrincipal.getPrincipal(), classLoader);
232 } else if (defaultPrincipal instanceof DefaultDomainPrincipal) {
233 DefaultDomainPrincipal defaultDomainPrincipal = (DefaultDomainPrincipal) defaultPrincipal;
234 principal = generateDomainPrincipal(defaultDomainPrincipal.getDomain(), defaultDomainPrincipal.getPrincipal(), classLoader);
235 primaryPrincipal = generatePrimaryDomainPrincipal(defaultDomainPrincipal.getDomain(), defaultDomainPrincipal.getPrincipal(), classLoader);
236 } else {
237 principal = generatePrincipal(defaultPrincipal.getPrincipal(), classLoader);
238 primaryPrincipal = generatePrimaryPrincipal(defaultPrincipal.getPrincipal(), classLoader);
239
240 }
241 defaultSubject.getPrincipals().add(principal);
242 defaultSubject.getPrincipals().add(primaryPrincipal);
243
244 Set namedUserPasswordCredentials = defaultPrincipal.getNamedUserPasswordCredentials();
245 if (namedUserPasswordCredentials != null) {
246 defaultSubject.getPrivateCredentials().addAll(namedUserPasswordCredentials);
247 }
248
249 return defaultSubject;
250 }
251
252
253 /**
254 * A simple helper method to register PolicyContextHandlers
255 *
256 * @param handler an object that implements the <code>PolicyContextHandler</code>
257 * interface. The value of this parameter must not be null.
258 * @param replace this boolean value defines the behavior of this method
259 * if, when it is called, a <code>PolicyContextHandler</code> has already
260 * been registered to handle the same key. In that case, and if the value
261 * of this argument is true, the existing handler is replaced with the
262 * argument handler. If the value of this parameter is false the existing
263 * registration is preserved and an exception is thrown.
264 */
265 public static void registerPolicyContextHandler(PolicyContextHandler handler, boolean replace) throws PolicyContextException {
266 String[] keys = handler.getKeys();
267
268 for (int i = 0; i < keys.length; i++) {
269 PolicyContext.registerHandler(keys[i], handler, replace);
270 }
271 }
272
273
274 }