1 /**
2 *
3 * Copyright 2003-2005 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.jacc;
19
20 import java.security.CodeSource;
21 import java.security.Permission;
22 import java.security.PermissionCollection;
23 import java.security.Policy;
24 import java.security.ProtectionDomain;
25 import javax.security.jacc.PolicyContext;
26 import javax.security.jacc.PolicyContextException;
27
28
29 /**
30 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
31 */
32 public class GeronimoPolicy extends Policy {
33 private final Policy root;
34 private GeronimoPolicyConfigurationFactory factory;
35 private boolean loaded;
36
37 public GeronimoPolicy() {
38 String provider = System.getProperty("org.apache.geronimo.jacc.policy.provider");
39
40 if (provider == null) {
41 root = Policy.getPolicy();
42 } else {
43 try {
44 Object obj = Class.forName(provider).newInstance();
45 if (obj instanceof Policy) {
46 root = (Policy) obj;
47 } else {
48 throw new RuntimeException(provider + "is not a type of java.security.Policy");
49 }
50 } catch (InstantiationException e) {
51 throw new RuntimeException("Unable to create an instance of " + provider, e);
52 } catch (IllegalAccessException e) {
53 throw new RuntimeException("Unable to create an instance of " + provider, e);
54 } catch (ClassNotFoundException e) {
55 throw new RuntimeException("Unable to create an instance of " + provider, e);
56 }
57 }
58 root.refresh();
59 }
60
61 public PermissionCollection getPermissions(CodeSource codesource) {
62
63 if (root != null) return root.getPermissions(codesource);
64
65 return null;
66 }
67
68 public void refresh() {
69 }
70
71 public boolean implies(ProtectionDomain domain, Permission permission) {
72
73 if (!loaded) {
74 factory = GeronimoPolicyConfigurationFactory.getSingleton();
75 loaded = true;
76 }
77
78 if (factory != null) {
79 String contextID = PolicyContext.getContextID();
80 if (contextID != null) {
81 try {
82 GeronimoPolicyConfiguration configuration = factory.getGeronimoPolicyConfiguration(contextID);
83
84 if (configuration.inService()) {
85 if (configuration.implies(domain, permission)) return true;
86 } else {
87 return false;
88 }
89 } catch (PolicyContextException e) {
90 }
91 }
92 }
93 if (root != null) return root.implies(domain, permission);
94
95 return false;
96 }
97 }