8077155: LoginContext Subject ignored by jdk8 sun.net.www.protocol.http.HttpURLConnection
Reviewed-by: michaelm
This commit is contained in:
parent
9cecb7f70a
commit
efc37c5e71
@ -983,7 +983,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
|
|||||||
SocketPermission p = URLtoSocketPermission(this.url);
|
SocketPermission p = URLtoSocketPermission(this.url);
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
try {
|
try {
|
||||||
AccessController.doPrivileged(
|
AccessController.doPrivilegedWithCombiner(
|
||||||
new PrivilegedExceptionAction<>() {
|
new PrivilegedExceptionAction<>() {
|
||||||
public Void run() throws IOException {
|
public Void run() throws IOException {
|
||||||
plainConnect0();
|
plainConnect0();
|
||||||
@ -1244,7 +1244,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
|
|||||||
|
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
try {
|
try {
|
||||||
return AccessController.doPrivileged(
|
return AccessController.doPrivilegedWithCombiner(
|
||||||
new PrivilegedExceptionAction<>() {
|
new PrivilegedExceptionAction<>() {
|
||||||
public OutputStream run() throws IOException {
|
public OutputStream run() throws IOException {
|
||||||
return getOutputStream0();
|
return getOutputStream0();
|
||||||
@ -1422,7 +1422,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
|
|||||||
|
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
try {
|
try {
|
||||||
return AccessController.doPrivileged(
|
return AccessController.doPrivilegedWithCombiner(
|
||||||
new PrivilegedExceptionAction<>() {
|
new PrivilegedExceptionAction<>() {
|
||||||
public InputStream run() throws IOException {
|
public InputStream run() throws IOException {
|
||||||
return getInputStream0();
|
return getInputStream0();
|
||||||
@ -2565,7 +2565,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
|
|||||||
|
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
try {
|
try {
|
||||||
return AccessController.doPrivileged(
|
return AccessController.doPrivilegedWithCombiner(
|
||||||
new PrivilegedExceptionAction<>() {
|
new PrivilegedExceptionAction<>() {
|
||||||
public Boolean run() throws IOException {
|
public Boolean run() throws IOException {
|
||||||
return followRedirect0(loc, stat, locUrl0);
|
return followRedirect0(loc, stat, locUrl0);
|
||||||
|
@ -40,21 +40,34 @@ import java.io.BufferedReader;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.PasswordAuthentication;
|
import java.net.PasswordAuthentication;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.PrivilegedExceptionAction;
|
import java.net.URLConnection;
|
||||||
|
import java.security.*;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.security.auth.Subject;
|
import javax.security.auth.Subject;
|
||||||
|
import javax.security.auth.callback.Callback;
|
||||||
|
import javax.security.auth.callback.CallbackHandler;
|
||||||
|
import javax.security.auth.callback.NameCallback;
|
||||||
|
import javax.security.auth.callback.PasswordCallback;
|
||||||
|
import javax.security.auth.callback.UnsupportedCallbackException;
|
||||||
|
import javax.security.auth.login.AppConfigurationEntry;
|
||||||
|
import javax.security.auth.login.Configuration;
|
||||||
|
import javax.security.auth.login.LoginContext;
|
||||||
|
import javax.security.auth.login.LoginException;
|
||||||
|
import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
|
||||||
import org.ietf.jgss.GSSContext;
|
import org.ietf.jgss.GSSContext;
|
||||||
import org.ietf.jgss.GSSCredential;
|
import org.ietf.jgss.GSSCredential;
|
||||||
import org.ietf.jgss.GSSManager;
|
import org.ietf.jgss.GSSManager;
|
||||||
import sun.security.jgss.GSSUtil;
|
import sun.security.jgss.GSSUtil;
|
||||||
import sun.security.krb5.Config;
|
import sun.security.krb5.Config;
|
||||||
|
import java.util.Base64;
|
||||||
import sun.util.logging.PlatformLogger;
|
import sun.util.logging.PlatformLogger;
|
||||||
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
@ -197,7 +210,7 @@ public class HttpNegotiateServer {
|
|||||||
proxyUrl = new URL("http://nosuchplace/a/b/c");
|
proxyUrl = new URL("http://nosuchplace/a/b/c");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Exception e1 = null, e2 = null;
|
Exception e1 = null, e2 = null, e3 = null;
|
||||||
try {
|
try {
|
||||||
test6578647();
|
test6578647();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -210,7 +223,14 @@ public class HttpNegotiateServer {
|
|||||||
e2 = e;
|
e2 = e;
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
if (e1 != null || e2 != null) {
|
try {
|
||||||
|
test8077155();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e3 = e;
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e1 != null || e2 != null || e3 != null) {
|
||||||
throw new RuntimeException("Test error");
|
throw new RuntimeException("Test error");
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -254,6 +274,121 @@ public class HttpNegotiateServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void testConnect() {
|
||||||
|
InputStream inputStream = null;
|
||||||
|
try {
|
||||||
|
URL url = webUrl;
|
||||||
|
|
||||||
|
URLConnection conn = url.openConnection();
|
||||||
|
conn.connect();
|
||||||
|
inputStream = conn.getInputStream();
|
||||||
|
byte[] b = new byte[inputStream.available()];
|
||||||
|
for (int j = 0; j < b.length; j++) {
|
||||||
|
b[j] = (byte) inputStream.read();
|
||||||
|
}
|
||||||
|
String s = new String(b);
|
||||||
|
System.out.println("Length: " + s.length());
|
||||||
|
System.out.println(s);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
} finally {
|
||||||
|
if (inputStream != null) {
|
||||||
|
try {
|
||||||
|
inputStream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test8077155() throws Exception {
|
||||||
|
final String username = WEB_USER;
|
||||||
|
final char[] password = WEB_PASS;
|
||||||
|
|
||||||
|
SecurityManager security = new SecurityManager();
|
||||||
|
Policy.setPolicy(new SecurityPolicy());
|
||||||
|
System.setSecurityManager(security);
|
||||||
|
|
||||||
|
CallbackHandler callback = new CallbackHandler() {
|
||||||
|
@Override
|
||||||
|
public void handle(Callback[] pCallbacks) throws IOException, UnsupportedCallbackException {
|
||||||
|
for (Callback cb : pCallbacks) {
|
||||||
|
if (cb instanceof NameCallback) {
|
||||||
|
NameCallback ncb = (NameCallback)cb;
|
||||||
|
ncb.setName(username);
|
||||||
|
|
||||||
|
} else if (cb instanceof PasswordCallback) {
|
||||||
|
PasswordCallback pwdcb = (PasswordCallback) cb;
|
||||||
|
pwdcb.setPassword(password);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
final String jaasConfigName = "oracle.test.kerberos.login";
|
||||||
|
final String krb5LoginModule = "com.sun.security.auth.module.Krb5LoginModule";
|
||||||
|
|
||||||
|
Configuration loginConfig = new Configuration() {
|
||||||
|
@Override
|
||||||
|
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
|
||||||
|
if (! jaasConfigName.equals(name)) {
|
||||||
|
return new AppConfigurationEntry[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> options = new HashMap<String, String>();
|
||||||
|
options.put("useTicketCache", Boolean.FALSE.toString());
|
||||||
|
options.put("useKeyTab", Boolean.FALSE.toString());
|
||||||
|
|
||||||
|
return new AppConfigurationEntry[] {
|
||||||
|
new AppConfigurationEntry(krb5LoginModule,
|
||||||
|
LoginModuleControlFlag.REQUIRED,
|
||||||
|
options)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// oracle context/subject/login
|
||||||
|
LoginContext context = null;
|
||||||
|
try {
|
||||||
|
context = new LoginContext("oracle.test.kerberos.login", null, callback, loginConfig);
|
||||||
|
context.login();
|
||||||
|
|
||||||
|
} catch (LoginException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Subject subject = context.getSubject();
|
||||||
|
|
||||||
|
final PrivilegedExceptionAction<Object> test_action = new PrivilegedExceptionAction<Object>() {
|
||||||
|
public Object run() throws Exception {
|
||||||
|
testConnect();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
System.err.println("\n\nExpecting to succeed when executing with the the logged in subject.");
|
||||||
|
|
||||||
|
try {
|
||||||
|
Subject.doAs(subject, test_action);
|
||||||
|
System.err.println("\n\nConnection succeed when executing with the the logged in subject.");
|
||||||
|
} catch (PrivilegedActionException e) {
|
||||||
|
System.err.println("\n\nFailure unexpected when executing with the the logged in subject.");
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException("Failed to login as subject");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.err.println("\n\nExpecting to fail when running with the current user's login.");
|
||||||
|
testConnect();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.err.println("\nConnect failed when running with the current user's login:\n" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates and starts an HTTP or proxy server that requires
|
* Creates and starts an HTTP or proxy server that requires
|
||||||
* Negotiate authentication.
|
* Negotiate authentication.
|
||||||
@ -366,3 +501,22 @@ public class HttpNegotiateServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SecurityPolicy extends Policy {
|
||||||
|
|
||||||
|
private static Permissions perms;
|
||||||
|
|
||||||
|
public SecurityPolicy() {
|
||||||
|
super();
|
||||||
|
if (perms == null) {
|
||||||
|
perms = new Permissions();
|
||||||
|
perms.add(new AllPermission());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PermissionCollection getPermissions(CodeSource codesource) {
|
||||||
|
return perms;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user