/*
 * 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());
    }
}
