1 /*
   2  * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 5100561
  27  * @bug 6273812
  28  * @summary Can not explicitly create a java.security.Policy object from a file
  29  * @build GetInstancePolicySpi GetInstanceProvider
  30  * @run main/othervm/policy=GetInstance.policy GetInstance
  31  */
  32 
  33 import java.security.*;
  34 
  35 import java.io.File;
  36 import java.net.URI;
  37 import sun.net.www.ParseUtil;
  38 
  39 public class GetInstance {
  40 
  41     private static final String JAVA_POLICY = "JavaPolicy";
  42 
  43     private static class BadParam implements Policy.Parameters { }
  44 
  45     public static void main(String[] args) throws Exception {
  46 
  47         int testnum = 1;
  48         GetInstance gi = new GetInstance();
  49 
  50         testnum = gi.testDefault(testnum);
  51         testnum = gi.testStringProvider(testnum);
  52         testnum = gi.testProvider(testnum);
  53         testnum = gi.testCustomImpl(testnum);
  54         testnum = gi.testBadParam(testnum);
  55 
  56         // make this go last because we don't want to leave its policy set
  57         // for other tests
  58         testnum = gi.testURIParam(testnum);
  59     }
  60 
  61     private int testDefault(int testnum) throws Exception {
  62         // get an instance of the default PolicySpiFile
  63         Policy p = Policy.getInstance(JAVA_POLICY, null);
  64         doTest(p, testnum++);
  65         Policy.setPolicy(p);
  66         doTestSM(testnum++);
  67 
  68         // get an instance of FooPolicy
  69         try {
  70             p = Policy.getInstance("FooPolicy", null);
  71             throw new SecurityException("test " + testnum++ + " failed");
  72         } catch (NoSuchAlgorithmException nsae) {
  73             // good
  74             System.out.println("test " + testnum++ + " passed");
  75         }
  76 
  77         return testnum;
  78     }
  79 
  80     private int testStringProvider(int testnum) throws Exception {
  81         // get an instance of JavaPolicy from SUN
  82         Policy p = Policy.getInstance(JAVA_POLICY, null, "SUN");
  83         doTest(p, testnum++);
  84         Policy.setPolicy(p);
  85         doTestSM(testnum++);
  86 
  87         // get an instance of JavaPolicy from SunRsaSign
  88         try {
  89             p = Policy.getInstance(JAVA_POLICY, null, "SunRsaSign");
  90             throw new SecurityException("test " + testnum++ + " failed");
  91         } catch (NoSuchAlgorithmException nsae) {
  92             // good
  93             System.out.println("test " + testnum++ + " passed");
  94         }
  95 
  96         // get an instance of JavaPolicy from FOO
  97         try {
  98             p = Policy.getInstance(JAVA_POLICY, null, "FOO");
  99             throw new SecurityException("test " + testnum++ + " failed");
 100         } catch (NoSuchProviderException nspe) {
 101             // good
 102             System.out.println("test " + testnum++ + " passed");
 103         }
 104 
 105         return testnum;
 106     }
 107 
 108     private int testProvider(int testnum) throws Exception {
 109         // get an instance of JavaPolicy from SUN
 110         Policy p = Policy.getInstance(JAVA_POLICY,
 111                                 null,
 112                                 Security.getProvider("SUN"));
 113         doTest(p, testnum++);
 114         Policy.setPolicy(p);
 115         doTestSM(testnum++);
 116 
 117         // get an instance of JavaPolicy from SunRsaSign
 118         try {
 119             p = Policy.getInstance(JAVA_POLICY,
 120                                 null,
 121                                 Security.getProvider("SunRsaSign"));
 122             throw new SecurityException("test " + testnum++ + " failed");
 123         } catch (NoSuchAlgorithmException nsae) {
 124             // good
 125             System.out.println("test " + testnum++ + " passed");
 126         }
 127 
 128         return testnum;
 129     }
 130 
 131     private int testBadParam(int testnum) throws Exception {
 132 
 133         // pass bad param
 134 
 135         try {
 136             Policy p = Policy.getInstance(JAVA_POLICY,
 137                                 new BadParam());
 138             throw new SecurityException("test " + testnum++ + " failed");
 139         } catch (IllegalArgumentException iae) {
 140             // good
 141             System.out.println("test " + testnum++ + " passed");
 142         }
 143 
 144         try {
 145             Policy p = Policy.getInstance(JAVA_POLICY,
 146                                 new BadParam(),
 147                                 "SUN");
 148             throw new SecurityException("test " + testnum++ + " failed");
 149         } catch (IllegalArgumentException iae) {
 150             // good
 151             System.out.println("test " + testnum++ + " passed");
 152         }
 153 
 154         try {
 155             Policy p = Policy.getInstance(JAVA_POLICY,
 156                                 new BadParam(),
 157                                 Security.getProvider("SUN"));
 158             throw new SecurityException("test " + testnum++ + " failed");
 159         } catch (IllegalArgumentException iae) {
 160             // good
 161             System.out.println("test " + testnum++ + " passed");
 162         }
 163 
 164         return testnum;
 165     }
 166 
 167     private int testURIParam(int testnum) throws Exception {
 168         // get an instance of JavaPolicy from SUN and have it read from the URL
 169 
 170         File file = new File(System.getProperty("test.src", "."),
 171                                 "GetInstance.policyURL");
 172         URI uri = file.toURI();
 173         Policy p = Policy.getInstance(JAVA_POLICY, new URIParameter(uri));
 174 
 175         doTest(p, testnum++);
 176         Policy.setPolicy(p);
 177         doTestSM(testnum++);
 178 
 179         return testnum;
 180     }
 181 
 182     private int testCustomImpl(int testnum) throws Exception {
 183         Provider customProvider = new GetInstanceProvider();
 184         Policy p = Policy.getInstance("GetInstancePolicySpi",
 185                                 null,
 186                                 customProvider);
 187 
 188         // doTest has a case that will not work with custom policies,
 189         // so do not call it
 190         //
 191         // doTest(p, testnum++);
 192 
 193         Policy.setPolicy(p);
 194         doTestSM(testnum++);
 195 
 196         return testnum;
 197     }
 198 
 199     private void doTest(Policy p, int testnum) throws Exception {
 200 
 201         // check granted perm
 202         if (p.implies(this.getClass().getProtectionDomain(),
 203                         new SecurityPermission("GetInstanceTest"))) {
 204             System.out.println("test " + testnum + ".1 passed");
 205         } else {
 206             throw new SecurityException("test " + testnum + ".1 failed");
 207         }
 208 
 209         // check perm not granted
 210         if (p.implies(this.getClass().getProtectionDomain(),
 211                         new SecurityPermission("NotGranted"))) {
 212             throw new SecurityException("test " + testnum + ".2 failed");
 213         } else {
 214             System.out.println("test " + testnum + ".2 passed");
 215         }
 216 
 217         // test getProvider
 218         if ("SUN".equals(p.getProvider().getName())) {
 219             System.out.println("test " + testnum + ".3 passed");
 220         } else {
 221             throw new SecurityException("test " + testnum + ".3 failed");
 222         }
 223 
 224         // test getType
 225         if (JAVA_POLICY.equals(p.getType())) {
 226             System.out.println("test " + testnum + ".4 passed");
 227         } else {
 228             throw new SecurityException("test " + testnum + ".4 failed");
 229         }
 230     }
 231 
 232     private void doTestSM(int testnum) throws Exception {
 233 
 234         // check granted perm
 235         System.getSecurityManager().checkPermission
 236                         (new SecurityPermission("GetInstanceTest"));
 237         System.out.println("test " + testnum + ".1 passed");
 238 
 239         // check perm not granted
 240         try {
 241             System.getSecurityManager().checkPermission
 242                         (new SecurityPermission("NotGranted"));
 243             throw new RuntimeException("test " + testnum + ".2 failed");
 244         } catch (SecurityException se) {
 245             System.out.println("test " + testnum + ".2 passed");
 246         }
 247     }
 248 }