/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
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
verion 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 library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
package org.lobobrowser.request;
import java.awt.Component;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.eclipse.jdt.annotation.NonNull;
import org.lobobrowser.clientlet.ClientletException;
import org.lobobrowser.clientlet.ClientletRequest;
import org.lobobrowser.clientlet.ClientletResponse;
import org.lobobrowser.ua.ProgressType;
import org.lobobrowser.ua.RequestType;
import org.lobobrowser.ua.UserAgentContext;
public abstract class AbstractRequestHandler implements RequestHandler {
protected final ClientletRequest request;
private final Component dialogComponent;
private final UserAgentContext uaContext;
private boolean cancelled = false;
public AbstractRequestHandler(final ClientletRequest request, final Component dialogComponent, final UserAgentContext uaContext) {
this.request = request;
this.dialogComponent = dialogComponent;
this.uaContext = uaContext;
}
@Override
public UserAgentContext getContext() {
return uaContext;
}
public void cancel() {
this.cancelled = true;
}
public HostnameVerifier getHostnameVerifier() {
return new LocalHostnameVerifier();
}
public String getLatestRequestMethod() {
return this.request.getMethod();
}
public @NonNull URL getLatestRequestURL() {
return this.request.getRequestURL();
}
public ClientletRequest getRequest() {
return this.request;
}
public abstract boolean handleException(ClientletResponse response, Throwable exception, RequestType requestType)
throws ClientletException;
public abstract void handleProgress(ProgressType progressType, @NonNull URL url, String method, int value, int max);
public boolean isCancelled() {
return this.cancelled;
}
public boolean isNewNavigationEntry() {
return false;
}
public abstract void processResponse(ClientletResponse response) throws ClientletException, IOException;
private class LocalHostnameVerifier implements HostnameVerifier {
private boolean verified;
/*
* (non-Javadoc)
*
* @see javax.net.ssl.HostnameVerifier#verify(java.lang.String,
* javax.net.ssl.SSLSession)
*/
public boolean verify(final String host, final SSLSession session) {
if (OkHostnameVerifier.INSTANCE.verify(host, session)) {
return true;
} else {
this.verified = false;
final VerifiedHostsStore vhs = VerifiedHostsStore.getInstance();
if (vhs.contains(host)) {
return true;
}
// TODO: call with doPrivileged()
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
boolean verified = false;
final Component dc = dialogComponent;
if (dc != null) {
final int result = JOptionPane.showConfirmDialog(dc, "Host " + host
+ " does not match SSL certificate or CA not recognized. Proceed anyway?", "Security Warning",
JOptionPane.YES_NO_OPTION);
verified = result == JOptionPane.YES_OPTION;
if (verified) {
vhs.add(host);
}
}
synchronized (LocalHostnameVerifier.this) {
LocalHostnameVerifier.this.verified = verified;
}
}
});
} catch (final InterruptedException ie) {
throw new IllegalStateException(ie);
} catch (final InvocationTargetException ite) {
throw new IllegalStateException(ite.getCause());
}
synchronized (this) {
return this.verified;
}
}
}
}
}