org.agnitas.web.forms.StrutsFormBase.java Source code

Java tutorial

Introduction

Here is the source code for org.agnitas.web.forms.StrutsFormBase.java

Source

/*********************************************************************************
 * The contents of this file are subject to the Common Public Attribution
 * License Version 1.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.openemm.org/cpal1.html. The License is based on the Mozilla
 * Public License Version 1.1 but Sections 14 and 15 have been added to cover
 * use of software over a computer network and provide for limited attribution
 * for the Original Developer. In addition, Exhibit A has been modified to be
 * consistent with Exhibit B.
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 * 
 * The Original Code is OpenEMM.
 * The Original Developer is the Initial Developer.
 * The Initial Developer of the Original Code is AGNITAS AG. All portions of
 * the code written by AGNITAS AG are Copyright (c) 2007 AGNITAS AG. All Rights
 * Reserved.
 * 
 * Contributor(s): AGNITAS AG. 
 ********************************************************************************/

package org.agnitas.web.forms;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.agnitas.beans.Admin;
import org.agnitas.util.AgnUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * Implementation of <strong>Action</strong> that validates a user logon.
 *
 * @author Craig R. McClanahan
 * @version $Revision: 1.1 $ $Date: 2006/08/03 08:47:47 $
 */

public class StrutsFormBase extends org.apache.struts.action.ActionForm {

    /**
    * 
    */
    private static final long serialVersionUID = -517998059502119608L;
    public static final int DEFAULT_NUMBER_OF_ROWS = 50;
    public static final int DEFAULT_REFRESH_MILLIS = 250;

    public static final int WIDTH_STATE_UNDEFINED = -1;
    public static final int WIDTH_STATE_NORMAL = 0;
    public static final int WIDTH_STATE_WIDE = 1;

    private static final Pattern htmlTagPattern;

    static {
        htmlTagPattern = Pattern.compile("^.*?</?(\\w+)[^>]*>(.*)$", Pattern.MULTILINE | Pattern.DOTALL);
    }

    /**
     * List of HTML tags. Alls tags in the list are assumed to be safe (no XSS).
     */
    public static final String[] GENERIC_SAFE_HTML_TAGS = { "u", "i", "b", "p", "div", "span", "img", "a", "font",
            "br", "map", "area" };

    /**
     *  holds the preferred number of rows a user wants to see in a list
     */
    private int numberofRows = -1; // -1 -> not initialized
    /**
     * flag which show's that the number of rows a user wants to see has been changed
     */
    private boolean numberOfRowsChanged = false;

    // keep sort, order , page , columnwidth
    private String sort = "";
    private String order = "";
    private String page = "1";
    protected List<String> columnwidthsList = new ArrayList<String>();

    private int refreshMillis = DEFAULT_REFRESH_MILLIS;
    private boolean error = false;

    private int extendedWidthState = WIDTH_STATE_UNDEFINED;

    /**
      * Getter for property companyID.
      *
      * @return Value of property companyID.
      * @param req
      */
    public int getCompanyID(HttpServletRequest req) {

        int companyID = 0;

        try {
            companyID = AgnUtils.getAdmin(req).getCompany().getId();
        } catch (Exception e) {
            AgnUtils.logger().error("getCompanyID: " + e.getMessage());
            companyID = 0;
        }

        return companyID;
    }

    /**
     * Checks permission.
     */
    protected static boolean allowed(String id, HttpServletRequest req) {
        Admin aAdmin = AgnUtils.getAdmin(req);
        if (aAdmin == null) {
            return false; //Nothing allowed if there is no permission set in Session
        } else {
            return aAdmin.permissionAllowed(id);
        }
    }

    /**
     * Resets parameters.
     */
    @Override
    public void reset(ActionMapping map, HttpServletRequest request) {
        String aCBox = null;
        String name = null;
        String value = null;

        Enumeration names = request.getParameterNames();
        while (names.hasMoreElements()) {
            name = (String) names.nextElement();
            if (name.startsWith("__STRUTS_CHECKBOX_") && name.length() > 18) {
                aCBox = name.substring(18);
                try {
                    if ((value = request.getParameter(name)) != null) {
                        BeanUtils.setProperty(this, aCBox, value);
                    }
                } catch (Exception e) {
                    AgnUtils.logger().error("reset: " + e.getMessage());
                }
            }
        }
    }

    /**
     * Getter for property webApplicationContext.
     *
     * @return Value of property webApplicationContext.
     */
    public ApplicationContext getWebApplicationContext() {
        return WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());
    }

    public int getNumberofRows() {
        return numberofRows;
    }

    public void setNumberofRows(int numberofRows) {
        this.numberofRows = numberofRows;
    }

    public boolean isNumberOfRowsChanged() {
        return numberOfRowsChanged;
    }

    public void setNumberOfRowsChanged(boolean numberOfRowsChanged) {
        this.numberOfRowsChanged = numberOfRowsChanged;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

    public int getRefreshMillis() {
        return refreshMillis;
    }

    public void setRefreshMillis(int refreshMillis) {
        this.refreshMillis = refreshMillis;
    }

    public boolean isError() {
        return error;
    }

    public void setError(boolean error) {
        this.error = error;
    }

    public List<String> getColumnwidthsList() {
        return columnwidthsList;
    }

    public void setColumnwidthsList(List<String> columnwidthsList) {
        this.columnwidthsList = columnwidthsList;
    }

    /**
     * Original validate() called by Struts.
     * This method is made "final" to force calling method checkForUnsafeHtmlTags(). 
     * If you want to implement your own validate() use formSpecificValidate()!
     * 
     * @see formSpecificVaidate(ActionMapping, HttpServletRequest)
     */
    @Override
    public final ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {

        // First, check if we can find HTML tags in at least one request parameter.
        ActionErrors errors = checkForHtmlTags(request);

        // The do user defined (and form specific) validation
        errors.add(formSpecificValidate(mapping, request));

        errors.add(super.validate(mapping, request));

        return errors;
    }

    public ActionErrors formSpecificValidate(ActionMapping mapping, HttpServletRequest request) {
        return null;
    }

    protected ActionErrors checkForHtmlTags(HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        Set<String> tagNames = getUnsafeHtmlTagNames(request);

        for (String tagName : tagNames)
            errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("mailing.unsafe_html_tag", tagName));

        return errors;
    }

    /**
     * Checks, if parameter is excluded from checking for unsafe HTML tags. If method returns false,
     * method checkForHtmlTags() is called.
     * 
     * If method is not overwritten, false is returned for every parameter name.
     * 
     * @param parameterName parameter name
     * @param request TODO
     * @return true, if parameter is excluded from check for unsafe HTML tags
     */
    protected boolean isParameterExcludedForUnsafeHtmlTagCheck(String parameterName, HttpServletRequest request) {
        return false;
    }

    protected Set<String> getUnsafeHtmlTagNames(HttpServletRequest request) {
        Set<String> tagNames = new HashSet<String>();
        Enumeration parameterNames = request.getParameterNames();

        while (parameterNames.hasMoreElements()) {
            String paramName = (String) parameterNames.nextElement();

            if (!isParameterExcludedForUnsafeHtmlTagCheck(paramName, request)) {
                tagNames.addAll(getAllUnsafeHtmlTagNames(paramName, request.getParameterValues(paramName)));
            }
        }

        return tagNames;
    }

    protected Set<String> getAllUnsafeHtmlTagNames(String paramName, String[] textArray) {
        Set<String> tagNames = new HashSet<String>();

        for (String text : textArray)
            tagNames.addAll(getUnsafeHtmlTagNames(paramName, text));

        return tagNames;
    }

    protected Set<String> getUnsafeHtmlTagNames(String paramName, String text) {
        Set<String> tagNames = new HashSet<String>();
        String tagName;

        Matcher matcher = htmlTagPattern.matcher(text);
        while (matcher.matches()) {
            tagName = matcher.group(1).toLowerCase();

            if (isUnsafeHtmlTagForParameter(tagName, paramName))
                tagNames.add(tagName);

            matcher = htmlTagPattern.matcher(matcher.group(2));
        }

        return tagNames;
    }

    protected boolean isUnsafeHtmlTagForParameter(String tagName, String paramName) {
        return !ArrayUtils.contains(GENERIC_SAFE_HTML_TAGS, tagName);
    }

    public int getExtendedWidthState() {
        return extendedWidthState;
    }

    public void setExtendedWidthState(int extendedWidthState) {
        this.extendedWidthState = extendedWidthState;
    }
}