test/jdk/java/net/httpclient/security/Security.java
branchhttp-client-branch
changeset 56265 ec34ae013fbe
parent 56167 96fa4f49a9ff
child 56369 24a8fafec3ff
equal deleted inserted replaced
56264:c012b93297b0 56265:ec34ae013fbe
    59 import java.io.InputStream;
    59 import java.io.InputStream;
    60 import java.io.File;
    60 import java.io.File;
    61 import java.io.OutputStream;
    61 import java.io.OutputStream;
    62 import java.lang.reflect.Constructor;
    62 import java.lang.reflect.Constructor;
    63 import java.net.BindException;
    63 import java.net.BindException;
       
    64 import java.net.InetAddress;
    64 import java.net.InetSocketAddress;
    65 import java.net.InetSocketAddress;
    65 import java.net.ProxySelector;
    66 import java.net.ProxySelector;
    66 import java.net.URI;
    67 import java.net.URI;
    67 import java.net.URLClassLoader;
    68 import java.net.URLClassLoader;
    68 import java.net.URL;
    69 import java.net.URL;
   177 
   178 
   178     static void setupTests() {
   179     static void setupTests() {
   179         tests = new TestAndResult[]{
   180         tests = new TestAndResult[]{
   180             // (0) policy does not have permission for file. Should fail
   181             // (0) policy does not have permission for file. Should fail
   181             test(false, () -> { // Policy 0
   182             test(false, () -> { // Policy 0
   182                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   183                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   183                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   184                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   184                 HttpResponse<?> response = client.send(request, ofString());
   185                 HttpResponse<?> response = client.send(request, ofString());
   185             }),
   186             }),
   186             // (1) policy has permission for file URL
   187             // (1) policy has permission for file URL
   187             test(true, () -> { //Policy 1
   188             test(true, () -> { //Policy 1
   188                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   189                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   189                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   190                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   190                 HttpResponse<?> response = client.send(request, ofString());
   191                 HttpResponse<?> response = client.send(request, ofString());
   191             }),
   192             }),
   192             // (2) policy has permission for all file URLs under /files
   193             // (2) policy has permission for all file URLs under /files
   193             test(true, () -> { // Policy 2
   194             test(true, () -> { // Policy 2
   194                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   195                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   195                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   196                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   196                 HttpResponse<?> response = client.send(request, ofString());
   197                 HttpResponse<?> response = client.send(request, ofString());
   197             }),
   198             }),
   198             // (3) policy has permission for first URL but not redirected URL
   199             // (3) policy has permission for first URL but not redirected URL
   199             test(false, () -> { // Policy 3
   200             test(false, () -> { // Policy 3
   200                 URI u = URI.create("http://127.0.0.1:" + port + "/redirect/foo.txt");
   201                 URI u = URI.create("http://localhost:" + port + "/redirect/foo.txt");
   201                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   202                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   202                 HttpResponse<?> response = client.send(request, ofString());
   203                 HttpResponse<?> response = client.send(request, ofString());
   203             }),
   204             }),
   204             // (4) policy has permission for both first URL and redirected URL
   205             // (4) policy has permission for both first URL and redirected URL
   205             test(true, () -> { // Policy 4
   206             test(true, () -> { // Policy 4
   206                 URI u = URI.create("http://127.0.0.1:" + port + "/redirect/foo.txt");
   207                 URI u = URI.create("http://localhost:" + port + "/redirect/foo.txt");
   207                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   208                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   208                 HttpResponse<?> response = client.send(request, ofString());
   209                 HttpResponse<?> response = client.send(request, ofString());
   209             }),
   210             }),
   210             // (5) policy has permission for redirected but not first URL
   211             // (5) policy has permission for redirected but not first URL
   211             test(false, () -> { // Policy 5
   212             test(false, () -> { // Policy 5
   212                 URI u = URI.create("http://127.0.0.1:" + port + "/redirect/foo.txt");
   213                 URI u = URI.create("http://localhost:" + port + "/redirect/foo.txt");
   213                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   214                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   214                 HttpResponse<?> response = client.send(request, ofString());
   215                 HttpResponse<?> response = client.send(request, ofString());
   215             }),
   216             }),
   216             // (6) policy has permission for file URL, but not method
   217             // (6) policy has permission for file URL, but not method
   217             test(false, () -> { //Policy 6
   218             test(false, () -> { //Policy 6
   218                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   219                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   219                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   220                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   220                 HttpResponse<?> response = client.send(request, ofString());
   221                 HttpResponse<?> response = client.send(request, ofString());
   221             }),
   222             }),
   222             // (7) policy has permission for file URL, method, but not header
   223             // (7) policy has permission for file URL, method, but not header
   223             test(false, () -> { //Policy 7
   224             test(false, () -> { //Policy 7
   224                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   225                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   225                 HttpRequest request = HttpRequest.newBuilder(u)
   226                 HttpRequest request = HttpRequest.newBuilder(u)
   226                                                  .header("X-Foo", "bar")
   227                                                  .header("X-Foo", "bar")
   227                                                  .GET()
   228                                                  .GET()
   228                                                  .build();
   229                                                  .build();
   229                 HttpResponse<?> response = client.send(request, ofString());
   230                 HttpResponse<?> response = client.send(request, ofString());
   230             }),
   231             }),
   231             // (8) policy has permission for file URL, method and header
   232             // (8) policy has permission for file URL, method and header
   232             test(true, () -> { //Policy 8
   233             test(true, () -> { //Policy 8
   233                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   234                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   234                 HttpRequest request = HttpRequest.newBuilder(u)
   235                 HttpRequest request = HttpRequest.newBuilder(u)
   235                                                  .header("X-Foo", "bar")
   236                                                  .header("X-Foo", "bar")
   236                                                  .GET()
   237                                                  .GET()
   237                                                  .build();
   238                                                  .build();
   238                 HttpResponse<?> response = client.send(request, ofString());
   239                 HttpResponse<?> response = client.send(request, ofString());
   239             }),
   240             }),
   240             // (9) policy has permission for file URL, method and header
   241             // (9) policy has permission for file URL, method and header
   241             test(true, () -> { //Policy 9
   242             test(true, () -> { //Policy 9
   242                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   243                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   243                 HttpRequest request = HttpRequest.newBuilder(u)
   244                 HttpRequest request = HttpRequest.newBuilder(u)
   244                                                  .headers("X-Foo", "bar", "X-Bar", "foo")
   245                                                  .headers("X-Foo", "bar", "X-Bar", "foo")
   245                                                  .GET()
   246                                                  .GET()
   246                                                  .build();
   247                                                  .build();
   247                 HttpResponse<?> response = client.send(request, ofString());
   248                 HttpResponse<?> response = client.send(request, ofString());
   258             test(false, () -> { //Policy 11
   259             test(false, () -> { //Policy 11
   259                 directProxyTest(proxyPort, false);
   260                 directProxyTest(proxyPort, false);
   260             }),
   261             }),
   261             // (13) async version of test 0
   262             // (13) async version of test 0
   262             test(false, () -> { // Policy 0
   263             test(false, () -> { // Policy 0
   263                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   264                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   264                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   265                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   265                 try {
   266                 try {
   266                     HttpResponse<?> response = client.sendAsync(request, ofString()).get();
   267                     HttpResponse<?> response = client.sendAsync(request, ofString()).get();
   267                 } catch (ExecutionException e) {
   268                 } catch (ExecutionException e) {
   268                     if (e.getCause() instanceof SecurityException) {
   269                     if (e.getCause() instanceof SecurityException) {
   272                     }
   273                     }
   273                 }
   274                 }
   274             }),
   275             }),
   275             // (14) async version of test 1
   276             // (14) async version of test 1
   276             test(true, () -> { //Policy 1
   277             test(true, () -> { //Policy 1
   277                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   278                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   278                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   279                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   279                 try {
   280                 try {
   280                     HttpResponse<?> response = client.sendAsync(request, ofString()).get();
   281                     HttpResponse<?> response = client.sendAsync(request, ofString()).get();
   281                 } catch (ExecutionException e) {
   282                 } catch (ExecutionException e) {
   282                     if (e.getCause() instanceof SecurityException) {
   283                     if (e.getCause() instanceof SecurityException) {
   287                 }
   288                 }
   288             }),
   289             }),
   289             // (15) check that user provided unprivileged code running on a worker
   290             // (15) check that user provided unprivileged code running on a worker
   290             //      thread does not gain ungranted privileges.
   291             //      thread does not gain ungranted privileges.
   291             test(false, () -> { //Policy 12
   292             test(false, () -> { //Policy 12
   292                 URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   293                 URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   293                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   294                 HttpRequest request = HttpRequest.newBuilder(u).GET().build();
   294                 HttpResponse.BodyHandler<String> sth = ofString();
   295                 HttpResponse.BodyHandler<String> sth = ofString();
   295 
   296 
   296                 CompletableFuture<HttpResponse<String>> cf =
   297                 CompletableFuture<HttpResponse<String>> cf =
   297                     client.sendAsync(request, new HttpResponse.BodyHandler<String>() {
   298                     client.sendAsync(request, new HttpResponse.BodyHandler<String>() {
   360         }
   361         }
   361         System.out.println("Proxy port = " + proxyPort);
   362         System.out.println("Proxy port = " + proxyPort);
   362         if (!samePort)
   363         if (!samePort)
   363             proxyPort++;
   364             proxyPort++;
   364 
   365 
   365         InetSocketAddress addr = new InetSocketAddress("127.0.0.1", proxyPort);
   366         InetSocketAddress addr = new InetSocketAddress(InetAddress.getLoopbackAddress(),
       
   367                                                        proxyPort);
   366         HttpClient cl = HttpClient.newBuilder()
   368         HttpClient cl = HttpClient.newBuilder()
   367                                     .proxy(ProxySelector.of(addr))
   369                                     .proxy(ProxySelector.of(addr))
   368                                     .build();
   370                                     .build();
   369         clients.add(cl);
   371         clients.add(cl);
   370 
   372 
   371         URI u = URI.create("http://127.0.0.1:" + port + "/files/foo.txt");
   373         URI u = URI.create("http://localhost:" + port + "/files/foo.txt");
   372         HttpRequest request = HttpRequest.newBuilder(u)
   374         HttpRequest request = HttpRequest.newBuilder(u)
   373                                          .headers("X-Foo", "bar", "X-Bar", "foo")
   375                                          .headers("X-Foo", "bar", "X-Bar", "foo")
   374                                          .build();
   376                                          .build();
   375         HttpResponse<?> response = cl.send(request, ofString());
   377         HttpResponse<?> response = cl.send(request, ofString());
   376     }
   378     }
   434         ConsoleHandler ch = new ConsoleHandler();
   436         ConsoleHandler ch = new ConsoleHandler();
   435         logger.setLevel(Level.ALL);
   437         logger.setLevel(Level.ALL);
   436         ch.setLevel(Level.ALL);
   438         ch.setLevel(Level.ALL);
   437         logger.addHandler(ch);
   439         logger.addHandler(ch);
   438         String root = System.getProperty ("test.src")+ "/docs";
   440         String root = System.getProperty ("test.src")+ "/docs";
   439         InetSocketAddress addr = new InetSocketAddress (port);
   441         InetSocketAddress addr = new InetSocketAddress(InetAddress.getLoopbackAddress(), port);
   440         s1 = HttpServer.create (addr, 0);
   442         s1 = HttpServer.create (addr, 0);
   441         if (s1 instanceof HttpsServer) {
   443         if (s1 instanceof HttpsServer) {
   442             throw new RuntimeException ("should not be httpsserver");
   444             throw new RuntimeException ("should not be httpsserver");
   443         }
   445         }
   444         HttpHandler h = new FileServerHandler (root);
   446         HttpHandler h = new FileServerHandler (root);
   457             if (s1.getAddress().getPort() != port)
   459             if (s1.getAddress().getPort() != port)
   458                 throw new RuntimeException("Error wrong port");
   460                 throw new RuntimeException("Error wrong port");
   459             System.out.println("Port was assigned by Driver");
   461             System.out.println("Port was assigned by Driver");
   460         }
   462         }
   461         System.out.println("HTTP server port = " + port);
   463         System.out.println("HTTP server port = " + port);
   462         httproot = "http://127.0.0.1:" + port + "/files/";
   464         httproot = "http://localhost:" + port + "/files/";
   463         redirectroot = "http://127.0.0.1:" + port + "/redirect/";
   465         redirectroot = "http://localhost:" + port + "/redirect/";
   464         uri = new URI(httproot);
   466         uri = new URI(httproot);
   465         fileuri = httproot + "foo.txt";
   467         fileuri = httproot + "foo.txt";
   466     }
   468     }
   467 
   469 
   468     static class RedirectHandler implements HttpHandler {
   470     static class RedirectHandler implements HttpHandler {