diff options
Diffstat (limited to 'java/jdk15/files/patch-plugin_DispatchImpl.java')
-rw-r--r-- | java/jdk15/files/patch-plugin_DispatchImpl.java | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/java/jdk15/files/patch-plugin_DispatchImpl.java b/java/jdk15/files/patch-plugin_DispatchImpl.java new file mode 100644 index 0000000..abb65a6 --- /dev/null +++ b/java/jdk15/files/patch-plugin_DispatchImpl.java @@ -0,0 +1,331 @@ +$FreeBSD$ + +--- ../../deploy/src/plugin/src/share/classes/sun/plugin/com/DispatchImpl.java 22 Oct 2003 23:04:20 -0000 1.1 ++++ ../../deploy/src/plugin/src/share/classes/sun/plugin/com/DispatchImpl.java 3 Dec 2004 03:56:58 -0000 1.2 +@@ -1,7 +1,7 @@ + /* +- * @(#)DispatchImpl.java 1.6 03/01/23 ++ * @(#)DispatchImpl.java 1.16 04/06/20 + * +- * Copyright 2003 Sun Microsystems, Inc. All rights reserved. ++ * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +@@ -9,8 +9,32 @@ + + import sun.plugin.util.Trace; + import sun.plugin.javascript.ocx.JSObject; +-import java.applet.Applet; ++import sun.plugin.liveconnect.JavaScriptProtectionDomain; + import sun.plugin.viewer.context.IExplorerAppletContext; ++import sun.plugin.security.PluginClassLoader; ++import java.applet.Applet; ++import java.net.URL; ++import java.net.MalformedURLException; ++import java.net.InetAddress; ++import java.net.UnknownHostException; ++import java.net.SocketPermission; ++import java.io.FilePermission; ++import java.io.File; ++import java.security.AccessControlContext; ++import java.security.AccessController; ++import java.security.CodeSource; ++import java.security.Policy; ++import java.security.ProtectionDomain; ++import java.security.AllPermission; ++import java.security.Permissions; ++import java.security.Permission; ++import java.security.PermissionCollection; ++import java.security.PrivilegedAction; ++import java.security.PrivilegedExceptionAction; ++import java.security.AccessControlException; ++import java.security.PrivilegedActionException; ++import sun.net.www.ParseUtil; ++import sun.security.util.SecurityConstants; + + /** + * DispatchImpl encapsulates a Java Object and provides Dispatch interface +@@ -22,14 +46,19 @@ + { + JavaClass targetClass = null; + Object targetObj = null; ++ int handle = 0; ++ int wndHandle = 0; ++ AccessControlContext context = null; ++ boolean isBridge = false; + + /* + * Constructor + * @param obj the object to be wrapped + */ +- public DispatchImpl(Object obj) ++ public DispatchImpl(Object obj, int id) + { + targetObj = obj; ++ handle = id; + } + + /** +@@ -40,19 +69,87 @@ + * @param params Arguments. + * @return Java object. + */ +- public Object invoke(int flag, int index, Object []params) ++ public Object invoke(final int flag, final int index, final Object []params) ++ throws Exception ++ { ++ try { ++ //No security constraints in case of ActiveX bridge application ++ if(isBridge) ++ return invokeImpl(flag, index, params); ++ ++ if(context == null) { ++ context = createContext(); ++ } ++ ++ // Invoke the method within the applet sand box security restricitions ++ return AccessController.doPrivileged( ++ new PrivilegedExceptionAction() { ++ public Object run() throws Exception{ ++ return invokeImpl(flag, index, params); ++ } ++ }, context ++ ); ++ }catch(Exception exc) { ++ Throwable cause = exc.getCause(); ++ if(cause == null) { ++ cause = exc; ++ } ++ ++ Trace.liveConnectPrintException(cause); ++ throw new Exception(cause.toString()); ++ } ++ } ++ ++ public AccessControlContext createContext() { ++ try { ++ ProtectionDomain[] domains = new ProtectionDomain[1]; ++ //Obtain the java code origin ++ ProtectionDomain pd = (ProtectionDomain)AccessController.doPrivileged(new PrivilegedAction() { ++ public Object run() { ++ return targetObj.getClass().getProtectionDomain(); ++ } ++ }); ++ ++ CodeSource cs = null; ++ URL url = null; ++ if(pd != null) ++ cs = pd.getCodeSource(); ++ if(cs != null) ++ url = cs.getLocation(); ++ ++ domains[0] = getJSProtectionDomain(url, targetObj.getClass()); ++ return new AccessControlContext(domains); ++ }catch(Exception exc) { ++ Trace.liveConnectPrintException(exc); ++ } ++ ++ return null; ++ } ++ ++ /** ++ * Invoke a method according to the method index. ++ * ++ * @param flag Invoke flag ++ * @param index Method index ++ * @param params Arguments. ++ * @return Java object. ++ */ ++ public Object invokeImpl(int flag, int index, Object []params) + throws Exception + { + Object retObj = null; + Dispatcher disp = null; + try { +- convertParams(params); ++ if(params != null) ++ convertParams(params); + disp = targetClass.getDispatcher(flag, index, params); +- return disp.invoke(targetObj, params); +- } +- catch (Throwable e) +- { +- //e.printStackTrace(); ++ if(disp != null) { ++ retObj = disp.invoke(targetObj, params); ++ if(retObj != null) ++ retObj = Utils.convertReturn(disp.getReturnType(), retObj, handle); ++ } ++ return retObj; ++ } catch (Throwable e) { + Throwable cause = e.getCause(); + if(cause == null) { + cause = e; +@@ -82,11 +179,39 @@ + return targetClass; + } + ++ public int getReturnType(int id){ ++ return targetClass.getReturnType(id); ++ } ++ ++ public int getIdForName(final String name) throws Exception{ ++ try { ++ //No security constraints in case of ActiveX bridge application ++ if(isBridge) ++ return getIdForNameImpl(name); ++ ++ if(context == null) { ++ context = createContext(); ++ } ++ ++ // Invoke the method within the applet sand box security restricitions ++ Integer retVal = (Integer)AccessController.doPrivileged( ++ new PrivilegedExceptionAction() { ++ public Object run() throws Exception{ ++ return new Integer(getIdForNameImpl(name)); ++ } ++ }, context ++ ); ++ return retVal.intValue(); ++ }catch(PrivilegedActionException pe) { ++ } ++ ++ return -1; ++ } + + /* + * + */ +- public int getIdForName(String name) throws Exception{ ++ public int getIdForNameImpl(String name) throws Exception{ + int id = -1; + + if(targetClass == null && targetObj != null) { +@@ -103,27 +228,122 @@ + } + + /* +- * ++ * Unwraps the wrapped java object arguments + */ + private void convertParams(Object []params) { + for(int i=0;i<params.length;i++) { + if(params[i] != null && params[i] instanceof DispatchImpl) { + params[i] = ((DispatchImpl)params[i]).getWrappedObject(); + } else if(params[i] != null && params[i] instanceof DispatchClient){ +- JSObject jsObj = new JSObject((DispatchClient)params[i]); +- jsObj.setIExplorerAppletContext((IExplorerAppletContext) ++ JSObject jsObj = null; ++ if (!isBridge) { ++ jsObj = new JSObject((DispatchClient)params[i]); ++ jsObj.setIExplorerAppletContext((IExplorerAppletContext) + ((Applet)targetObj).getAppletContext()); ++ } else { ++ jsObj = new JSObject((DispatchClient)params[i], handle); ++ } + params[i] = jsObj; + } + } + } + ++ /** ++ * Returns a protection domain that represents the default permission ++ * for a given URL. ++ * ++ * @param urlString URL ++ * @return protection domain. ++ */ ++ public static ProtectionDomain getJSProtectionDomain(URL url, Class clazz) ++ throws MalformedURLException { ++ ++ // Obtain default java applet policy ++ Policy policy = (Policy)AccessController.doPrivileged(new PrivilegedAction() { ++ public Object run() { ++ return Policy.getPolicy(); ++ } ++ }); ++ ++ CodeSource cs = new CodeSource(null, (java.security.cert.Certificate[])null); ++ final PermissionCollection pc = policy.getPermissions(cs); ++ if(url != null) { ++ Permission p; ++ String path = null; ++ try { ++ p = url.openConnection().getPermission(); ++ } catch (java.io.IOException ioe) { ++ p = null; ++ } ++ ++ if (p instanceof FilePermission) { ++ path = p.getName(); ++ } else if ((p == null) && (url.getProtocol().equals("file"))) { ++ path = url.getFile().replace('/', File.separatorChar); ++ path = ParseUtil.decode(path); ++ } else if (p instanceof SocketPermission) { ++ /* ++ Socket permission to connect back to the host ++ */ ++ String host = url.getHost(); ++ pc.add(new SocketPermission(host, ++ SecurityConstants.SOCKET_CONNECT_ACCEPT_ACTION)); ++ } ++ ++ if(path != null && ++ (clazz.getClassLoader() instanceof PluginClassLoader)) { ++ //We need to add an additional permission to read recursively ++ if (path.endsWith(File.separator)) { ++ path += "-"; ++ } else { ++ int endIndex = path.lastIndexOf(File.separatorChar); ++ if (endIndex != -1) ++ path = path.substring(0, endIndex+1) + "-"; ++ } ++ ++ pc.add(new FilePermission(path, SecurityConstants.FILE_READ_ACTION)); ++ ++ /* ++ Socket permission to connect back to the "localhost" ++ */ ++ pc.add(new SocketPermission("localhost", ++ SecurityConstants.SOCKET_CONNECT_ACCEPT_ACTION)); ++ AccessController.doPrivileged(new PrivilegedAction() { ++ public Object run() { ++ try { ++ String host = InetAddress.getLocalHost().getHostName(); ++ pc.add(new SocketPermission(host, ++ SecurityConstants.SOCKET_CONNECT_ACCEPT_ACTION)); ++ } catch (UnknownHostException uhe) { ++ } ++ return null; ++ } ++ }); ++ } ++ } ++ ++ return new JavaScriptProtectionDomain(pc); ++ } ++ + public String toString() { + if(targetObj != null) { + return targetObj.toString(); + } + return null; + } ++ ++ public int getWindowHandle() { ++ if(wndHandle == 0) { ++ wndHandle = getWindowHandle(handle); ++ } ++ return wndHandle; ++ } ++ ++ protected void setBridge() { ++ isBridge = true; ++ } ++ ++ native int getWindowHandle(int id); + } + + |