package com.grendelscan.queues.requester; import java.util.Collection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.grendelscan.commons.http.transactions.StandardHttpTransaction; import com.grendelscan.commons.http.transactions.UnrequestableTransaction; import com.grendelscan.queues.AbstractQueueThread; import com.grendelscan.queues.AbstractTransactionBasedQueue; import com.grendelscan.scan.Scan; /** * * @author David Byrne */ public class RequesterQueue extends AbstractTransactionBasedQueue { private static final Logger LOGGER = LoggerFactory .getLogger(RequesterQueue.class); private static final String REQUESTER_QUEUE_TABLE = "requester_queue"; /** Creates a new instance of requesterQueue */ public RequesterQueue() { super("Requester queue", REQUESTER_QUEUE_TABLE); } @Override public void addTransaction(final StandardHttpTransaction transaction) { super.addTransaction(transaction); } @Override public void addTransactions( final Collection<StandardHttpTransaction> transactions) { super.addTransactions(transactions); } @Override protected boolean checkSubmittedTransaction( final StandardHttpTransaction transaction) { try { isRequestable(transaction); } catch (UnrequestableTransaction e) { LOGGER.warn("Illegal transaction set to requester queue: " + e.toString()); return false; } return true; } @Override protected String getDBPath() { return Scan.getInstance().getOutputDirectory() + "request-queue.db"; } @Override protected int getMaxThreadCount() { return Scan.getScanSettings().getMaxRequesterThreads(); } @Override protected AbstractQueueThread getNewThread() { return new RequesterThread(getThreadGroup()); } public void isRequestable(final StandardHttpTransaction transaction) throws UnrequestableTransaction { if (transaction.isResponsePresent()) { transaction.setUnrequestable(true); throw new UnrequestableTransaction("Transaction already executed: " + transaction.getRequestWrapper().getURI()); } if (!transaction.getRequestOptions().ignoreRestrictions) { if (transaction.getRequestDepth() > Scan.getScanSettings() .getMaxRequestDepth()) { transaction.setUnrequestable(true); throw new UnrequestableTransaction("Request depth too high: " + transaction.getRequestWrapper().getURI()); } if (!Scan .getScanSettings() .getUrlFilters() .isUriAllowed( transaction.getRequestWrapper() .getAbsoluteUriString())) { transaction.setUnrequestable(true); throw new UnrequestableTransaction("Out of scope URI: " + transaction.getRequestWrapper() .getAbsoluteUriString()); } } // if (transaction.getRequestOptions().onlyUriIfNew) // { // if // (!Scan.getInstance().getTransactionRecord().hasUriBeenRequested(transaction, // transaction.getRequestOptions().ignoreUser)) // { // throw new UnrequestableTransaction("URI has been already requested: " // + transaction.getRequestWrapper().getURI()); // } // } } }