/* * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* @test * @bug 8004502 * @library /test/lib * @summary Sanity check that NTLM will not be selected by the http protocol * handler when running on a profile that does not support NTLM * @modules java.base/sun.net.www.protocol.http:open * @run main/othervm -Dhttp.auth.digest.reEnabledAlgorithms=MD5 NoNTLM * @run main/othervm -Dhttp.auth.digest.reEnabledAlgorithms=MD5 * -Djava.net.preferIPv6Addresses=true NoNTLM
*/
/** * Return the http response with WWW-Authenticate headers for the given * authentication schemes.
*/ static String authReplyFor(String... schemes) { // construct the server reply
String reply = "HTTP/1.1 401 Unauthorized" + CRLF + "Content-Length: 0"+ CRLF + "Connection: close" + CRLF; for (String s: schemes) { switch (s) { case"Basic" :
reply += "WWW-Authenticate: Basic realm=\"wallyworld\"" + CRLF; break; case"Digest" :
reply += "WWW-Authenticate: Digest" + " realm=\"wallyworld\"" + " domain=/" + " nonce=\"abcdefghijklmnopqrstuvwxyz\"" + " qop=\"auth\"" + CRLF; break; case"NTLM" :
reply += "WWW-Authenticate: NTLM" + CRLF; break; default : thrownew RuntimeException("Should not get here");
}
}
reply += CRLF; return reply;
}
/** * Test the http protocol handler with the given authentication schemes * in the WWW-Authenticate header.
*/ staticvoid test(String... schemes) throws IOException {
// the authentication scheme that the client is expected to choose
String expected = null; for (String s: schemes) { if (expected == null) {
expected = s;
} elseif (s.equals("Digest")) {
expected = s;
}
}
// server reply
String reply = authReplyFor(schemes);
System.out.println("====================================");
System.out.println("Expect client to choose: " + expected);
System.out.println(reply);
InetAddress loopback = InetAddress.getLoopbackAddress(); try (ServerSocket ss = new ServerSocket(0, 0, loopback)) {
Client.start(ss.getLocalPort());
// client ---- GET ---> server // client <--- 401 ---- server try (Socket s = ss.accept()) { new HttpHeaderParser().parse(s.getInputStream());
s.getOutputStream().write(reply.getBytes("US-ASCII"));
}
// client ---- GET ---> server // client <--- 200 ---- server
String auth; try (Socket s = ss.accept()) {
HttpHeaderParser mh = new HttpHeaderParser();
mh.parse(s.getInputStream());
s.getOutputStream().write(OKAY.getBytes("US-ASCII"));
auth = mh.getHeaderValue("Authorization").get(0);
}
// check Authorization header if (auth == null) thrownew RuntimeException("Authorization header not found");
System.out.println("Server received Authorization header: " + auth);
String[] values = auth.split(" "); if (!values[0].equals(expected)) thrownew RuntimeException("Unexpected value");
}
}
/** * Test the http protocol handler with one WWW-Authenticate header with * the value "NTLM".
*/ staticvoid testNTLM() throws Exception { // server reply
String reply = authReplyFor("NTLM");
System.out.println("====================================");
System.out.println("Expect client to fail with 401 Unauthorized");
System.out.println(reply);
InetAddress loopback = InetAddress.getLoopbackAddress(); try (ServerSocket ss = new ServerSocket(0, 0, loopback)) {
Client client = new Client(ss.getLocalPort()); Thread thr = newThread(client);
thr.start();
// client ---- GET ---> server // client <--- 401 ---- client try (Socket s = ss.accept()) { new HttpHeaderParser().parse(s.getInputStream());
s.getOutputStream().write(reply.getBytes("US-ASCII"));
}
// the client should fail with 401
System.out.println("Waiting for client to terminate");
thr.join();
IOException ioe = client.ioException(); if (ioe != null)
System.out.println("Client failed: " + ioe); int respCode = client.respCode(); if (respCode != 0 && respCode != -1)
System.out.println("Client received HTTP response code: " + respCode); if (respCode != HttpURLConnection.HTTP_UNAUTHORIZED) thrownew RuntimeException("Unexpected response code");
}
}
if (ntlmSupported) {
System.out.println("====================================");
System.out.println("NTLM is supported: client would select NTLM: skipping `testNTLM()`..");
} else { // test NTLM only, this should fail with "401 Unauthorized"
testNTLM();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.