SLING-8019 - Use XSS API

Initial version of o.a.s.scripting.jsp.taglib.compat bundle.

The helpers package was copied from the master branch of the
o.a.s.scripting.jsp.taglib bundle.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5b783ed
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+/target
+.idea
+.classpath
+.metadata
+.project
+.settings
+.externalToolBuilders
+maven-eclipse.xml
+*.swp
+*.iml
+*.ipr
+*.iws
+*.bak
+.vlt
+.DS_Store
+jcr.log
+atlassian-ide-plugin.xml
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..0fa18e5
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,22 @@
+<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
+Apache Software Foundation Code of Conduct
+====
+
+Being an Apache project, Apache Sling adheres to the Apache Software Foundation's [Code of Conduct](https://www.apache.org/foundation/policies/conduct.html).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..ac82a1a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,24 @@
+<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
+Contributing
+====
+
+Thanks for choosing to contribute!
+
+You will find all the necessary details about how you can do this at https://sling.apache.org/contributing.html.
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..f582519
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,20 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+slingOsgiBundleBuild()
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1ea7f74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+[<img src="https://sling.apache.org/res/logos/sling.png"/>](https://sling.apache.org)
+
+ [![Build Status](https://builds.apache.org/buildStatus/icon?job=Sling/sling-org-apache-sling-scripting-jsp-compat/master)](https://builds.apache.org/job/Sling/job/sling-org-apache-sling-scripting-jsp-compat/job/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.sling/org.apache.sling.scripting.jsp.compat/badge.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22org.apache.sling.scripting.jsp.compat%22) [![JavaDocs](https://www.javadoc.io/badge/org.apache.sling/org.apache.sling.scripting.jsp.compat.svg)](https://www.javadoc.io/doc/org.apache.sling/org.apache.sling.scripting.jsp.compat) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![scripting](https://sling.apache.org/badges/group-scripting.svg)](https://github.com/apache/sling-aggregator/blob/master/docs/groups/scripting.md)
+
+# Apache Sling Scripting JSP Support (Compat)
+
+This module is part of the [Apache Sling](https://sling.apache.org) project.
+
+Compatibility bundle - support for JSP scripting.
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..83a53f0
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional 
+    information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except 
+    in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to 
+    in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See 
+    the License for the specific language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+>
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.sling</groupId>
+        <artifactId>sling</artifactId>
+        <version>31</version>
+        <relativePath />
+    </parent>
+
+    <artifactId>org.apache.sling.scripting.jsp.taglib.compat</artifactId>
+    <version>0.9.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>Apache Sling Scripting JSP Tag Library (Compat)</name>
+    <description>
+        Compatibility bundle for the Apache Sling Scripting JSP Tag Library
+    </description>
+
+    <scm>
+        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-jsp-taglib-compat.git</connection>
+        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-jsp-taglib-compat.git</developerConnection>
+        <url>https://gitbox.apache.org/repos/asf?p=sling-org-apache-sling-scripting-jsp-taglib-compat.git</url>
+        <tag>HEAD</tag>
+    </scm>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            !bsh.*,
+                            !nu.xom.*,
+                            !org.apache.commons.beanutils.*,
+                            !org.apache.commons.configuration.*,
+                            !org.owasp.validator.html.*,
+                            !org.apache.log4j.*,
+                            *
+                        </Import-Package>
+                        <Embed-Dependency>
+                            esapi;inline=true
+                        </Embed-Dependency>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>src/main/resources/ESAPI.properties</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.owasp.esapi</groupId>
+            <artifactId>esapi</artifactId>
+            <version>2.1.0.1</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/XSSSupport.java b/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/XSSSupport.java
new file mode 100644
index 0000000..6004b8a
--- /dev/null
+++ b/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/XSSSupport.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.scripting.jsp.taglib.helpers;
+
+import org.owasp.esapi.ESAPI;
+
+/**
+ * Support for basic XSS protection as provided by the OWASP ESAPI's escape
+ * methods.
+ */
+public class XSSSupport {
+
+    /**
+     * The encoding modes supported by this tag.
+     */
+    public enum ENCODING_MODE {
+        /**
+         * Encodes the content as HTML
+         */
+        HTML, HTML_ATTR, JS, XML, XML_ATTR
+    }
+
+    /**
+     * Encodes the unencoded string using the specified mode. This will be deferred
+     * to the corresponding OWASP ESAPI encoding method.
+     *
+     * @param unencoded the unencoded string
+     * @param mode      the mode with which to encode the string
+     * @return the encoded string
+     */
+    public static String encode(String unencoded, ENCODING_MODE mode) {
+
+        String encoded = null;
+        switch (mode) {
+        case HTML:
+            encoded = ESAPI.encoder().encodeForHTML(unencoded);
+            break;
+        case HTML_ATTR:
+            encoded = ESAPI.encoder().encodeForHTMLAttribute(unencoded);
+            break;
+        case XML:
+            encoded = ESAPI.encoder().encodeForXML(unencoded);
+            break;
+        case XML_ATTR:
+            encoded = ESAPI.encoder().encodeForXMLAttribute(unencoded);
+            break;
+        case JS:
+            encoded = ESAPI.encoder().encodeForJavaScript(unencoded);
+            break;
+        default:
+            break;
+        }
+        return encoded;
+    }
+
+    /**
+     * Retrieves the encoding mode associated with the specified string. Will throw
+     * an IllegalArgumentException if the mode string is not a valid mode and will
+     * throw a NullPointerException if the mode string is null.
+     *
+     * @param modeStr the mode string
+     * @return the encoding mode
+     */
+    public static ENCODING_MODE getEncodingMode(String modeStr) {
+        return ENCODING_MODE.valueOf(modeStr.toUpperCase());
+    }
+}
diff --git a/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/package-info.java b/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/package-info.java
new file mode 100644
index 0000000..3b4f496
--- /dev/null
+++ b/src/main/java/org/apache/sling/scripting/jsp/taglib/helpers/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+@org.osgi.annotation.versioning.Version("2.2.0")
+package org.apache.sling.scripting.jsp.taglib.helpers;
+
diff --git a/src/main/resources/ESAPI.properties b/src/main/resources/ESAPI.properties
new file mode 100644
index 0000000..20c9f5d
--- /dev/null
+++ b/src/main/resources/ESAPI.properties
@@ -0,0 +1,452 @@
+#

+# OWASP Enterprise Security API (ESAPI) Properties file -- PRODUCTION Version

+# 

+# This file is part of the Open Web Application Security Project (OWASP)

+# Enterprise Security API (ESAPI) project. For details, please see

+# http://www.owasp.org/index.php/ESAPI.

+#

+# Copyright (c) 2008,2009 - The OWASP Foundation

+#

+# DISCUSS: This may cause a major backwards compatibility issue, etc. but

+#		   from a name space perspective, we probably should have prefaced

+#		   all the property names with ESAPI or at least OWASP. Otherwise

+#		   there could be problems is someone loads this properties file into

+#		   the System properties.  We could also put this file into the

+#		   esapi.jar file (perhaps as a ResourceBundle) and then allow an external

+#		   ESAPI properties be defined that would overwrite these defaults.

+#		   That keeps the application's properties relatively simple as usually

+#		   they will only want to override a few properties. If looks like we

+#		   already support multiple override levels of this in the

+#		   DefaultSecurityConfiguration class, but I'm suggesting placing the

+#		   defaults in the esapi.jar itself. That way, if the jar is signed,

+#		   we could detect if those properties had been tampered with. (The

+#		   code to check the jar signatures is pretty simple... maybe 70-90 LOC,

+#		   but off course there is an execution penalty (similar to the way

+#		   that the separate sunjce.jar used to be when a class from it was

+#		   first loaded). Thoughts?

+###############################################################################

+#

+# WARNING: Operating system protection should be used to lock down the .esapi

+# resources directory and all the files inside and all the directories all the

+# way up to the root directory of the file system.  Note that if you are using

+# file-based implementations, that some files may need to be read-write as they

+# get updated dynamically.

+#

+# Before using, be sure to update the MasterKey and MasterSalt as described below.

+# N.B.: If you had stored data that you have previously encrypted with ESAPI 1.4,

+#		you *must* FIRST decrypt it using ESAPI 1.4 and then (if so desired)

+#		re-encrypt it with ESAPI 2.0. If you fail to do this, you will NOT be

+#		able to decrypt your data with ESAPI 2.0.

+#

+#		YOU HAVE BEEN WARNED!!! More details are in the ESAPI 2.0 Release Notes.

+#

+#===========================================================================

+# ESAPI Configuration

+#

+# If true, then print all the ESAPI properties set here when they are loaded.

+# If false, they are not printed. Useful to reduce output when running JUnit tests.

+# If you need to troubleshoot a properties related problem, turning this on may help.

+# This is 'false' in the src/test/resources/.esapi version. It is 'true' by

+# default for reasons of backward compatibility with earlier ESAPI versions.

+ESAPI.printProperties=true

+

+# ESAPI is designed to be easily extensible. You can use the reference implementation

+# or implement your own providers to take advantage of your enterprise's security

+# infrastructure. The functions in ESAPI are referenced using the ESAPI locator, like:

+#

+#    String ciphertext =

+#		ESAPI.encryptor().encrypt("Secret message");   // Deprecated in 2.0

+#    CipherText cipherText =

+#		ESAPI.encryptor().encrypt(new PlainText("Secret message")); // Preferred

+#

+# Below you can specify the classname for the provider that you wish to use in your

+# application. The only requirement is that it implement the appropriate ESAPI interface.

+# This allows you to switch security implementations in the future without rewriting the

+# entire application.

+#

+# ExperimentalAccessController requires ESAPI-AccessControlPolicy.xml in .esapi directory

+ESAPI.AccessControl=org.owasp.esapi.reference.DefaultAccessController

+# FileBasedAuthenticator requires users.txt file in .esapi directory

+ESAPI.Authenticator=org.owasp.esapi.reference.FileBasedAuthenticator

+ESAPI.Encoder=org.owasp.esapi.reference.DefaultEncoder

+ESAPI.Encryptor=org.owasp.esapi.reference.crypto.JavaEncryptor

+

+ESAPI.Executor=org.owasp.esapi.reference.DefaultExecutor

+ESAPI.HTTPUtilities=org.owasp.esapi.reference.DefaultHTTPUtilities

+ESAPI.IntrusionDetector=org.owasp.esapi.reference.DefaultIntrusionDetector

+# Log4JFactory Requires log4j.xml or log4j.properties in classpath - http://www.laliluna.de/log4j-tutorial.html

+#ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory

+ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory

+ESAPI.Randomizer=org.owasp.esapi.reference.DefaultRandomizer

+ESAPI.Validator=org.owasp.esapi.reference.DefaultValidator

+

+#===========================================================================

+# ESAPI Authenticator

+#

+Authenticator.AllowedLoginAttempts=3

+Authenticator.MaxOldPasswordHashes=13

+Authenticator.UsernameParameterName=username

+Authenticator.PasswordParameterName=password

+# RememberTokenDuration (in days)

+Authenticator.RememberTokenDuration=14

+# Session Timeouts (in minutes)

+Authenticator.IdleTimeoutDuration=20

+Authenticator.AbsoluteTimeoutDuration=120

+

+#===========================================================================

+# ESAPI Encoder

+#

+# ESAPI canonicalizes input before validation to prevent bypassing filters with encoded attacks.

+# Failure to canonicalize input is a very common mistake when implementing validation schemes.

+# Canonicalization is automatic when using the ESAPI Validator, but you can also use the

+# following code to canonicalize data.

+#

+#      ESAPI.Encoder().canonicalize( "%22hello world&#x22;" );

+#  

+# Multiple encoding is when a single encoding format is applied multiple times. Allowing

+# multiple encoding is strongly discouraged.

+Encoder.AllowMultipleEncoding=false

+

+# Mixed encoding is when multiple different encoding formats are applied, or when 

+# multiple formats are nested. Allowing multiple encoding is strongly discouraged.

+Encoder.AllowMixedEncoding=false

+

+# The default list of codecs to apply when canonicalizing untrusted data. The list should include the codecs

+# for all downstream interpreters or decoders. For example, if the data is likely to end up in a URL, HTML, or

+# inside JavaScript, then the list of codecs below is appropriate. The order of the list is not terribly important.

+Encoder.DefaultCodecList=HTMLEntityCodec,XMLEntityCodec,PercentCodec,JavaScriptCodec

+

+

+#===========================================================================

+# ESAPI Encryption

+#

+# The ESAPI Encryptor provides basic cryptographic functions with a simplified API.

+# To get started, generate a new key using java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor

+# There is not currently any support for key rotation, so be careful when changing your key and salt as it

+# will invalidate all signed, encrypted, and hashed data.

+#

+# WARNING: Not all combinations of algorithms and key lengths are supported.

+# If you choose to use a key length greater than 128, you MUST download the

+# unlimited strength policy files and install in the lib directory of your JRE/JDK.

+# See http://java.sun.com/javase/downloads/index.jsp for more information.

+#

+# Backward compatibility with ESAPI Java 1.4 is supported by the two deprecated API

+# methods, Encryptor.encrypt(String) and Encryptor.decrypt(String). However, whenever

+# possible, these methods should be avoided as they use ECB cipher mode, which in almost

+# all circumstances a poor choice because of it's weakness. CBC cipher mode is the default

+# for the new Encryptor encrypt / decrypt methods for ESAPI Java 2.0.  In general, you

+# should only use this compatibility setting if you have persistent data encrypted with

+# version 1.4 and even then, you should ONLY set this compatibility mode UNTIL

+# you have decrypted all of your old encrypted data and then re-encrypted it with

+# ESAPI 2.0 using CBC mode. If you have some reason to mix the deprecated 1.4 mode

+# with the new 2.0 methods, make sure that you use the same cipher algorithm for both

+# (256-bit AES was the default for 1.4; 128-bit is the default for 2.0; see below for

+# more details.) Otherwise, you will have to use the new 2.0 encrypt / decrypt methods

+# where you can specify a SecretKey. (Note that if you are using the 256-bit AES,

+# that requires downloading the special jurisdiction policy files mentioned above.)

+#

+#		***** IMPORTANT: Do NOT forget to replace these with your own values! *****

+# To calculate these values, you can run:

+#		java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor

+#

+#Encryptor.MasterKey=

+#Encryptor.MasterSalt=

+

+# Provides the default JCE provider that ESAPI will "prefer" for its symmetric

+# encryption and hashing. (That is it will look to this provider first, but it

+# will defer to other providers if the requested algorithm is not implemented

+# by this provider.) If left unset, ESAPI will just use your Java VM's current

+# preferred JCE provider, which is generally set in the file

+# "$JAVA_HOME/jre/lib/security/java.security".

+#

+# The main intent of this is to allow ESAPI symmetric encryption to be

+# used with a FIPS 140-2 compliant crypto-module. For details, see the section

+# "Using ESAPI Symmetric Encryption with FIPS 140-2 Cryptographic Modules" in

+# the ESAPI 2.0 Symmetric Encryption User Guide, at:

+# http://owasp-esapi-java.googlecode.com/svn/trunk/documentation/esapi4java-core-2.0-symmetric-crypto-user-guide.html

+# However, this property also allows you to easily use an alternate JCE provider

+# such as "Bouncy Castle" without having to make changes to "java.security".

+# See Javadoc for SecurityProviderLoader for further details. If you wish to use

+# a provider that is not known to SecurityProviderLoader, you may specify the

+# fully-qualified class name of the JCE provider class that implements

+# java.security.Provider. If the name contains a '.', this is interpreted as

+# a fully-qualified class name that implements java.security.Provider.

+#

+# NOTE: Setting this property has the side-effect of changing it in your application

+#       as well, so if you are using JCE in your application directly rather than

+#       through ESAPI (you wouldn't do that, would you? ;-), it will change the

+#       preferred JCE provider there as well.

+#

+# Default: Keeps the JCE provider set to whatever JVM sets it to.

+Encryptor.PreferredJCEProvider=

+

+# AES is the most widely used and strongest encryption algorithm. This

+# should agree with your Encryptor.CipherTransformation property.

+# By default, ESAPI Java 1.4 uses "PBEWithMD5AndDES" and which is

+# very weak. It is essentially a password-based encryption key, hashed

+# with MD5 around 1K times and then encrypted with the weak DES algorithm

+# (56-bits) using ECB mode and an unspecified padding (it is

+# JCE provider specific, but most likely "NoPadding"). However, 2.0 uses

+# "AES/CBC/PKCSPadding". If you want to change these, change them here.

+# Warning: This property does not control the default reference implementation for

+#		   ESAPI 2.0 using JavaEncryptor. Also, this property will be dropped

+#		   in the future.

+# @deprecated

+Encryptor.EncryptionAlgorithm=AES

+#		For ESAPI Java 2.0 - New encrypt / decrypt methods use this.

+Encryptor.CipherTransformation=AES/CBC/PKCS5Padding

+

+# Applies to ESAPI 2.0 and later only!

+# Comma-separated list of cipher modes that provide *BOTH*

+# confidentiality *AND* message authenticity. (NIST refers to such cipher

+# modes as "combined modes" so that's what we shall call them.) If any of these

+# cipher modes are used then no MAC is calculated and stored

+# in the CipherText upon encryption. Likewise, if one of these

+# cipher modes is used with decryption, no attempt will be made

+# to validate the MAC contained in the CipherText object regardless

+# of whether it contains one or not. Since the expectation is that

+# these cipher modes support support message authenticity already,

+# injecting a MAC in the CipherText object would be at best redundant.

+#

+# Note that as of JDK 1.5, the SunJCE provider does not support *any*

+# of these cipher modes. Of these listed, only GCM and CCM are currently

+# NIST approved. YMMV for other JCE providers. E.g., Bouncy Castle supports

+# GCM and CCM with "NoPadding" mode, but not with "PKCS5Padding" or other

+# padding modes.

+Encryptor.cipher_modes.combined_modes=GCM,CCM,IAPM,EAX,OCB,CWC

+

+# Applies to ESAPI 2.0 and later only!

+# Additional cipher modes allowed for ESAPI 2.0 encryption. These

+# cipher modes are in _addition_ to those specified by the property

+# 'Encryptor.cipher_modes.combined_modes'.

+# Note: We will add support for streaming modes like CFB & OFB once

+# we add support for 'specified' to the property 'Encryptor.ChooseIVMethod'

+# (probably in ESAPI 2.1).

+# DISCUSS: Better name?

+Encryptor.cipher_modes.additional_allowed=CBC

+

+# 128-bit is almost always sufficient and appears to be more resistant to

+# related key attacks than is 256-bit AES. Use '_' to use default key size

+# for cipher algorithms (where it makes sense because the algorithm supports

+# a variable key size). Key length must agree to what's provided as the

+# cipher transformation, otherwise this will be ignored after logging a

+# warning.

+#

+# NOTE: This is what applies BOTH ESAPI 1.4 and 2.0. See warning above about mixing!

+Encryptor.EncryptionKeyLength=128

+

+# Because 2.0 uses CBC mode by default, it requires an initialization vector (IV).

+# (All cipher modes except ECB require an IV.) There are two choices: we can either

+# use a fixed IV known to both parties or allow ESAPI to choose a random IV. While

+# the IV does not need to be hidden from adversaries, it is important that the

+# adversary not be allowed to choose it. Also, random IVs are generally much more

+# secure than fixed IVs. (In fact, it is essential that feed-back cipher modes

+# such as CFB and OFB use a different IV for each encryption with a given key so

+# in such cases, random IVs are much preferred. By default, ESAPI 2.0 uses random

+# IVs. If you wish to use 'fixed' IVs, set 'Encryptor.ChooseIVMethod=fixed' and

+# uncomment the Encryptor.fixedIV.

+#

+# Valid values:		random|fixed|specified		'specified' not yet implemented; planned for 2.1

+Encryptor.ChooseIVMethod=random

+# If you choose to use a fixed IV, then you must place a fixed IV here that

+# is known to all others who are sharing your secret key. The format should

+# be a hex string that is the same length as the cipher block size for the

+# cipher algorithm that you are using. The following is an *example* for AES

+# from an AES test vector for AES-128/CBC as described in:

+# NIST Special Publication 800-38A (2001 Edition)

+# "Recommendation for Block Cipher Modes of Operation".

+# (Note that the block size for AES is 16 bytes == 128 bits.)

+#

+Encryptor.fixedIV=0x000102030405060708090a0b0c0d0e0f

+

+# Whether or not CipherText should use a message authentication code (MAC) with it.

+# This prevents an adversary from altering the IV as well as allowing a more

+# fool-proof way of determining the decryption failed because of an incorrect

+# key being supplied. This refers to the "separate" MAC calculated and stored

+# in CipherText, not part of any MAC that is calculated as a result of a

+# "combined mode" cipher mode.

+#

+# If you are using ESAPI with a FIPS 140-2 cryptographic module, you *must* also

+# set this property to false.

+Encryptor.CipherText.useMAC=true

+

+# Whether or not the PlainText object may be overwritten and then marked

+# eligible for garbage collection. If not set, this is still treated as 'true'.

+Encryptor.PlainText.overwrite=true

+

+# Do not use DES except in a legacy situations. 56-bit is way too small key size.

+#Encryptor.EncryptionKeyLength=56

+#Encryptor.EncryptionAlgorithm=DES

+

+# TripleDES is considered strong enough for most purposes.

+#	Note:	There is also a 112-bit version of DESede. Using the 168-bit version

+#			requires downloading the special jurisdiction policy from Sun.

+#Encryptor.EncryptionKeyLength=168

+#Encryptor.EncryptionAlgorithm=DESede

+

+Encryptor.HashAlgorithm=SHA-512

+Encryptor.HashIterations=1024

+Encryptor.DigitalSignatureAlgorithm=SHA1withDSA

+Encryptor.DigitalSignatureKeyLength=1024

+Encryptor.RandomAlgorithm=SHA1PRNG

+Encryptor.CharacterEncoding=UTF-8

+

+# This is the Pseudo Random Function (PRF) that ESAPI's Key Derivation Function

+# (KDF) normally uses. Note this is *only* the PRF used for ESAPI's KDF and

+# *not* what is used for ESAPI's MAC. (Currently, HmacSHA1 is always used for

+# the MAC, mostly to keep the overall size at a minimum.)

+#

+# Currently supported choices for JDK 1.5 and 1.6 are:

+#	HmacSHA1 (160 bits), HmacSHA256 (256 bits), HmacSHA384 (384 bits), and

+#	HmacSHA512 (512 bits).

+# Note that HmacMD5 is *not* supported for the PRF used by the KDF even though

+# the JDKs support it.  See the ESAPI 2.0 Symmetric Encryption User Guide

+# further details.

+Encryptor.KDF.PRF=HmacSHA256

+#===========================================================================

+# ESAPI HttpUtilties

+#

+# The HttpUtilities provide basic protections to HTTP requests and responses. Primarily these methods 

+# protect against malicious data from attackers, such as unprintable characters, escaped characters,

+# and other simple attacks. The HttpUtilities also provides utility methods for dealing with cookies,

+# headers, and CSRF tokens.

+#

+# Default file upload location (remember to escape backslashes with \\)

+HttpUtilities.UploadDir=C:\\ESAPI\\testUpload

+HttpUtilities.UploadTempDir=C:\\temp

+# Force flags on cookies, if you use HttpUtilities to set cookies

+HttpUtilities.ForceHttpOnlySession=false

+HttpUtilities.ForceSecureSession=false

+HttpUtilities.ForceHttpOnlyCookies=true

+HttpUtilities.ForceSecureCookies=true

+# Maximum size of HTTP headers

+HttpUtilities.MaxHeaderSize=4096

+# File upload configuration

+HttpUtilities.ApprovedUploadExtensions=.zip,.pdf,.doc,.docx,.ppt,.pptx,.tar,.gz,.tgz,.rar,.war,.jar,.ear,.xls,.rtf,.properties,.java,.class,.txt,.xml,.jsp,.jsf,.exe,.dll

+HttpUtilities.MaxUploadFileBytes=500000000

+# Using UTF-8 throughout your stack is highly recommended. That includes your database driver,

+# container, and any other technologies you may be using. Failure to do this may expose you

+# to Unicode transcoding injection attacks. Use of UTF-8 does not hinder internationalization.

+HttpUtilities.ResponseContentType=text/html; charset=UTF-8

+# This is the name of the cookie used to represent the HTTP session

+# Typically this will be the default "JSESSIONID" 

+HttpUtilities.HttpSessionIdName=JSESSIONID

+

+

+

+#===========================================================================

+# ESAPI Executor

+# CHECKME - Not sure what this is used for, but surely it should be made OS independent.

+Executor.WorkingDirectory=C:\\Windows\\Temp

+Executor.ApprovedExecutables=C:\\Windows\\System32\\cmd.exe,C:\\Windows\\System32\\runas.exe

+

+

+#===========================================================================

+# ESAPI Logging

+# Set the application name if these logs are combined with other applications

+Logger.ApplicationName=ExampleApplication

+# If you use an HTML log viewer that does not properly HTML escape log data, you can set LogEncodingRequired to true

+Logger.LogEncodingRequired=false

+# Determines whether ESAPI should log the application name. This might be clutter in some single-server/single-app environments.

+Logger.LogApplicationName=true

+# Determines whether ESAPI should log the server IP and port. This might be clutter in some single-server environments.

+Logger.LogServerIP=true

+# LogFileName, the name of the logging file. Provide a full directory path (e.g., C:\\ESAPI\\ESAPI_logging_file) if you

+# want to place it in a specific directory.

+Logger.LogFileName=ESAPI_logging_file

+# MaxLogFileSize, the max size (in bytes) of a single log file before it cuts over to a new one (default is 10,000,000)

+Logger.MaxLogFileSize=10000000

+

+

+#===========================================================================

+# ESAPI Intrusion Detection

+#

+# Each event has a base to which .count, .interval, and .action are added

+# The IntrusionException will fire if we receive "count" events within "interval" seconds

+# The IntrusionDetector is configurable to take the following actions: log, logout, and disable

+#  (multiple actions separated by commas are allowed e.g. event.test.actions=log,disable

+#

+# Custom Events

+# Names must start with "event." as the base

+# Use IntrusionDetector.addEvent( "test" ) in your code to trigger "event.test" here

+# You can also disable intrusion detection completely by changing

+# the following parameter to true

+#

+IntrusionDetector.Disable=false

+#

+IntrusionDetector.event.test.count=2

+IntrusionDetector.event.test.interval=10

+IntrusionDetector.event.test.actions=disable,log

+

+# Exception Events

+# All EnterpriseSecurityExceptions are registered automatically

+# Call IntrusionDetector.getInstance().addException(e) for Exceptions that do not extend EnterpriseSecurityException

+# Use the fully qualified classname of the exception as the base

+

+# any intrusion is an attack

+IntrusionDetector.org.owasp.esapi.errors.IntrusionException.count=1

+IntrusionDetector.org.owasp.esapi.errors.IntrusionException.interval=1

+IntrusionDetector.org.owasp.esapi.errors.IntrusionException.actions=log,disable,logout

+

+# for test purposes

+# CHECKME: Shouldn't there be something in the property name itself that designates

+#		   that these are for testing???

+IntrusionDetector.org.owasp.esapi.errors.IntegrityException.count=10

+IntrusionDetector.org.owasp.esapi.errors.IntegrityException.interval=5

+IntrusionDetector.org.owasp.esapi.errors.IntegrityException.actions=log,disable,logout

+

+# rapid validation errors indicate scans or attacks in progress

+# org.owasp.esapi.errors.ValidationException.count=10

+# org.owasp.esapi.errors.ValidationException.interval=10

+# org.owasp.esapi.errors.ValidationException.actions=log,logout

+

+# sessions jumping between hosts indicates session hijacking

+IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.count=2

+IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.interval=10

+IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.actions=log,logout

+

+

+#===========================================================================

+# ESAPI Validation

+#

+# The ESAPI Validator works on regular expressions with defined names. You can define names

+# either here, or you may define application specific patterns in a separate file defined below.

+# This allows enterprises to specify both organizational standards as well as application specific

+# validation rules.

+#

+Validator.ConfigurationFile=validation.properties

+

+# Validators used by ESAPI

+Validator.AccountName=^[a-zA-Z0-9]{3,20}$

+Validator.SystemCommand=^[a-zA-Z\\-\\/]{1,64}$

+Validator.RoleName=^[a-z]{1,20}$

+

+#the word TEST below should be changed to your application 

+#name - only relative URL's are supported

+Validator.Redirect=^\\/test.*$

+

+# Global HTTP Validation Rules

+# Values with Base64 encoded data (e.g. encrypted state) will need at least [a-zA-Z0-9\/+=]

+Validator.HTTPScheme=^(http|https)$

+Validator.HTTPServerName=^[a-zA-Z0-9_.\\-]*$

+Validator.HTTPParameterName=^[a-zA-Z0-9_]{1,32}$

+Validator.HTTPParameterValue=^[a-zA-Z0-9.\\-\\/+=@_ ]*$

+Validator.HTTPCookieName=^[a-zA-Z0-9\\-_]{1,32}$

+Validator.HTTPCookieValue=^[a-zA-Z0-9\\-\\/+=_ ]*$

+Validator.HTTPHeaderName=^[a-zA-Z0-9\\-_]{1,32}$

+Validator.HTTPHeaderValue=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$

+Validator.HTTPContextPath=^\\/?[a-zA-Z0-9.\\-\\/_]*$

+Validator.HTTPServletPath=^[a-zA-Z0-9.\\-\\/_]*$

+Validator.HTTPPath=^[a-zA-Z0-9.\\-_]*$

+Validator.HTTPQueryString=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ %]*$

+Validator.HTTPURI=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$

+Validator.HTTPURL=^.*$

+Validator.HTTPJSESSIONID=^[A-Z0-9]{10,30}$

+

+# Validation of file related input

+Validator.FileName=^[a-zA-Z0-9!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$

+Validator.DirectoryName=^[a-zA-Z0-9:/\\\\!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$

+

+# Validation of dates. Controls whether or not 'lenient' dates are accepted.

+# See DataFormat.setLenient(boolean flag) for further details.

+Validator.AcceptLenientDates=false
\ No newline at end of file