package hudson.plugins.emailext.groovy.sandbox;
import org.jenkinsci.plugins.scriptsecurity.sandbox.Whitelist;
import org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.AbstractWhitelist;
import javax.annotation.CheckForNull;
import java.lang.ref.WeakReference;
/**
* A {@link Whitelist} that permits methods on specific object instances.
*/
public abstract class ObjectInstanceWhitelist<T> extends AbstractWhitelist {
private final WeakReference<T> instance;
protected ObjectInstanceWhitelist(T instance) {
this.instance = new WeakReference<>(instance);
}
protected synchronized boolean permitsInstance(@CheckForNull Object instance) {
return this.instance.get() == instance;
}
protected boolean isClass(Class<?> declaringClass) {
T t = instance.get();
if (t != null) {
Class c = t.getClass();
while (c != null && c != Object.class) {
if (declaringClass == c) {
return true;
} else {
if (isInterface(declaringClass, c.getInterfaces())) {
return true;
}
c = c.getSuperclass();
}
}
}
return false;
}
private boolean isInterface(Class<?> declaringClass, Class[] interfaces) {
for (Class interf : interfaces) {
if (declaringClass == interf) {
return true;
}
if (isInterface(declaringClass, interf.getInterfaces())) {
return true;
}
}
return false;
}
}