You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by da...@apache.org on 2012/10/18 17:35:04 UTC

svn commit: r1399698 - in /aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly: ProviderBundleTrackerCustomizer.java Util.java

Author: davidb
Date: Thu Oct 18 15:35:04 2012
New Revision: 1399698

URL: http://svn.apache.org/viewvc?rev=1399698&view=rev
Log:
Implement the security requirements of the ServiceLoader Mediator spec implementation in SPI Fly.

Modified:
    aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java
    aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java

Modified: aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java
URL: http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java?rev=1399698&r1=1399697&r2=1399698&view=diff
==============================================================================
--- aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java (original)
+++ aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/ProviderBundleTrackerCustomizer.java Thu Oct 18 15:35:04 2012
@@ -177,11 +177,9 @@ public class ProviderBundleTrackerCustom
                             SecurityManager sm = System.getSecurityManager();
                             if (sm != null) {
                                 if (bundle.hasPermission(new ServicePermission(registrationClassName, ServicePermission.REGISTER))) {
-                                    System.err.println("*** Found security manager and bundle has permission to register: " + bundle);
                                     reg = bundle.getBundleContext().registerService(
                                             registrationClassName, new ProviderServiceFactory(cls), properties);
                                 } else {
-                                    System.err.println("*** Found security manager and bundle has NO permission to register: " + bundle);
                                     log(LogService.LOG_INFO, "Bundle " + bundle + " does not have the permission to register services of type: " + registrationClassName);
                                 }
                             } else {

Modified: aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java
URL: http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java?rev=1399698&r1=1399697&r2=1399698&view=diff
==============================================================================
--- aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java (original)
+++ aries/trunk/spi-fly/spi-fly-core/src/main/java/org/apache/aries/spifly/Util.java Thu Oct 18 15:35:04 2012
@@ -22,6 +22,8 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.URL;
 import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Enumeration;
@@ -48,13 +50,25 @@ public class Util {
 
     // Provided as static method to make it easier to call from ASM-modified code
     public static void storeContextClassloader() {
-        storedClassLoaders.set(Thread.currentThread().getContextClassLoader());
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            @Override
+            public Void run() {
+                storedClassLoaders.set(Thread.currentThread().getContextClassLoader());
+                return null;
+            }
+        });
     }
 
     // Provided as static method to make it easier to call from ASM-modified code
     public static void restoreContextClassloader() {
-        Thread.currentThread().setContextClassLoader(storedClassLoaders.get());
-        storedClassLoaders.set(null);
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            @Override
+            public Void run() {
+                Thread.currentThread().setContextClassLoader(storedClassLoaders.get());
+                storedClassLoaders.set(null);
+                return null;
+            }
+        });
     }
 
     public static void fixContextClassloader(String cls, String method, Class<?> clsArg, ClassLoader bundleLoader) {
@@ -65,10 +79,16 @@ public class Util {
 
         BundleReference br = ((BundleReference) bundleLoader);
 
-        ClassLoader cl = findContextClassloader(br.getBundle(), cls, method, clsArg);
+        final ClassLoader cl = findContextClassloader(br.getBundle(), cls, method, clsArg);
         if (cl != null) {
             BaseActivator.activator.log(LogService.LOG_INFO, "Temporarily setting Thread Context Classloader to: " + cl);
-            Thread.currentThread().setContextClassLoader(cl);
+            AccessController.doPrivileged(new PrivilegedAction<Void>() {
+                @Override
+                public Void run() {
+                    Thread.currentThread().setContextClassLoader(cl);
+                    return null;
+                }
+            });
         } else {
             BaseActivator.activator.log(LogService.LOG_WARNING, "No classloader found for " + cls + ":" + method + "(" + clsArg + ")");
         }
@@ -127,8 +147,17 @@ public class Util {
         }
     }
 
+    private static ClassLoader getBundleClassLoader(final Bundle b) {
+        return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+            @Override
+            public ClassLoader run() {
+                return getBundleClassLoaderPrivileged(b);
+            }
+        });
+    }
+
     @SuppressWarnings("unchecked")
-    private static ClassLoader getBundleClassLoader(Bundle b) {
+    private static ClassLoader getBundleClassLoaderPrivileged(Bundle b) {
         // In 4.3 this can be done much easier by using the BundleWiring, but we want this code to
         // be 4.2 compliant.
         // Here we're just finding any class in the bundle, load that and then use its classloader.