1 19 20 package com.sslexplorer.core; 21 22 import java.io.IOException ; 23 import java.util.HashMap ; 24 import java.util.Iterator ; 25 import java.util.Locale ; 26 import java.util.Map ; 27 import java.util.StringTokenizer ; 28 29 import javax.servlet.ServletException ; 30 import javax.servlet.http.Cookie ; 31 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 import javax.servlet.http.HttpSession ; 34 import javax.servlet.http.HttpSessionBindingEvent ; 35 import javax.servlet.http.HttpSessionBindingListener ; 36 37 import org.apache.struts.Globals; 38 import org.apache.struts.action.Action; 39 import org.apache.struts.action.ActionForm; 40 import org.apache.struts.action.ActionForward; 41 import org.apache.struts.action.ActionMapping; 42 import org.apache.struts.action.ActionMessage; 43 import org.apache.struts.action.ActionMessages; 44 import org.apache.struts.tiles.TilesRequestProcessor; 45 46 import com.sslexplorer.boot.ContextHolder; 47 import com.sslexplorer.boot.HostService; 48 import com.sslexplorer.boot.PropertyList; 49 import com.sslexplorer.boot.Util; 50 import com.sslexplorer.navigation.MenuTree; 51 import com.sslexplorer.navigation.NavigationManager; 52 import com.sslexplorer.properties.Property; 53 import com.sslexplorer.properties.impl.systemconfig.SystemConfigKey; 54 import com.sslexplorer.security.Constants; 55 import com.sslexplorer.tasks.TaskHttpServletRequest; 56 57 66 public class CoreRequestProcessor extends TilesRequestProcessor { 67 68 final static Map <String , HttpSession > sessions = new HashMap <String , HttpSession >(); 69 static CoreRequestProcessor requestProcessor; 70 71 75 public CoreRequestProcessor() { 76 super(); 77 requestProcessor = this; 78 } 79 80 85 public static CoreRequestProcessor getRequestProcessor() { 86 return requestProcessor; 87 } 88 89 94 public static Map getSessions() { 95 return sessions; 96 } 97 98 104 public void process(HttpServletRequest request, HttpServletResponse response) throws IOException , ServletException { 105 HttpSession session = request.getSession(); 106 107 if (session.getAttribute(Constants.SESSION_HOOK) == null) { 108 109 sessions.put(session.getId(), session); 110 session.setAttribute(Constants.SESSION_HOOK, new HttpSessionBindingListener () { 111 112 public void valueBound(HttpSessionBindingEvent arg0) { 113 } 114 115 public void valueUnbound(HttpSessionBindingEvent arg0) { 116 sessions.remove(arg0.getSession().getId()); 117 } 118 }); 119 120 if (!ContextHolder.getContext().isSetupMode()) { 123 String action = Property.getProperty(new SystemConfigKey("webServer.invalidHostnameAction")); 124 PropertyList validExternalHosts = Property.getPropertyList(new SystemConfigKey("webServer.validExternalHostnames")); 125 ; 126 if (validExternalHosts.size() != 0) { 127 Iterator it = validExternalHosts.iterator(); 128 String host = request.getHeader("Host"); 129 HostService hostService = host == null ? null : new HostService(host); 130 boolean hostOk = false; 131 String firstHost = (String ) it.next(); 132 if (hostService != null && !hostService.getHost().equals("")) { 133 if (hostService.getHost().startsWith("activeproxy")) { 134 int idx = hostService.getHost().indexOf("."); 135 hostService.setHost(hostService.getHost().substring(idx + 1)); 136 } 137 String thisHost = firstHost; 138 do { 139 if (hostService.getHost().equals(thisHost)) { 140 hostOk = true; 141 } else { 142 if (it.hasNext()) { 143 thisHost = (String ) it.next(); 144 } 145 } 146 } while (!hostOk && it.hasNext()); 147 } 148 if (!hostOk) { 149 if (action.equals("redirect")) { 150 String path = (request.isSecure() ? "https" : "http") + "://" + firstHost; 151 if (ContextHolder.getContext().getPort() != 443) { 152 path += ":" + ContextHolder.getContext().getPort(); 153 } 154 path += Util.getOriginalRequest(request); 155 session.invalidate(); 156 response.sendRedirect(path); 157 return; 158 } else if (action.equals("error")) { 159 response.sendError(HttpServletResponse.SC_NOT_FOUND); 160 return; 161 } else if (action.equals("disconnect")) { 162 response.getOutputStream().close(); 163 return; 164 } 165 } 166 } 167 } else { 168 session.setMaxInactiveInterval(Integer.MAX_VALUE); 170 } 171 172 setDefaultLocale(request, session); 174 175 CoreServlet.getServlet().fireCoreEvent(new NewHTTPSessionEvent(this, request, response)); 176 } 177 178 179 RedirectWithMessages.repopulate(request); 180 181 try { 182 super.process(request, response); 183 } catch (ServletException se) { 184 189 if (se.getMessage() != null && se.getMessage().indexOf("BeanUtils.populate") != -1) { 190 log.error("User probably commited a form after their session had timed out.", se); 191 log.error("Cause.", se.getRootCause()); 192 request.getSession().getServletContext().getRequestDispatcher("/showHome.do").forward(request, response); 193 } else { 194 log.error("Error processing request. ", se); 195 throw se; 196 } 197 } 198 } 199 200 203 @Override  204 protected void doForward(String uri, HttpServletRequest request, HttpServletResponse response) throws IOException , 205 ServletException { 206 if (request.getAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD) != null) { 207 log.warn("Not forwarding as part of task"); 208 } else { 209 super.doForward(uri, request, response); 210 } 211 } 212 213 private void setDefaultLocale(HttpServletRequest request, HttpSession session) { 214 String defaultLocale = Property.getProperty(new SystemConfigKey("ui.defaultLanguage")); 215 try { 216 Cookie [] c = request.getCookies(); 217 if (c != null) { 218 for (int i = 0; i < c.length; i++) { 219 if (c[i].getName().equals(System.getProperty("sslexplorer.cookie", "SSLX_SSESHID") + "_LANG")) { 220 defaultLocale = c[i].getValue(); 221 break; 222 } 223 } 224 } 225 Locale locale; 226 if(Util.isNullOrTrimmedBlank(defaultLocale)) 227 locale = Locale.getDefault(); 228 else { 229 232 StringTokenizer t = new StringTokenizer (defaultLocale, "_"); 233 String lang = t.nextToken(); 234 String country = t.hasMoreTokens() ? t.nextToken() : ""; 235 String variant = t.hasMoreTokens() ? t.nextToken() : ""; 236 locale = new Locale (lang, country, variant); 237 } 238 session.setAttribute(Globals.LOCALE_KEY, locale); 239 } catch (Exception e) { 240 log.error("Failed to set default locale.", e); 241 } 242 } 243 244 @Override  245 protected ActionForward processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping) throws IOException , ServletException { 246 247 ActionForward actionForward = super.processActionPerform(request, response, action, form, mapping); 248 if(actionForward != null && request.getAttribute(TaskHttpServletRequest.ATTR_TASK) != null) { 249 request.setAttribute(TaskHttpServletRequest.ATTR_TASK_FORWARD, actionForward); 250 } 251 252 String servletPath = request.getServletPath(); 254 if (servletPath.startsWith("/") && servletPath.endsWith(".do")) { 255 servletPath = servletPath.substring(1, servletPath.length() - 3); 256 MenuTree pageTaskMenuTree = NavigationManager.getMenuTree(PageTaskMenuTree.PAGE_TASK_MENU_TREE); 257 MenuItem pageTasks = pageTaskMenuTree.getMenuItem(servletPath); 258 if (pageTasks != null) { 259 request.setAttribute(Constants.PAGE_TASKS, pageTaskMenuTree.rebuildMenus(pageTasks, request)); 260 } else { 261 request.removeAttribute(Constants.PAGE_TASKS); 262 } 263 MenuTree toolBarMenuTree = NavigationManager.getMenuTree(ToolBarMenuTree.TOOL_BAR_MENU_TREE); 264 MenuItem toolBarItems = toolBarMenuTree.getMenuItem(servletPath); 265 if (toolBarItems != null) { 266 request.setAttribute(Constants.TOOL_BAR_ITEMS, toolBarMenuTree.rebuildMenus(toolBarItems, request)); 267 } else { 268 request.removeAttribute(Constants.TOOL_BAR_ITEMS); 269 } 270 } else { 271 request.removeAttribute(Constants.PAGE_TASKS); 272 request.removeAttribute(Constants.TOOL_BAR_ITEMS); 273 } 274 275 276 processActionMessages(request, response); 277 return actionForward; 278 } 279 280 @Override  281 protected boolean processValidate(HttpServletRequest request, HttpServletResponse response, ActionForm form, ActionMapping mapping) throws IOException , ServletException { 282 283 284 boolean validated = super.processValidate(request, response, form, mapping); 285 if(!validated) { 286 processActionMessages(request, response); 287 } 288 return validated; 289 } 290 291 private static void processActionMessages(HttpServletRequest request, HttpServletResponse response) { 292 if (isRunningUnitTests()) { 293 addHeader(request, response, "unitTestMessages", Globals.MESSAGE_KEY); 294 addHeader(request, response, "unitTestErrors", Globals.ERROR_KEY); 295 } 296 } 297 298 private static void addHeader(HttpServletRequest request, HttpServletResponse response, String headerName, String key) { 299 String actionMessages = getActionMessages(request, key); 300 if (actionMessages.length() != 0) { 301 response.setHeader(headerName, actionMessages); 302 } 303 } 304 305 private static String getActionMessages(HttpServletRequest request, String key) { 306 ActionMessages messages = (ActionMessages) request.getAttribute(key); 307 if (messages != null) { 308 StringBuffer buffer = new StringBuffer (); 309 for (Iterator itr = messages.get(); itr.hasNext();) { 310 ActionMessage next = (ActionMessage) itr.next(); 311 buffer.append(next.getKey()).append(","); 312 } 313 return buffer.toString(); 314 } 315 return ""; 316 } 317 318 private static boolean isRunningUnitTests() { 319 String isRunningUnitTests = System.getProperty("sslexplorer.testing", "false"); 320 return Boolean.valueOf(isRunningUnitTests); 321 } 322 }
| Popular Tags
|