build>full

git-svn-id: svn://svn.jdownloader.org/jdownloader/trunk@35418 ebf7c1c2-ba36-0410-9fe8-c592906822b4

Former-commit-id: bcddd22ac8d0179b73a7795432c625a5b2f75540
This commit is contained in:
coalado 2016-11-15 16:00:25 +00:00
parent bd6c1a4c54
commit 572e1c8762
17 changed files with 146 additions and 94 deletions

View File

@ -55,6 +55,9 @@ public interface CaptchaAPI extends RemoteAPIInterface {
@APIParameterNames({ "id", "result" })
public boolean solve(final long id, String result) throws InvalidCaptchaIDException, InvalidChallengeTypeException;
@APIParameterNames({ "id", "result", "resultFormat" })
public boolean solve(final long id, String result, String resultFormat) throws InvalidCaptchaIDException, InvalidChallengeTypeException;
@Deprecated
/**
* @deprecated use #skip(id,type) instead

View File

@ -6,10 +6,10 @@ import org.appwork.remoteapi.events.EventObject;
import org.appwork.remoteapi.events.EventPublisher;
import org.appwork.remoteapi.events.RemoteAPIEventsSender;
import org.appwork.remoteapi.events.SimpleEventObject;
import org.jdownloader.captcha.v2.Challenge;
import org.jdownloader.captcha.v2.solverjob.SolverJob;
public class CaptchaAPIEventPublisher implements EventPublisher {
private enum EVENTID {
NEW,
DONE;
@ -58,9 +58,9 @@ public class CaptchaAPIEventPublisher implements EventPublisher {
}
}
public void fireNewJobEvent(SolverJob<?> job) {
public void fireNewJobEvent(SolverJob<?> job, Challenge<?> challenge) {
if (hasSubscriptionFor(EVENTID.NEW.name())) {
final EventObject eventObject = new SimpleEventObject(this, EVENTID.NEW.name(), job.getChallenge().getId().getID());
final EventObject eventObject = new SimpleEventObject(this, EVENTID.NEW.name(), challenge.getId().getID());
for (final RemoteAPIEventsSender eventSender : eventSenders) {
eventSender.publishEvent(eventObject, null);
}
@ -76,5 +76,4 @@ public class CaptchaAPIEventPublisher implements EventPublisher {
public synchronized void unregister(RemoteAPIEventsSender eventsAPI) {
eventSenders.remove(eventsAPI);
}
}

View File

@ -30,7 +30,6 @@ import org.jdownloader.captcha.v2.challenge.stringcaptcha.ImageCaptchaChallenge;
import org.jdownloader.captcha.v2.solver.jac.SolverException;
import org.jdownloader.captcha.v2.solver.service.DialogSolverService;
import org.jdownloader.captcha.v2.solverjob.SolverJob;
import org.jdownloader.plugins.SkipReason;
import jd.controlling.captcha.SkipException;
import jd.controlling.captcha.SkipRequest;
@ -77,13 +76,11 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
@Override
public void solve(final SolverJob<Object> job) throws InterruptedException, SolverException, SkipException {
Challenge<?> challenge = job.getChallenge();
// ensure that getChallenge(job) is never null;
if (challenge instanceof RecaptchaV2Challenge) {
if (((RecaptchaV2Challenge) challenge).createBasicCaptchaChallenge() == null) {
throw new SolverException(SkipReason.PHANTOM_JS_MISSING.getExplanation(null));
}
}
job.getLogger().info("Fire MyJDownloader Captcha Event");
if (challenge instanceof RecaptchaV2Challenge) {
// create fallback challenge here. we do not want to block later
((RecaptchaV2Challenge) challenge).createBasicCaptchaChallenge();
}
eventSender.fireEvent(new CaptchaAPISolverEvent(this) {
@Override
public void sendTo(CaptchaAPISolverListener listener) {
@ -91,7 +88,7 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
}
});
MyJDownloaderController.getInstance().pushCaptchaFlag(true);
eventPublisher.fireNewJobEvent(job);
eventPublisher.fireNewJobEvent(job, challenge);
if (Application.isHeadless() || !DialogSolverService.getInstance().isEnabled()) {
// in headless mode, we should wait, because we have no gui dialog
job.getLogger().info("Wait for Answer");
@ -131,8 +128,21 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
if (entry.isDone()) {
continue;
}
final Challenge<?> challenge = getChallenge(entry);
if (challenge instanceof ImageCaptchaChallenge) {
Challenge<?> challenge = entry.getChallenge();
if (challenge instanceof RecaptchaV2Challenge) {
CaptchaJob job = new CaptchaJob();
Class<?> cls = challenge.getClass();
while (cls != null && StringUtils.isEmpty(job.getType())) {
job.setType(cls.getSimpleName());
cls = cls.getSuperclass();
}
job.setID(challenge.getId().getID());
job.setHoster(challenge.getPlugin().getHost());
job.setCaptchaCategory(challenge.getTypeID());
job.setTimeout(challenge.getTimeout());
job.setCreated(challenge.getCreated());
ret.add(job);
} else if (challenge instanceof ImageCaptchaChallenge) {
final CaptchaJob job = new CaptchaJob();
Class<?> cls = challenge.getClass();
while (cls != null && StringUtils.isEmpty(job.getType())) {
@ -168,12 +178,12 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
}
public void get(RemoteAPIRequest request, RemoteAPIResponse response, long id, String format) throws InternalApiException, InvalidCaptchaIDException {
final SolverJob<?> job = ChallengeResponseController.getInstance().getJobById(id);
final SolverJob<?> job = getJobByChallengeId(id);
if (job == null || job.isDone()) {
throw new InvalidCaptchaIDException();
}
try {
final Challenge<?> challenge = getChallenge(job);
final Challenge<?> challenge = job.getChallenge();
final OutputStream out = RemoteAPI.getOutputStream(response, request, RemoteAPI.gzip(request), true);
try {
final HashMap<String, Object> captchaResponseData = new HashMap<String, Object>();
@ -194,13 +204,8 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
}
}
private Challenge<?> getChallenge(SolverJob<?> job) {
final Challenge<?> challenge = job.getChallenge();
if (challenge instanceof RecaptchaV2Challenge) {
return ((RecaptchaV2Challenge) challenge).createBasicCaptchaChallenge();
} else {
return challenge;
}
private SolverJob<?> getJobByChallengeId(long id) {
return ChallengeResponseController.getInstance().getJobByChallengeId(id);
}
public boolean isJobDone(final SolverJob<?> job) {
@ -225,14 +230,18 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
return MyJDownloaderController.getInstance().isActive();
}
@SuppressWarnings("unchecked")
public boolean solve(long id, String result) throws InvalidCaptchaIDException, InvalidChallengeTypeException {
final SolverJob<?> job = ChallengeResponseController.getInstance().getJobById(id);
return solve(id, result, null);
}
@SuppressWarnings("unchecked")
public boolean solve(long id, String result, String resultFormat) throws InvalidCaptchaIDException, InvalidChallengeTypeException {
final SolverJob<?> job = getJobByChallengeId(id);
if (job == null || job.isDone()) {
throw new InvalidCaptchaIDException();
}
final Challenge<?> challenge = getChallenge(job);
final AbstractResponse<?> ret = challenge.parseAPIAnswer(result, this);
final Challenge<?> challenge = job.getChallenge();
final AbstractResponse<?> ret = challenge.parseAPIAnswer(result, resultFormat, this);
if (ret != null) {
((SolverJob<Object>) job).addAnswer((AbstractResponse<Object>) ret);
} else {
@ -248,7 +257,7 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
@SuppressWarnings("static-access")
public boolean skip(long id, SkipRequest type) throws InvalidCaptchaIDException {
final SolverJob<Object> job = (SolverJob<Object>) ChallengeResponseController.getInstance().getJobById(id);
final SolverJob<Object> job = (SolverJob<Object>) ChallengeResponseController.getInstance().getJobByChallengeId(id);
if (job == null) {
throw new InvalidCaptchaIDException();
}
@ -264,12 +273,12 @@ public class CaptchaAPISolver extends ChallengeSolver<Object> implements Captcha
@Override
public CaptchaJob getCaptchaJob(long id) {
final SolverJob<?> entry = ChallengeResponseController.getInstance().getJobById(id);
final SolverJob<?> entry = getJobByChallengeId(id);
if (entry == null) {
return null;
}
final CaptchaJob ret = new CaptchaJob();
final Challenge<?> challenge = getChallenge(entry);
final Challenge<?> challenge = entry.getChallenge();
Class<?> cls = challenge.getClass();
while (cls != null && StringUtils.isEmpty(ret.getType())) {
ret.setType(cls.getSimpleName());

View File

@ -259,7 +259,7 @@ public abstract class Challenge<T> {
return null;
}
public AbstractResponse<T> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
public AbstractResponse<T> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
return null;
}

View File

@ -202,9 +202,9 @@ public class ChallengeResponseController {
eventSender.fireEvent(new ChallengeResponseEvent(this, ChallengeResponseEvent.Type.JOB_DONE, job));
}
private final List<ChallengeSolver<?>> solverList = new CopyOnWriteArrayList<ChallengeSolver<?>>();
private final List<SolverJob<?>> activeJobs = new ArrayList<SolverJob<?>>();
private final HashMap<UniqueAlltimeID, SolverJob<?>> idToJobMap = new HashMap<UniqueAlltimeID, SolverJob<?>>();
private final List<ChallengeSolver<?>> solverList = new CopyOnWriteArrayList<ChallengeSolver<?>>();
private final List<SolverJob<?>> activeJobs = new ArrayList<SolverJob<?>>();
private final HashMap<UniqueAlltimeID, SolverJob<?>> challengeIDToJobMap = new HashMap<UniqueAlltimeID, SolverJob<?>>();
/**
* When one job gets a skiprequest, we have to check all pending jobs if this skiprequest affects them as well. if so, we have to skip
@ -242,10 +242,10 @@ public class ChallengeResponseController {
final SolverJob<T> job = new SolverJob<T>(this, c, solver);
job.setLogger(logger);
c.initController(job);
final UniqueAlltimeID jobID = c.getId();
final UniqueAlltimeID challengeID = c.getId();
synchronized (activeJobs) {
activeJobs.add(job);
idToJobMap.put(jobID, job);
challengeIDToJobMap.put(challengeID, job);
}
try {
for (final ChallengeSolver<T> cs : solver) {
@ -293,7 +293,7 @@ public class ChallengeResponseController {
try {
synchronized (activeJobs) {
activeJobs.remove(job);
idToJobMap.remove(jobID);
challengeIDToJobMap.remove(challengeID);
}
} finally {
fireJobDone(job);
@ -317,9 +317,9 @@ public class ChallengeResponseController {
return ret;
}
public SolverJob<?> getJobById(long id) {
synchronized (idToJobMap) {
return idToJobMap.get(new UniqueAlltimeID(id));
public SolverJob<?> getJobByChallengeId(long id) {
synchronized (challengeIDToJobMap) {
return challengeIDToJobMap.get(new UniqueAlltimeID(id));
}
}

View File

@ -19,8 +19,8 @@ public class ClickCaptchaChallenge extends ImageCaptchaChallenge<ClickedPoint> {
}
@Override
public AbstractResponse<ClickedPoint> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
ClickedPoint res = JSonStorage.restoreFromString(json, new TypeRef<ClickedPoint>() {
public AbstractResponse<ClickedPoint> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
ClickedPoint res = JSonStorage.restoreFromString(result, new TypeRef<ClickedPoint>() {
});
return new ClickCaptchaResponse(this, solver, res, 100);

View File

@ -91,10 +91,10 @@ public class KeyCaptchaCategoryChallenge extends Challenge<String> {
}
@Override
public AbstractResponse<String> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
public AbstractResponse<String> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
final String token;
try {
token = helper.sendCategoryResult(JSonStorage.restoreFromString(json, TypeRef.STRING));
token = helper.sendCategoryResult(JSonStorage.restoreFromString(result, TypeRef.STRING));
} catch (Exception e) {
throw new WTFException(e);
}

View File

@ -60,8 +60,8 @@ public class KeyCaptchaPuzzleChallenge extends Challenge<String> {
}
@Override
public AbstractResponse<String> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
final KeyCaptchaApiResponse response = JSonStorage.restoreFromString(json, new TypeRef<KeyCaptchaApiResponse>() {
public AbstractResponse<String> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
final KeyCaptchaApiResponse response = JSonStorage.restoreFromString(result, new TypeRef<KeyCaptchaApiResponse>() {
});
final String token;
try {

View File

@ -311,16 +311,16 @@ public abstract class AbstractRecaptcha2FallbackChallenge extends BasicCaptchaCh
}
@Override
public AbstractResponse<String> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
public AbstractResponse<String> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
try {
if ("-".equals(json) || "".equals(json) || "0".equals(json)) {
if ("-".equals(result) || "".equals(result) || "0".equals(result)) {
CaptchaResponse r = new CaptchaResponse(this, solver, "0", 100);
return r;
}
HashSet<Integer> ret = new HashSet<Integer>();
String clean = json.replaceAll("[^\\d,]", "");
String clean = result.replaceAll("[^\\d,]", "");
clean = clean.replaceAll("[,]+$", "");
boolean bad = !clean.equals(json);
boolean bad = !clean.equals(result);
final StringBuilder sb = new StringBuilder();
final HashSet<String> dupe = new HashSet<String>();
while (clean.length() > 0) {

View File

@ -8,14 +8,17 @@ import org.appwork.exceptions.WTFException;
import org.appwork.net.protocol.http.HTTPConstants;
import org.appwork.net.protocol.http.HTTPConstants.ResponseCode;
import org.appwork.remoteapi.exceptions.RemoteAPIException;
import org.appwork.storage.Storable;
import org.appwork.utils.IO;
import org.appwork.utils.StringUtils;
import org.appwork.utils.net.HTTPHeader;
import org.appwork.utils.net.httpserver.requests.GetRequest;
import org.appwork.utils.net.httpserver.responses.HttpResponse;
import org.jdownloader.captcha.v2.AbstractResponse;
import org.jdownloader.captcha.v2.ChallengeSolver;
import org.jdownloader.captcha.v2.challenge.recaptcha.v2.phantomjs.Recaptcha2FallbackChallengeViaPhantomJS;
import org.jdownloader.captcha.v2.challenge.stringcaptcha.BasicCaptchaChallenge;
import org.jdownloader.captcha.v2.challenge.stringcaptcha.CaptchaResponse;
import org.jdownloader.captcha.v2.solver.browser.AbstractBrowserChallenge;
import org.jdownloader.captcha.v2.solver.browser.BrowserReference;
import org.jdownloader.captcha.v2.solver.browser.BrowserViewport;
@ -28,17 +31,89 @@ import jd.http.Browser;
import jd.plugins.Plugin;
public class RecaptchaV2Challenge extends AbstractBrowserChallenge {
public static final String RAWTOKEN = "rawtoken";
public static final String RECAPTCHAV2 = "recaptchav2";
private final String siteKey;
private volatile BasicCaptchaChallenge basicChallenge;
private final String siteDomain;
private final String siteUrl;
private final String secureToken;
private String contextUrl;
public String getContextUrl() {
return contextUrl;
}
public void setContextUrl(String contextUrl) {
this.contextUrl = contextUrl;
}
public String getSiteKey() {
return siteKey;
}
public static class RecaptchaV2APIStorable implements Storable {
public RecaptchaV2APIStorable() {
}
private String stoken;
public String getStoken() {
return stoken;
}
public void setStoken(String stoken) {
this.stoken = stoken;
}
public String getSiteKey() {
return siteKey;
}
public void setSiteKey(String siteKey) {
this.siteKey = siteKey;
}
public String getContextUrl() {
return contextUrl;
}
public void setContextUrl(String contextUrl) {
this.contextUrl = contextUrl;
}
private String siteKey;
private String contextUrl;
}
@Override
public AbstractResponse<String> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
if (RAWTOKEN.equals(resultFormat)) {
return new CaptchaResponse(this, solver, result, 100);
}
BasicCaptchaChallenge basic = createBasicCaptchaChallenge();
if (basic != null) {
return basic.parseAPIAnswer(result, resultFormat, solver);
}
return super.parseAPIAnswer(result, resultFormat, solver);
}
@Override
public Object getAPIStorable(String format) throws Exception {
if (RAWTOKEN.equals(format)) {
RecaptchaV2APIStorable ret = new RecaptchaV2APIStorable();
ret.setSiteKey(getSiteKey());
ret.setContextUrl(contextUrl);
ret.setStoken(getSecureToken());
return ret;
}
BasicCaptchaChallenge basic = createBasicCaptchaChallenge();
if (basic != null) {
return basic.getAPIStorable(format);
}
return super.getAPIStorable(format);
}
@Override
public BrowserViewport getBrowserViewport(BrowserWindow screenResource, Rectangle elementBounds) {
Rectangle rect = null;
@ -74,6 +149,7 @@ public class RecaptchaV2Challenge extends AbstractBrowserChallenge {
this.pluginBrowser = br;
this.siteKey = siteKey;
this.siteDomain = siteDomain;
contextUrl = "http://" + siteDomain + "/";
this.siteUrl = siteUrl;
if (siteKey == null || !siteKey.matches("^[\\w-]+$")) {
throw new WTFException("Bad SiteKey");
@ -165,10 +241,6 @@ public class RecaptchaV2Challenge extends AbstractBrowserChallenge {
if (basicChallenge != null) {
return basicChallenge;
}
// if (Recaptcha2FallbackChallengeViaBrowserExtension.canHandle(this)) {
// basicChallenge = new Recaptcha2FallbackChallengeViaBrowserExtension(this); //
// return basicChallenge;
// }
final PhantomJS binding = new PhantomJS();
if (!binding.isAvailable()) {
try {

View File

@ -16,9 +16,9 @@ public class BasicCaptchaChallenge extends ImageCaptchaChallenge<String> {
}
@Override
public AbstractResponse<String> parseAPIAnswer(String json, ChallengeSolver<?> solver) {
public AbstractResponse<String> parseAPIAnswer(String result, String resultFormat, ChallengeSolver<?> solver) {
// String res = JSonStorage.restoreFromString("\"" + json + "\"", TypeRef.STRING);
return new CaptchaResponse(this, solver, json, 100);
return new CaptchaResponse(this, solver, result, 100);
}

View File

@ -229,7 +229,7 @@ public abstract class BrowserReference implements HttpRequestHandler {
}
return true;
} else if ("canClose".equals(pDo)) {
SolverJob<?> job = ChallengeResponseController.getInstance().getJobById(challenge.getId().getID());
SolverJob<?> job = ChallengeResponseController.getInstance().getJobByChallengeId(challenge.getId().getID());
if (challenge.isSolved() || job == null || job.isDone() || BrowserSolver.getInstance().isJobDone(job)) {
response.getOutputStream(true).write("true".getBytes("UTF-8"));
return true;
@ -237,7 +237,7 @@ public abstract class BrowserReference implements HttpRequestHandler {
response.getOutputStream(true).write("false".getBytes("UTF-8"));
}
} else if ("unload".equals(pDo)) {
SolverJob<?> job = ChallengeResponseController.getInstance().getJobById(challenge.getId().getID());
SolverJob<?> job = ChallengeResponseController.getInstance().getJobByChallengeId(challenge.getId().getID());
BrowserSolver.getInstance().kill((SolverJob<String>) job);
response.getOutputStream(true).write("true".getBytes("UTF-8"));
return true;

View File

@ -166,7 +166,7 @@ public class CaptchaSolutionsSolver extends CESChallengeSolver<String> implement
throw new SolverException(error);
}
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + decaptcha.trim());
AbstractResponse<String> answer = challenge.parseAPIAnswer(decaptcha.trim(), this);
AbstractResponse<String> answer = challenge.parseAPIAnswer(decaptcha.trim(), null, this);
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + br.toString());
job.setAnswer(new CaptchaSolutionsResponse(challenge, this, null, answer.getValue(), answer.getPriority()));
return;
@ -194,7 +194,7 @@ public class CaptchaSolutionsSolver extends CESChallengeSolver<String> implement
throw new SolverException(error);
}
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + decaptcha.trim());
AbstractResponse<String> answer = challenge.parseAPIAnswer(decaptcha.trim(), this);
AbstractResponse<String> answer = challenge.parseAPIAnswer(decaptcha.trim(), null, this);
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + br.toString());
job.setAnswer(new CaptchaSolutionsResponse(challenge, this, null, answer.getValue(), answer.getPriority()));
return;

View File

@ -185,7 +185,7 @@ public class DeathByCaptchaSolver extends CESChallengeSolver<String> {
if (status != null && status.isSolved()) {
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + status.getText());
AbstractResponse<String> answer = challenge.parseAPIAnswer(status.getText().replace("[", "").replace("]", ""), this);
AbstractResponse<String> answer = challenge.parseAPIAnswer(status.getText().replace("[", "").replace("]", ""), null, this);
DeathByCaptchaResponse response = new DeathByCaptchaResponse(challenge, this, status, answer.getValue(), answer.getPriority());

View File

@ -118,7 +118,7 @@ public class ImageTyperzCaptchaSolver extends CESChallengeSolver<String> {
}
final String[] result = br.getRegex("(\\d+)\\|(.*)").getRow(0);
if (result != null) {
final AbstractResponse<String> answer = challenge.parseAPIAnswer(result[1], this);
final AbstractResponse<String> answer = challenge.parseAPIAnswer(result[1], null, this);
job.getLogger().info("CAPTCHA " + challenge.getImageFile() + " solved: " + response);
job.setAnswer(new ImageTyperzResponse(challenge, this, result[0], answer.getValue(), answer.getPriority()));
} else {

View File

@ -100,7 +100,7 @@ public class Captcha9kwSolver extends AbstractCaptcha9kwSolver<String> {
@Override
protected void parseResponse(CESSolverJob<String> solverJob, Challenge<String> captchaChallenge, String captchaID, String ret) {
final AbstractResponse<String> answer = captchaChallenge.parseAPIAnswer(ret, this);
final AbstractResponse<String> answer = captchaChallenge.parseAPIAnswer(ret, null, this);
solverJob.setAnswer(new Captcha9kwResponse(captchaChallenge, this, answer.getValue(), answer.getPriority(), captchaID));
}

View File

@ -112,7 +112,6 @@ public class JSHtmlUnitPermissionRestricter {
static public class SandboxContextFactory extends ContextFactory {
public SandboxContextFactory() {
}
@Override
@ -144,7 +143,6 @@ public class JSHtmlUnitPermissionRestricter {
protected Function compileFunction(Scriptable scope, String source, Evaluator compiler, ErrorReporter compilationErrorReporter, String sourceName, int lineno, Object securityDomain) {
return super.compileFunction(scope, source, compiler, compilationErrorReporter, sourceName, lineno, securityDomain);
}
};
try {
Field field = Context.class.getDeclaredField("factory");
@ -168,55 +166,41 @@ public class JSHtmlUnitPermissionRestricter {
}
}
if (trusted) {
LOADED.add(className);
return true;
} else if (className.startsWith("adapter")) {
LOADED.add(className);
return true;
} else if (className.equals("net.sourceforge.htmlunit.corejs.javascript.EcmaError")) {
org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().severe("Javascript error occured");
LOADED.add(className);
return true;
} else if (className.equals("net.sourceforge.htmlunit.corejs.javascript.ConsString")) {
org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().severe("Javascript error occured");
LOADED.add(className);
return true;
} else if (className.equals("net.sourceforge.htmlunit.corejs.javascript.JavaScriptException")) {
org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().severe("Javascript error occured");
LOADED.add(className);
return true;
} else if (className.equals("net.sourceforge.htmlunit.corejs.javascript.EvaluatorException")) {
org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().severe("Javascript error occured");
LOADED.add(className);
return true;
} else {
EcmaError ret = ScriptRuntime.constructError("Security Violation", "Security Violation " + className);
throw ret;
}
}
});
onContextCreated(cx);
return cx;
}
}
public static class SandboxWrapFactory extends WrapFactory {
@Override
public Scriptable wrapJavaClass(Context cx, Scriptable scope, Class javaClass) {
Scriptable ret = new NativeJavaClass(scope, javaClass) {
@Override
public Object unwrap() {
@ -225,7 +209,6 @@ public class JSHtmlUnitPermissionRestricter {
@Override
public Object get(String name, Scriptable start) {
Object ret = super.get(name, start);
// System.out.println("Access Static Member " + this + "." + name + " = " + "(" + ret.getClass().getSimpleName() + ") "
// + ret);
@ -247,9 +230,7 @@ public class JSHtmlUnitPermissionRestricter {
@Override
public Object wrap(Context cx, Scriptable scope, Object obj, Class<?> staticType) {
Object ret = super.wrap(cx, scope, obj, staticType);
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
return obj;
} else if (obj instanceof Character) {
@ -272,30 +253,24 @@ public class JSHtmlUnitPermissionRestricter {
// System.out.println("Wrap Java Object Class:" + staticType + " Java Instance: " + str);
return new SandboxNativeJavaObject(scope, javaObject, staticType);
}
}
public static class SandboxNativeJavaObject extends NativeJavaObject {
private static final long serialVersionUID = -2783084485265910840L;
public SandboxNativeJavaObject(Scriptable scope, Object javaObject, Class<?> staticType) {
super(scope, javaObject, staticType);
}
@Override
public Object get(String name, Scriptable start) {
if (name.equals("getClass")) {
org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().severe("JS Security Exception");
return NOT_FOUND;
}
Object ret = super.get(name, start);
// System.out.println("Access " + this + "." + name + " = " + "(" + ret.getClass().getSimpleName() + ") " + ret);
return ret;
}
}
@ -317,11 +292,8 @@ public class JSHtmlUnitPermissionRestricter {
public static Object evaluateTrustedString(Context cx, Global scope, String source, String sourceName, int lineno, Object securityDomain) {
try {
TRUSTED_THREAD.put(Thread.currentThread(), true);
return cx.evaluateString(scope, source, sourceName, lineno, securityDomain);
} finally {
TRUSTED_THREAD.remove(Thread.currentThread());
}
}
@ -334,13 +306,10 @@ public class JSHtmlUnitPermissionRestricter {
try {
TRUSTED_THREAD.put(Thread.currentThread(), true);
return cx.compileString(source, sourceName, lineno, securityDomain);
} finally {
TRUSTED_THREAD.remove(Thread.currentThread());
}
}
// public synchronized static String evalJavaObject(String json) {
// // final ContextFactory factory = ContextFactory.getGlobal();
// Global scope = new Global();