001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: /**
019: * @author Alexey V. Varlamov
020: * @version $Revision$
021: */package org.apache.harmony.security;
022:
023: import java.net.URL;
024: import java.security.CodeSigner;
025: import java.security.CodeSource;
026: import java.security.Permission;
027: import java.security.Principal;
028: import java.util.Collection;
029: import java.util.Collections;
030:
031: import org.apache.harmony.security.fortress.PolicyUtils;
032:
033: /**
034: * This class represents an elementary block of a security policy. It associates
035: * a CodeSource of an executable code, Principals allowed to execute the code,
036: * and a set of granted Permissions.
037: *
038: * @see org.apache.harmony.security.DefaultPolicy
039: */
040: public class PolicyEntry {
041:
042: // Store CodeSource
043: private final CodeSource cs;
044:
045: // Array of principals
046: private final Principal[] principals;
047:
048: // Permissions collection
049: private final Collection<Permission> permissions;
050:
051: /**
052: * Constructor with initialization parameters. Passed collections are not
053: * referenced directly, but copied.
054: */
055: public PolicyEntry(CodeSource cs,
056: Collection<? extends Principal> prs,
057: Collection<? extends Permission> permissions) {
058: this .cs = (cs != null) ? normalizeCodeSource(cs) : null;
059: this .principals = (prs == null || prs.isEmpty()) ? null
060: : (Principal[]) prs.toArray(new Principal[prs.size()]);
061: this .permissions = (permissions == null || permissions
062: .isEmpty()) ? null : Collections
063: .unmodifiableCollection(permissions);
064: }
065:
066: /**
067: * Checks if passed CodeSource matches this PolicyEntry. Null CodeSource of
068: * PolicyEntry implies any CodeSource; non-null CodeSource forwards to its
069: * imply() method.
070: */
071: public boolean impliesCodeSource(CodeSource codeSource) {
072: if (cs == null) {
073: return true;
074: }
075:
076: if (codeSource == null) {
077: return false;
078: }
079: return cs.implies(normalizeCodeSource(codeSource));
080: }
081:
082: private CodeSource normalizeCodeSource(CodeSource codeSource) {
083: URL codeSourceURL = PolicyUtils.normalizeURL(codeSource
084: .getLocation());
085: CodeSource result = codeSource;
086:
087: if (codeSourceURL != codeSource.getLocation()) {
088: // URL was normalized - recreate codeSource with new URL
089: CodeSigner[] signers = codeSource.getCodeSigners();
090: if (signers == null) {
091: result = new CodeSource(codeSourceURL, codeSource
092: .getCertificates());
093: } else {
094: result = new CodeSource(codeSourceURL, signers);
095: }
096: }
097: return result;
098: }
099:
100: /**
101: * Checks if specified Principals match this PolicyEntry. Null or empty set
102: * of Principals of PolicyEntry implies any Principals; otherwise specified
103: * array must contain all Principals of this PolicyEntry.
104: */
105: public boolean impliesPrincipals(Principal[] prs) {
106: return PolicyUtils.matchSubset(principals, prs);
107: }
108:
109: /**
110: * Returns unmodifiable collection of permissions defined by this
111: * PolicyEntry, may be <code>null</code>.
112: */
113: public Collection<Permission> getPermissions() {
114: return permissions;
115: }
116:
117: /**
118: * Returns true if this PolicyEntry defines no Permissions, false otherwise.
119: */
120: public boolean isVoid() {
121: return permissions == null || permissions.size() == 0;
122: }
123: }
|