|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package sun.net.www.protocol.http; |
|
|
|
import java.net.URL; |
|
import java.net.PasswordAuthentication; |
|
import java.lang.reflect.Constructor; |
|
import java.lang.reflect.Method; |
|
import sun.util.logging.PlatformLogger; |
|
|
|
|
|
|
|
|
|
*/ |
|
class NTLMAuthenticationProxy { |
|
private static Method supportsTA; |
|
private static Method isTrustedSite; |
|
private static final String clazzStr = "sun.net.www.protocol.http.ntlm.NTLMAuthentication"; |
|
private static final String supportsTAStr = "supportsTransparentAuth"; |
|
private static final String isTrustedSiteStr = "isTrustedSite"; |
|
|
|
static final NTLMAuthenticationProxy proxy = tryLoadNTLMAuthentication(); |
|
static final boolean supported = proxy != null ? true : false; |
|
static final boolean supportsTransparentAuth = supported ? supportsTransparentAuth() : false; |
|
|
|
private final Constructor<? extends AuthenticationInfo> threeArgCtr; |
|
private final Constructor<? extends AuthenticationInfo> fiveArgCtr; |
|
|
|
private NTLMAuthenticationProxy(Constructor<? extends AuthenticationInfo> threeArgCtr, |
|
Constructor<? extends AuthenticationInfo> fiveArgCtr) { |
|
this.threeArgCtr = threeArgCtr; |
|
this.fiveArgCtr = fiveArgCtr; |
|
} |
|
|
|
|
|
AuthenticationInfo create(boolean isProxy, |
|
URL url, |
|
PasswordAuthentication pw) { |
|
try { |
|
return threeArgCtr.newInstance(isProxy, url, pw); |
|
} catch (ReflectiveOperationException roe) { |
|
finest(roe); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
AuthenticationInfo create(boolean isProxy, |
|
String host, |
|
int port, |
|
PasswordAuthentication pw) { |
|
try { |
|
return fiveArgCtr.newInstance(isProxy, host, port, pw); |
|
} catch (ReflectiveOperationException roe) { |
|
finest(roe); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
private static boolean supportsTransparentAuth() { |
|
try { |
|
return (Boolean)supportsTA.invoke(null); |
|
} catch (ReflectiveOperationException roe) { |
|
finest(roe); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static boolean isTrustedSite(URL url) { |
|
try { |
|
return (Boolean)isTrustedSite.invoke(null, url); |
|
} catch (ReflectiveOperationException roe) { |
|
finest(roe); |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
@SuppressWarnings("unchecked") |
|
private static NTLMAuthenticationProxy tryLoadNTLMAuthentication() { |
|
Class<? extends AuthenticationInfo> cl; |
|
Constructor<? extends AuthenticationInfo> threeArg, fiveArg; |
|
try { |
|
cl = (Class<? extends AuthenticationInfo>)Class.forName(clazzStr, true, null); |
|
if (cl != null) { |
|
threeArg = cl.getConstructor(boolean.class, |
|
URL.class, |
|
PasswordAuthentication.class); |
|
fiveArg = cl.getConstructor(boolean.class, |
|
String.class, |
|
int.class, |
|
PasswordAuthentication.class); |
|
supportsTA = cl.getDeclaredMethod(supportsTAStr); |
|
isTrustedSite = cl.getDeclaredMethod(isTrustedSiteStr, java.net.URL.class); |
|
return new NTLMAuthenticationProxy(threeArg, |
|
fiveArg); |
|
} |
|
} catch (ClassNotFoundException cnfe) { |
|
finest(cnfe); |
|
} catch (ReflectiveOperationException roe) { |
|
throw new AssertionError(roe); |
|
} |
|
|
|
return null; |
|
} |
|
|
|
static void finest(Exception e) { |
|
PlatformLogger logger = HttpURLConnection.getHttpLogger(); |
|
if (logger.isLoggable(PlatformLogger.Level.FINEST)) { |
|
logger.finest("NTLMAuthenticationProxy: " + e); |
|
} |
|
} |
|
} |