/***********************************************************************
*
* $CVSHeader$
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2002 - 2004 Rogan Dawes
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Getting Source
* ==============
*
* Source for this application is maintained at Sourceforge.net, a
* repository for free software projects.
*
* For details, please see http://www.sourceforge.net/projects/owasp
*
*/
/*
* $Id: ManualRequest.java,v 1.16 2005/05/18 15:23:31 rogan Exp $
*/
package org.owasp.webscarab.plugin.manualrequest;
import org.owasp.webscarab.httpclient.HTTPClientFactory;
import org.owasp.webscarab.model.StoreException;
import org.owasp.webscarab.model.Cookie;
import org.owasp.webscarab.model.NamedValue;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.Request;
import org.owasp.webscarab.model.Response;
import org.owasp.webscarab.plugin.Framework;
import org.owasp.webscarab.plugin.Plugin;
import org.owasp.webscarab.plugin.Hook;
import java.io.IOException;
import java.util.Date;
public class ManualRequest implements Plugin {
private ManualRequestUI _ui = null;
private Request _request = null;
private Response _response = null;
private Date _responseDate = null;
private Framework _framework;
private ManualRequestModel _model;
public ManualRequest(Framework framework) {
_framework = framework;
_model = new ManualRequestModel(_framework.getModel());
}
/** The plugin name
* @return The name of the plugin
*
*/
public String getPluginName() {
return new String("Manual Request");
}
public ManualRequestModel getModel() {
return _model;
}
public void setUI(ManualRequestUI ui) {
_ui = ui;
if (_ui != null) _ui.setEnabled(_model.isRunning());
}
public void setRequest(Request request) {
_request = request;
if (_ui != null) {
_ui.responseChanged(null);
_ui.requestChanged(request);
}
}
public synchronized void fetchResponse() throws IOException {
if (_request != null) {
try {
_model.setBusy(true);
_model.setStatus("Started, Fetching response");
_response = HTTPClientFactory.getInstance().fetchResponse(_request);
if (_response != null) {
_responseDate = new Date();
_framework.addConversation(_request, _response, "Manual Request");
if (_ui != null) _ui.responseChanged(_response);
}
} finally {
_model.setStatus("Started, Idle");
_model.setBusy(false);
}
}
}
public void addRequestCookies() {
if (_request != null) {
Cookie[] cookies = _model.getCookiesForUrl(_request.getURL());
if (cookies.length>0) {
StringBuffer buff = new StringBuffer();
buff.append(cookies[0].getName()).append("=").append(cookies[0].getValue());
for (int i=1; i<cookies.length; i++) {
buff.append("; ").append(cookies[i].getName()).append("=").append(cookies[i].getValue());
}
_request.setHeader(new NamedValue("Cookie", buff.toString()));
if (_ui != null) _ui.requestChanged(_request);
}
}
}
public void updateCookies() {
if (_response != null) {
NamedValue[] headers = _response.getHeaders();
for (int i=0; i<headers.length; i++) {
if (headers[i].getName().equalsIgnoreCase("Set-Cookie") || headers[i].getName().equalsIgnoreCase("Set-Cookie2")) {
Cookie cookie = new Cookie(_responseDate, _request.getURL(), headers[i].getValue());
_model.addCookie(cookie);
}
}
}
}
public void run() {
_model.setRunning(true);
// we do not run in our own thread, so we just return
if (_ui != null) _ui.setEnabled(_model.isRunning());
_model.setStatus("Started, Idle");
}
public boolean stop() {
_model.setStopping(true);
_model.setRunning(false);
_model.setStopping(false);
// nothing to stop
if (_ui != null) _ui.setEnabled(_model.isRunning());
_model.setStatus("Stopped");
return ! _model.isRunning();
}
public void flush() throws StoreException {
// we do not manage our own store
}
public boolean isRunning() {
return _model.isRunning();
}
public boolean isBusy() {
return _model.isBusy();
}
public String getStatus() {
return _model.getStatus();
}
public boolean isModified() {
return false;
}
public void analyse(ConversationID id, Request request, Response response, String origin) {
// we do no analysis
}
public void setSession(String type, Object store, String session) throws StoreException {
// we maintain no model of our own
}
public Object getScriptableObject() {
return null;
}
public Hook[] getScriptingHooks() {
return new Hook[0];
}
}