/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
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.util.jna.SVNWinSecurity;
import org.tmatesoft.svn.core.internal.util.jna.SVNWinSecurity.SVNNTSecurityParameters;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.util.SVNLogType;
/**
* @version 1.1.2
* @author TMate Software Ltd.
*/
public class HTTPNativeNTLMAuthentication extends HTTPNTLMAuthentication {
private static final String NTLM_PROMPT_USER_PROPERTY = "svnkit.http.ntlm.promptUser";
private SVNNTSecurityParameters myNTSecurityParameters;
private String myLastToken;
protected HTTPNativeNTLMAuthentication(String charset) {
super(charset);
}
public static HTTPNativeNTLMAuthentication newInstance(String charset) {
if (!SVNWinSecurity.isNativeLibraryAvailable()) {
return null;
}
return new HTTPNativeNTLMAuthentication(charset);
}
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);
}
if (myNTSecurityParameters == null) {
final String passwordString = getPassword() != null ? new String(getPassword()) : null;
myNTSecurityParameters = SVNWinSecurity.getSecurityParams(getUserName(), passwordString, getDomain());
}
String response = "NTLM " + SVNWinSecurity.getAuthHeader(myLastToken, myNTSecurityParameters);
if (myNTSecurityParameters.myCrdHandle == null) {
myNTSecurityParameters = null;
}
if (isInType3State()) {
setType1State();
if (myLastToken != null) {
myLastToken = null;
}
}
return response;
}
public void parseChallenge(String challenge) throws SVNException {
myLastToken = challenge;
}
public boolean isNative() {
return true;
}
@Override
public boolean allowPropmtForCredentials() {
final String prompt = System.getProperty(NTLM_PROMPT_USER_PROPERTY, "false");
return Boolean.valueOf(prompt).booleanValue();
}
}