1 /*
   2  * Copyright (c) 2013, 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  * @test
  25  * @bug 8004476
  26  * @summary test XSLT extension functions
  27  * @run main/othervm XSLTExFuncTest
  28  */
  29 
  30 import java.io.StringWriter;
  31 import java.security.AllPermission;
  32 import java.security.CodeSource;
  33 import java.security.Permission;
  34 import java.security.PermissionCollection;
  35 import java.security.Permissions;
  36 import java.security.Policy;
  37 import java.security.ProtectionDomain;
  38 import javax.xml.transform.*;
  39 import javax.xml.transform.sax.SAXSource;
  40 import javax.xml.transform.stream.StreamResult;
  41 import org.xml.sax.InputSource;
  42 
  43 /**
  44  * test XSLT extension functions
  45  *
  46  * @author huizhe.wang@oracle.com
  47  */
  48 public class XSLTExFuncTest extends TestBase {
  49 
  50     final static String ENABLE_EXTENSION_FUNCTIONS = "http://www.oracle.com/xml/jaxp/properties/enableExtensionFunctions";
  51     final static String CLASSNAME = "DocumentBuilderFactoryImpl";
  52 
  53     /**
  54      * Creates a new instance of StreamReader
  55      */
  56     public XSLTExFuncTest(String name) {
  57         super(name);
  58     }
  59     boolean hasSM;
  60     String xslFile, xslFileId;
  61     String xmlFile, xmlFileId;
  62 
  63     protected void setUp() {
  64         super.setUp();
  65         xmlFile = filepath + "/tokenize.xml";
  66         xslFile = filepath + "/tokenize.xsl";
  67 
  68         /**
  69          * if (isWindows) { xslFile = "/" + xslFile; }
  70          *
  71          */
  72         xslFileId = "file://" + xslFile;
  73     }
  74 
  75     /**
  76      * @param args the command line arguments
  77      */
  78     public static void main(String[] args) {
  79         XSLTExFuncTest test = new XSLTExFuncTest("OneTest");
  80         test.setUp();
  81 
  82         test.testExtFunc();
  83         test.testExtFuncNotAllowed();
  84         test.testEnableExtFunc();
  85         test.testTemplatesEnableExtFunc();
  86         test.tearDown();
  87 
  88     }
  89 
  90     /**
  91      * by default, extension function is enabled
  92      */
  93     public void testExtFunc() {
  94         TransformerFactory factory = TransformerFactory.newInstance();
  95 
  96         try {
  97             transform(factory);
  98             System.out.println("testExtFunc: OK");
  99         } catch (TransformerConfigurationException e) {
 100             fail(e.getMessage());
 101         } catch (TransformerException ex) {
 102             fail(ex.getMessage());
 103         }
 104     }
 105 
 106     /**
 107      * Security is enabled, extension function not allowed
 108      */
 109     public void testExtFuncNotAllowed() {
 110         Policy p = new SimplePolicy(new AllPermission());
 111         Policy.setPolicy(p);
 112         System.setSecurityManager(new SecurityManager());
 113         TransformerFactory factory = TransformerFactory.newInstance();
 114 
 115         try {
 116             transform(factory);
 117         } catch (TransformerConfigurationException e) {
 118             fail(e.getMessage());
 119         } catch (TransformerException ex) {
 120             //expected since extension function is disallowed
 121             System.out.println("testExtFuncNotAllowed: OK");
 122         } finally {
 123             System.setSecurityManager(null);
 124         }
 125     }
 126 
 127     /**
 128      * Security is enabled, use new feature: enableExtensionFunctions
 129      */
 130     public void testEnableExtFunc() {
 131         Policy p = new SimplePolicy(new AllPermission());
 132         Policy.setPolicy(p);
 133         System.setSecurityManager(new SecurityManager());
 134         TransformerFactory factory = TransformerFactory.newInstance();
 135 
 136         /**
 137          * Use of the extension function 'http://exslt.org/strings:tokenize' is
 138          * not allowed when the secure processing feature is set to true.
 139          * Attempt to use the new property to enable extension function
 140          */
 141         boolean isExtensionSupported = enableExtensionFunction(factory);
 142 
 143         try {
 144             transform(factory);
 145             System.out.println("testEnableExt: OK");
 146         } catch (TransformerConfigurationException e) {
 147             fail(e.getMessage());
 148         } catch (TransformerException e) {
 149             fail(e.getMessage());
 150         } finally {
 151             System.setSecurityManager(null);
 152         }
 153     }
 154 
 155     /**
 156      * use Templates template = factory.newTemplates(new StreamSource( new
 157      * FileInputStream(xslFilename))); // Use the template to create a
 158      * transformer Transformer xformer = template.newTransformer();
 159      *
 160      * @param factory
 161      * @return
 162      */
 163     /**
 164      * Security is enabled, use new feature: enableExtensionFunctions Use the
 165      * template to create a transformer
 166      */
 167     public void testTemplatesEnableExtFunc() {
 168         Policy p = new SimplePolicy(new AllPermission());
 169         Policy.setPolicy(p);
 170         System.setSecurityManager(new SecurityManager());
 171         TransformerFactory factory = TransformerFactory.newInstance();
 172 
 173         /**
 174          * Use of the extension function 'http://exslt.org/strings:tokenize' is
 175          * not allowed when the secure processing feature is set to true.
 176          * Attempt to use the new property to enable extension function
 177          */
 178         boolean isExtensionSupported = enableExtensionFunction(factory);
 179 
 180         try {
 181             SAXSource xslSource = new SAXSource(new InputSource(xslFile));
 182             xslSource.setSystemId(xslFileId);
 183             Templates template = factory.newTemplates(xslSource);
 184             Transformer transformer = template.newTransformer();
 185             StringWriter stringResult = new StringWriter();
 186             Result result = new StreamResult(stringResult);
 187             transformer.transform(new SAXSource(new InputSource(xmlFile)), result);
 188             System.out.println("testTemplatesEnableExtFunc: OK");
 189         } catch (TransformerConfigurationException e) {
 190             fail(e.getMessage());
 191         } catch (TransformerException e) {
 192             fail(e.getMessage());
 193         } finally {
 194             System.setSecurityManager(null);
 195         }
 196     }
 197 
 198     boolean enableExtensionFunction(TransformerFactory factory) {
 199         boolean isSupported = true;
 200         try {
 201             factory.setFeature(ENABLE_EXTENSION_FUNCTIONS, true);
 202         } catch (TransformerConfigurationException ex) {
 203             isSupported = false;
 204         }
 205         return isSupported;
 206     }
 207 
 208     void transform(TransformerFactory factory) throws TransformerConfigurationException, TransformerException {
 209         SAXSource xslSource = new SAXSource(new InputSource(xslFile));
 210         xslSource.setSystemId(xslFileId);
 211         Transformer transformer = factory.newTransformer(xslSource);
 212         StringWriter stringResult = new StringWriter();
 213         Result result = new StreamResult(stringResult);
 214         transformer.transform(new SAXSource(new InputSource(xmlFile)), result);
 215     }
 216 
 217     class SimplePolicy extends Policy {
 218 
 219         private final Permissions perms;
 220 
 221         public SimplePolicy(Permission... permissions) {
 222             perms = new Permissions();
 223             for (Permission permission : permissions) {
 224                 perms.add(permission);
 225             }
 226         }
 227 
 228         @Override
 229         public PermissionCollection getPermissions(CodeSource cs) {
 230             return perms;
 231         }
 232 
 233         @Override
 234         public PermissionCollection getPermissions(ProtectionDomain pd) {
 235             return perms;
 236         }
 237 
 238         @Override
 239         public boolean implies(ProtectionDomain pd, Permission p) {
 240             return perms.implies(p);
 241         }
 242 
 243         //for older jdk
 244         @Override
 245         public void refresh() {
 246         }
 247     }
 248 }