package org.tmatesoft.svn.core.internal.io.dav.http;
import org.tmatesoft.svn.core.internal.util.SVNBase64;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class NTLMJCIFSEngine implements INTLMEngine {
private static final int TYPE_1_FLAGS =
0x80000000 | // NtlmFlags.NTLMSSP_NEGOTIATE_56
0x20000000 | // NtlmFlags.NTLMSSP_NEGOTIATE_128
0x00080000 | // NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2
0x00008000 | // NtlmFlags.NTLMSSP_NEGOTIATE_ALWAYS_SIGN
0x00000004; // NtlmFlags.NTLMSSP_REQUEST_TARGET;
public static boolean isAvailable() {
try {
final Class<?> clazz = Class.forName("jcifs.ntlmssp.NtlmFlags");
return clazz != null;
} catch (ClassNotFoundException e) {
//
}
return false;
}
public String generateType1Msg(String domain, String ws) throws NTLMEngineException {
try {
final Class<?> type1MessageClass = Class.forName("jcifs.ntlmssp.Type1Message");
final Constructor<?> constructor = type1MessageClass.getConstructor(Integer.TYPE, String.class, String.class);
final Object type1MessageObject = constructor.newInstance(TYPE_1_FLAGS, domain, ws);
final Method toByteArray = type1MessageClass.getMethod("toByteArray");
final byte[] message = (byte[]) toByteArray.invoke(type1MessageObject);
return SVNBase64.byteArrayToBase64(message);
} catch (Exception e) {
throw new NTLMEngineException(e.getMessage(), e);
}
}
public String generateType3Msg(String userName, char[] password, String domain, String ws, String token) throws NTLMEngineException {
final byte[] buffer = new byte[token.length()];
final int length = SVNBase64.base64ToByteArray(new StringBuffer(token), buffer);
final byte[] tokenBytes = new byte[length];
System.arraycopy(buffer, 0, tokenBytes, 0, length);
try {
final Class<?> type2MessageClass = Class.forName("jcifs.ntlmssp.Type2Message");
final Class<?> type3MessageClass = Class.forName("jcifs.ntlmssp.Type3Message");
final Constructor<?> type2Constructor = type2MessageClass.getConstructor(byte[].class);
final Constructor<?> type3Constructor = type3MessageClass.getConstructor(type2MessageClass,
String.class, String.class, String.class, String.class, Integer.TYPE);
final Object type2MessageObject = type2Constructor.newInstance(tokenBytes);
final Method getFlags = type2MessageClass.getMethod("getFlags");
final int type2Flags = (Integer) getFlags.invoke(type2MessageObject);
final int type3Flags = type2Flags
& (~(0x00010000 /*NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN*/ |
0x00020000 /*NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER*/));
final Object type3MessageObject = type3Constructor.newInstance(type2MessageObject,
new String(password), domain, userName, ws, type3Flags);
final Method toByteArray = type3MessageClass.getMethod("toByteArray");
final byte[] message = (byte[]) toByteArray.invoke(type3MessageObject);
return SVNBase64.byteArrayToBase64(message);
} catch (Exception e) {
throw new NTLMEngineException(e.getMessage(), e);
}
}
}