001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.felix.framework;
020
021 import java.lang.ref.WeakReference;
022 import java.net.MalformedURLException;
023 import java.net.URL;
024 import java.security.CodeSource;
025 import java.security.Permission;
026 import java.security.ProtectionDomain;
027 import java.security.cert.Certificate;
028
029 import org.apache.felix.moduleloader.IModule;
030
031 public class BundleProtectionDomain extends ProtectionDomain
032 {
033 private final WeakReference m_felix;
034 private final WeakReference m_bundle;
035 private final int m_hashCode;
036 private final String m_toString;
037 private final WeakReference m_module;
038
039 // TODO: SECURITY - This should probably take a module, not a bundle.
040 BundleProtectionDomain(Felix felix, BundleImpl bundle)
041 throws MalformedURLException
042 {
043 super(
044 new CodeSource(
045 Felix.m_secureAction.createURL(
046 Felix.m_secureAction.createURL(null, "location:", new FakeURLStreamHandler()),
047 bundle._getLocation(),
048 new FakeURLStreamHandler()
049 ),
050 (Certificate[]) null),
051 null);
052 m_felix = new WeakReference(felix);
053 m_bundle = new WeakReference(bundle);
054 m_module = new WeakReference(bundle.getCurrentModule());
055 m_hashCode = bundle.hashCode();
056 m_toString = "[" + bundle + "]";
057 }
058
059 IModule getModule()
060 {
061 return (IModule) m_module.get();
062 }
063
064 public boolean implies(Permission permission)
065 {
066 Felix felix = (Felix) m_felix.get();
067 return (felix != null) ?
068 felix.impliesBundlePermission(this, permission, false) : false;
069 }
070
071 public boolean impliesDirect(Permission permission)
072 {
073 Felix felix = (Felix) m_felix.get();
074 return (felix != null) ?
075 felix.impliesBundlePermission(this, permission, true) : false;
076 }
077
078 BundleImpl getBundle()
079 {
080 return (BundleImpl) m_bundle.get();
081 }
082
083 public int hashCode()
084 {
085 return m_hashCode;
086 }
087
088 public boolean equals(Object other)
089 {
090 if ((other == null) || (other.getClass() != BundleProtectionDomain.class))
091 {
092 return false;
093 }
094 if (m_hashCode != other.hashCode())
095 {
096 return false;
097 }
098 return m_bundle.get() == ((BundleProtectionDomain) other).m_bundle.get();
099 }
100
101 public String toString()
102 {
103 return m_toString;
104 }
105 }