// License: GPL. For details, see LICENSE file.
package org.openstreetmap.hot.sds;
import java.net.Authenticator.RequestorType;
import java.net.HttpURLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.io.auth.CredentialsAgentException;
import org.openstreetmap.josm.io.auth.CredentialsAgentResponse;
/**
* Base class that handles common things like authentication for the reader and writer
* to the SDS server.
*
* Modeled after JOSM's OsmConnection class.
*/
public class SdsConnection {
protected boolean cancel = false;
protected HttpURLConnection activeConnection;
private SdsCredentialAgent credAgent = new SdsCredentialAgent();
/**
* Initialize the http defaults and the authenticator.
*/
static {
try {
HttpURLConnection.setFollowRedirects(true);
} catch (SecurityException e) {
e.printStackTrace();
}
}
public void cancel() {
cancel = true;
synchronized (this) {
if (activeConnection != null) {
activeConnection.setConnectTimeout(100);
activeConnection.setReadTimeout(100);
}
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Main.trace(ex);
}
synchronized (this) {
if (activeConnection != null) {
activeConnection.disconnect();
}
}
}
/**
* Adds an authentication header for basic authentication
*
* @param con the connection
* @throws SdsTransferException thrown if something went wrong. Check for nested exceptions
*/
protected void addBasicAuthorizationHeader(HttpURLConnection con) throws SdsTransferException {
CredentialsAgentResponse response;
String token;
try {
response = credAgent.getCredentials(RequestorType.SERVER, con.getURL().getHost(),
false /* don't know yet whether the credentials will succeed */);
} catch (CredentialsAgentException e) {
throw new SdsTransferException(e);
}
if (response == null) {
token = ":";
} else if (response.isCanceled()) {
cancel = true;
return;
} else {
String username = response.getUsername() == null ? "" : response.getUsername();
String password = response.getPassword() == null ? "" : String.valueOf(response.getPassword());
token = username + ":" + password;
con.addRequestProperty("Authorization", "Basic "+Base64.getEncoder().encodeToString(token.getBytes(StandardCharsets.UTF_8)));
}
}
protected void addAuth(HttpURLConnection connection) throws SdsTransferException {
addBasicAuthorizationHeader(connection);
}
/**
* Replies true if this connection is canceled
*
* @return true if this connection is canceled
*/
public boolean isCanceled() {
return cancel;
}
}