|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.openide.execution;
import org.netbeans.junit.*;
import junit.textui.TestRunner;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.LocalFileSystem;
import java.net.URL;
import java.net.URLConnection;
import java.security.Permission;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.File;
import java.util.Arrays;
import java.net.URLClassLoader;
/** Test NbClassLoader.
* @author Jesse Glick
*/
public class NbClassLoaderTest extends NbTestCase {
public NbClassLoaderTest(String name) {
super(name);
}
public static void main(String[] args) {
TestRunner.run(new NbTestSuite(NbClassLoaderTest.class));
}
/** Ensure that a user-mode class can at least use findResource() to access
* resources in filesystems.
* @see "#13038"
*/
public void testUsingNbfsProtocol() throws Exception {
System.setProperty("org.netbeans.core.Plain.CULPRIT", "true");
File here = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getFile());
assertTrue("Classpath really contains " + here,
new File(new File(new File(new File(here, "org"), "openide"), "execution"), "NbClassLoaderTest.class").canRead());
File dataDir = new File(new File(new File(new File(here, "org"), "openide"), "execution"), "data");
if(!dataDir.exists()) {
dataDir.mkdir();
}
File fooFile = new File(dataDir, "foo.xml");
if(!fooFile.exists()) {
fooFile.createNewFile();
}
LocalFileSystem lfs = new LocalFileSystem();
lfs.setRootDirectory(here);
lfs.setReadOnly(true);
ClassLoader cl = new NbClassLoader(new FileObject[] {lfs.getRoot()}, ClassLoader.getSystemClassLoader().getParent(), null);
System.setSecurityManager(new MySecurityManager());
// Ensure this class at least has free access:
System.getProperty("foo");
Class c = cl.loadClass("org.openide.execution.NbClassLoaderTest$User");
assertEquals(cl, c.getClassLoader());
try {
c.newInstance();
} catch (ExceptionInInitializerError eiie) {
Throwable t = eiie.getException();
if (t instanceof IllegalStateException) {
fail(t.getMessage());
} else if (t instanceof Exception) {
throw (Exception)t;
} else {
throw new Exception(t.toString());
}
}
}
public static final class User {
public User() throws Exception {
URLClassLoader ncl = (URLClassLoader)getClass().getClassLoader();
URL[] urls = ncl.getURLs();
if (urls.length != 1) throw new IllegalStateException("Weird URLs: " + Arrays.asList(urls));
URL manual = new URL(urls[0], "org/openide/execution/data/foo.xml");
URLConnection uc = manual.openConnection();
uc.connect();
String ct = uc.getContentType();
/* May now be a file: URL, in which case content type is hard to control:
if (!"text/xml".equals(ct)) throw new IllegalStateException("Wrong content type (manual): " + ct);
*/
URL auto = getClass().getResource("data/foo.xml");
if (auto == null) throw new IllegalStateException("Could not load data/foo.xml; try uncommenting se.printStackTrace() in MySecurityManager.checkPermission");
uc = auto.openConnection();
uc.connect();
ct = uc.getContentType();
/* Ditto:
if (!"text/xml".equals(ct)) throw new IllegalStateException("Wrong content type (auto): " + ct);
*/
// Ensure this class does *not* have free access to random permissions:
try {
System.getProperty("foo");
throw new IllegalStateException("Was permitted to access sys prop foo");
} catch (SecurityException se) {
// good
}
}
}
private static final class MySecurityManager extends SecurityManager {
public void checkPermission(Permission p) {
//System.err.println("cP: " + p);
if (ok()) {/*System.err.println("ok");*/return;}
try {
super.checkPermission(p);
} catch (SecurityException se) {
//se.printStackTrace();
//System.err.println("classes: " + Arrays.asList(getClassContext()));
throw se;
}
}
public void checkPermission(Permission p, Object c) {
if (ok()) {/*System.err.println("ok");*/return;}
super.checkPermission(p, c);
}
public void checkRead(String file) {
// Do not honor file read checks. TopSecurityManager actually leaves
// this blank for performance, but in fact very little would work if
// we restricted reads. nbfs: protocols would be useless, meaning user
// classes would not be able to load resources. This could be solved if
// necessary by creating a special kind of FilePermission returned from
// FileURL; it would be recognized by TSM.checkPermission and accepted.
}
private boolean ok() {
Class[] cs = getClassContext();
int i = 0;
while (i < cs.length && cs[i] == MySecurityManager.class) i++;
for (; i < cs.length; i++) {
if (cs[i] == MySecurityManager.class) {
// avoid recursion
return true;
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
new Exception().printStackTrace(new PrintStream(baos));
if (baos.toString().indexOf("\tat java.security.AccessController.doPrivileged") != -1) {
// Cheap check for privileged actions.
// For some reason AccessController does not appear in the classContext
// (perhaps because it is a native method?).
return true;
}
for (int j = 0; j < cs.length; j++) {
if (cs[j].getClassLoader() instanceof NbClassLoader) {
return false;
}
}
return true;
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.