001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.view.client.web.struts;
018
019import com.echothree.control.user.security.common.SecurityUtil;
020import com.echothree.control.user.security.common.result.CheckSecurityRolesResult;
021import com.echothree.model.data.user.common.pk.UserVisitPK;
022import com.echothree.util.common.command.CommandResult;
023import com.echothree.view.client.web.WebConstants;
024import com.echothree.view.client.web.taglib.TagConstants;
025import com.google.common.base.Splitter;
026import java.util.HashSet;
027import java.util.Map;
028import javax.naming.NamingException;
029import javax.servlet.http.HttpServletRequest;
030import org.apache.struts.action.Action;
031import org.apache.struts.taglib.html.Constants;
032import org.displaytag.tags.TableTagParameters;
033import org.displaytag.util.ParamEncoder;
034
035public abstract class BaseAction
036        extends Action {
037    
038    public static UserVisitPK getUserVisitPK(HttpServletRequest request) {
039        var httpSession = request.getSession(true);
040        
041        return (UserVisitPK)httpSession.getAttribute(WebConstants.Session_USER_VISIT);
042    }
043    
044    protected CommandResult setCommandResultAttribute(HttpServletRequest request, CommandResult commandResult) {
045        request.setAttribute(TagConstants.CommandResultName, commandResult);
046        
047        return commandResult;
048    }
049    
050    public static boolean wasOptions(HttpServletRequest request) {
051        return request.getMethod().equals(WebConstants.Method_OPTIONS);
052    }
053    
054    public static boolean wasGet(HttpServletRequest request) {
055        return request.getMethod().equals(WebConstants.Method_GET);
056    }
057    
058    public static boolean wasPost(HttpServletRequest request) {
059        return request.getMethod().equals(WebConstants.Method_POST);
060    }
061    
062    public static boolean wasCanceled(HttpServletRequest request) {
063        var submitButtonValue = request.getParameter(WebConstants.Parameter_SUBMIT_BUTTON);
064        var wasCanceled = false;
065        
066        if(submitButtonValue != null) {
067            if(submitButtonValue.equals(Constants.CANCEL_PROPERTY)) {
068                wasCanceled = true;
069            }
070        }
071        
072        return wasCanceled;
073    }
074    
075    public void setupDtAttributes(HttpServletRequest request, String dtIdAttribute) {
076        var paramEncoder = new ParamEncoder(dtIdAttribute);
077        
078        request.setAttribute(WebConstants.Attribute_DT_ID_ATTRIBUTE, dtIdAttribute);
079        request.setAttribute(WebConstants.Attribute_DT_SORT_PARAMETER, request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_SORT)));
080        request.setAttribute(WebConstants.Attribute_DT_PAGE_PARAMETER, request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_PAGE)));
081        request.setAttribute(WebConstants.Attribute_DT_ORDER_PARAMETER, request.getParameter(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_ORDER)));
082    }
083    
084    public void setupDtParameters(Map<String, String> parameters, BaseActionForm actionForm) {
085        var paramEncoder = new ParamEncoder(actionForm.getDtIdAttribute());
086        var dtSortParameter = actionForm.getDtSortParameter();
087        var dtPageParameter = actionForm.getDtPageParameter();
088        var dtOrderParameter = actionForm.getDtOrderParameter();
089        
090        if(dtSortParameter != null && dtSortParameter.length() > 0) {
091            parameters.put(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_SORT), dtSortParameter);
092        }
093        
094        if(dtPageParameter != null && dtPageParameter.length() > 0) {
095            parameters.put(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_PAGE), dtPageParameter);
096        }
097        
098        if(dtOrderParameter != null && dtOrderParameter.length() > 0) {
099            parameters.put(paramEncoder.encodeParameterName(TableTagParameters.PARAMETER_ORDER), dtOrderParameter);
100        }
101    }
102
103    public void checkSecurityRoles(HttpServletRequest request, String securityRoles)
104            throws NamingException {
105        String newSecurityRoles = null;
106        var pageSecurityRoles = (HashSet<String>)request.getAttribute(WebConstants.Attribute_SECURITY_ROLES);
107        var commandForm = SecurityUtil.getHome().getCheckSecurityRolesForm();
108
109        commandForm.setSecurityRoles(securityRoles);
110
111        var commandResult = SecurityUtil.getHome().checkSecurityRoles(getUserVisitPK(request), commandForm);
112
113        if(!commandResult.hasErrors()) {
114            var executionResult = commandResult.getExecutionResult();
115            var checkSecurityRolesResult = (CheckSecurityRolesResult)executionResult.getResult();
116            newSecurityRoles = checkSecurityRolesResult.getSecurityRoles();
117        }
118
119        if(newSecurityRoles != null) {
120            var newSecurityRolesArray = Splitter.on(':').trimResults().omitEmptyStrings().splitToList(newSecurityRoles).toArray(new String[0]);
121            var newSecurityRolesArrayLength = newSecurityRolesArray.length;
122
123            if(pageSecurityRoles == null) {
124                pageSecurityRoles = new HashSet<>(newSecurityRolesArrayLength);
125            }
126
127            for(var i = 0; i < newSecurityRolesArrayLength; i++) {
128                pageSecurityRoles.add(newSecurityRolesArray[i]);
129            }
130        }
131
132        request.setAttribute(WebConstants.Attribute_SECURITY_ROLES, pageSecurityRoles);
133    }
134
135    public boolean hasSecurityRole(HttpServletRequest request, String securityRoles) {
136        var pageSecurityRoles = (HashSet<String>)request.getAttribute(WebConstants.Attribute_SECURITY_ROLES);
137        var securityRoleFound = false;
138
139        if(pageSecurityRoles != null && securityRoles != null) {
140            var securityRolesToCheck = Splitter.on(':').trimResults().omitEmptyStrings().splitToList(securityRoles).toArray(new String[0]);
141            var securityRolesToCheckLength = securityRolesToCheck.length;
142
143            for(var i = 0; i < securityRolesToCheckLength; i++) {
144                if(pageSecurityRoles.contains(securityRolesToCheck[i])) {
145                    securityRoleFound = true;
146                    break;
147                }
148            }
149        }
150
151        return securityRoleFound;
152    }
153    
154}