mirror of
https://github.com/mirror/jdownloader.git
synced 2024-10-07 00:53:37 +00:00
RC2 Work
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:
parent
bd6c1a4c54
commit
572e1c8762
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user