/* * @(#)NetscapeSecurity.java 1.9 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import java.util.Hashtable; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; public class NetscapeSecurity implements JMFSecurity { public static JMFSecurity security; private static Method enablePrivilege; private static Class privilegeManager; //private static ClassLoader cl =null; private static boolean linkEnabled = true; private static Object [] readPropArgs = new Object[] {"UniversalPropertyRead"}; private static Object [] readFileArgs = new Object[] {"UniversalFileRead"}; private static Object [] writeFileArgs = new Object[] {"UniversalFileWrite"}; private static Object [] deleteFileArgs = new Object[] {"UniversalFileDelete"}; private static Object [] threadArgs = new Object[] {"UniversalThreadAccess"}; private static Object [] threadGroupArgs = new Object[] {"UniversalThreadGroupAccess"}; private static Object [] linkArgs = new Object[] {"UniversalLinkAccess"}; private static Object [] connectArgs = new Object[] {"UniversalConnectWithRedirect"}; public static Object [] windowArgs = new Object[] {"UniversalTopLevelWindow"}; public static Object [] multicastArgs = new Object[] {"UniversalMulticast"}; private static Hashtable table = new Hashtable(); static { security = new NetscapeSecurity(); try { privilegeManager = Class.forName("netscape.security.PrivilegeManager"); enablePrivilege = privilegeManager.getMethod("enablePrivilege", new Class[] {String.class}); //cl =(Class.forName("javax.media.JMFSecurity")).getClassLoader(); } catch (ClassNotFoundException e) { System.err.println("NetscapeSecurity: Cannot find class netscape.security.PrivilegeManager"); } catch (Exception e) { System.out.println(e); } table.put(new Integer(JMFSecurity.READ_PROPERTY), readPropArgs); table.put(new Integer(JMFSecurity.READ_FILE), readFileArgs); table.put(new Integer(JMFSecurity.WRITE_FILE), writeFileArgs); table.put(new Integer(JMFSecurity.DELETE_FILE), deleteFileArgs); table.put(new Integer(JMFSecurity.THREAD), threadArgs); table.put(new Integer(JMFSecurity.THREAD_GROUP), threadGroupArgs); table.put(new Integer(JMFSecurity.LINK), linkArgs); table.put(new Integer(JMFSecurity.CONNECT), connectArgs); table.put(new Integer(JMFSecurity.TOP_LEVEL_WINDOW), windowArgs); table.put(new Integer(JMFSecurity.MULTICAST), multicastArgs); } private Method methodArray[] = new Method[1]; private Class classArray[] = new Class[1]; private Object arguments[][] = new Object[1][0]; private NetscapeSecurity() { } // Disabled security and Netscape security can be invoked using // reflection. The jmf-security- prefix can be used to // treat them as a group. You don't have to check for netscape // or disabled. public String getName() { return "jmf-security-netscape"; } public void requestPermission(Method[] m, Class[] c, Object[][] args, int request) throws SecurityException { //if ( (enablePrivilege == null) || (cl != null) ) { if (enablePrivilege == null) { throw new SecurityException("Cannot request permission"); } m[0] = enablePrivilege; c[0] = privilegeManager; Object value = table.get(new Integer(request)); if (value == null) { throw new SecurityException("Permission previously denied by user " + request); } args[0] = (Object[]) value; } // Netscape will not use this parameter. public void requestPermission(Method[] m, Class[] c, Object[][] args, int request, String parameter) throws SecurityException { requestPermission(m, c, args, request); } public boolean isLinkPermissionEnabled() { return linkEnabled; } public void permissionFailureNotification(int permission) { table.remove(new Integer(permission)); } public void loadLibrary(String name) throws UnsatisfiedLinkError { try { if (linkEnabled) { requestPermission(methodArray, classArray, arguments, JMFSecurity.LINK); } else { throw new UnsatisfiedLinkError("No LINK privilege"); } methodArray[0].invoke(classArray[0], arguments[0]); System.loadLibrary(name); } catch (Exception e) { linkEnabled = false; // LINK permission should be removed from the interface as it is not useful permissionFailureNotification(JMFSecurity.LINK); throw new UnsatisfiedLinkError("Unable to get " + name + " privilege " + e); } } }