package org.tmatesoft.svn.core.internal.io.dav.http;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.util.SVNDebugLog;
import org.tmatesoft.svn.util.SVNLogType;
import java.io.IOException;
import java.util.Locale;
public class HTTPApacheNTLMAuthentication extends HTTPNTLMAuthentication {
public static final String JCIFS_ENGINE = "JCIFS";
public static final String APACHE_ENGINE = "APACHE";
private final INTLMEngine myEngine;
private String myLastToken = null;
protected HTTPApacheNTLMAuthentication(String charset, String engine) {
super(charset);
if (JCIFS_ENGINE.equals(engine) && !NTLMJCIFSEngine.isAvailable()) {
engine = APACHE_ENGINE;
}
if (JCIFS_ENGINE.equals(engine)) {
myEngine = new NTLMJCIFSEngine();
} else {
myEngine = new NTLMEngine();
}
}
public static HTTPNTLMAuthentication newInstance(String charset, String engine) {
return new HTTPApacheNTLMAuthentication(charset, engine);
}
public String authenticate() throws SVNException {
if (myState != TYPE1 && myState != TYPE3) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.RA_DAV_REQUEST_FAILED,
"Unsupported message type in HTTP NTLM authentication");
SVNErrorManager.error(err, SVNLogType.NETWORK);
}
String response = null;
String domain = getDomain() == null ? "" : getDomain().toUpperCase(Locale.ENGLISH);
final String domainOverride = System.getProperty("svnkit.http.ntlm.domain");
if (domainOverride != null) {
domain = domainOverride.toUpperCase(Locale.ENGLISH);
}
String ws = "";
final String wsOverride = System.getProperty("svnkit.http.ntlm.workstation");
if (wsOverride != null) {
ws = wsOverride.toUpperCase(Locale.ENGLISH);
}
final String userOverride = System.getProperty("svnkit.http.ntlm.user");
String userName = userOverride != null ? userOverride : getUserName();
if (userName == null) {
userName = System.getProperty("user.name", System.getenv("USERNAME"));
}
final String passwordOverride = System.getProperty("svnkit.http.ntlm.password");
final char[] password = passwordOverride != null ? passwordOverride.toCharArray() : getPassword();
if (SVNFileUtil.isWindows) {
final boolean useDomainEnvironment = Boolean.parseBoolean(System.getProperty("svnkit.http.ntlm.domain.useEnv", "false"));
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Will try to use domain from environment: " + useDomainEnvironment);
final boolean useWsEnvironment = Boolean.parseBoolean(System.getProperty("svnkit.http.ntlm.workstation.useEnv", "true"));
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Will try to use workstation from environment: " + useWsEnvironment);
if ("".equals(ws) && wsOverride == null && useWsEnvironment) {
ws = System.getenv("COMPUTERNAME");
if (ws == null) {
ws = "";
}
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Workstation from environment: " + ws);
}
if ("".equals(domain) && domainOverride == null && useDomainEnvironment) {
domain = System.getenv("USERDOMAIN");
if (domain == null) {
domain = "";
}
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Domain from environment: " + domain);
}
}
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Domain: " + domain);
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Workstation: " + ws);
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "User: " + userName);
SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "Password: "
+ (password != null && password.length > 0 ? "<not empty>" : "<empty or null>"));
try {
if (myState == TYPE1) {
response = myEngine.generateType1Msg(domain, ws);
} else if (myState == TYPE3) {
response = myEngine.generateType3Msg(userName, password, domain, ws, myLastToken);
}
} catch (IOException e) {
throw new SVNException(SVNErrorMessage.create(SVNErrorCode.RA_DAV_REQUEST_FAILED), e);
}
if (isInType3State()) {
setType1State();
if (myLastToken != null) {
myLastToken = null;
}
}
return "NTLM " + response;
}
public void parseChallenge(String challenge) throws SVNException {
// store incoming challenge.
myLastToken = challenge;
}
public boolean isNative() {
return true;
}
@Override
public boolean allowPropmtForCredentials() {
return true;
}
}