You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2010/11/29 13:36:01 UTC

svn commit: r1040088 - /myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java

Author: gpetracek
Date: Mon Nov 29 12:36:01 2010
New Revision: 1040088

URL: http://svn.apache.org/viewvc?rev=1040088&view=rev
Log:
EXTCDI-60 fallback if there isn't a view-root

Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java?rev=1040088&r1=1040087&r2=1040088&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/security/SecurityViewListener.java Mon Nov 29 12:36:01 2010
@@ -19,7 +19,7 @@
 package org.apache.myfaces.extensions.cdi.jsf.impl.security;
 
 import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.AfterPhase;
-import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseId;
+import static org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseId.*;
 import static org.apache.myfaces.extensions.cdi.jsf.impl.util.SecurityUtils.tryToHandleSecurityViolation;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCache;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigEntry;
@@ -30,14 +30,33 @@ import javax.enterprise.event.Observes;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.faces.event.PhaseEvent;
 import javax.faces.context.FacesContext;
+import java.util.Map;
 
 /**
+ * If you don't need it or there is any issue, deactivate it via a CDI extension via
+ * {@link javax.enterprise.inject.spi.ProcessAnnotatedType#veto()} .
+ * 
  * @author Gerhard Petracek
  */
 public class SecurityViewListener
 {
-    public void checkPermission(
-            @Observes @AfterPhase(JsfPhaseId.RESTORE_VIEW) PhaseEvent event, BeanManager beanManager)
+    private static final String LAZY_SECURITY_CHECK_KEY = "LAZY_SECURITY_CHECK";
+
+    public void checkPermission(@Observes @AfterPhase(RESTORE_VIEW) PhaseEvent event, BeanManager beanManager)
+    {
+        FacesContext facesContext = event.getFacesContext();
+
+        if(facesContext.getViewRoot() == null)
+        {
+            triggerFallback(facesContext);
+            return;
+        }
+
+        checkPermission(beanManager, facesContext);
+    }
+
+    public void checkPermissionBeforeRendering(
+            @Observes @AfterPhase(RENDER_RESPONSE) PhaseEvent event, BeanManager beanManager)
     {
         FacesContext facesContext = event.getFacesContext();
 
@@ -47,6 +66,16 @@ public class SecurityViewListener
             return;
         }
 
+        Map<String, Object> requestMap = getRequestMap(facesContext);
+
+        if(requestMap != null && Boolean.TRUE.equals(requestMap.get(LAZY_SECURITY_CHECK_KEY)))
+        {
+            checkPermission(beanManager, facesContext);
+        }
+    }
+
+    private void checkPermission(BeanManager beanManager, FacesContext facesContext)
+    {
         ViewConfigEntry entry = ViewConfigCache.getViewDefinition(facesContext.getViewRoot().getViewId());
 
         if(entry == null)
@@ -64,4 +93,25 @@ public class SecurityViewListener
             facesContext.renderResponse();
         }
     }
+
+    private void triggerFallback(FacesContext facesContext)
+    {
+        Map<String, Object> requestMap = getRequestMap(facesContext);
+
+        if(requestMap != null)
+        {
+            requestMap.put(LAZY_SECURITY_CHECK_KEY, Boolean.TRUE);
+        }
+    }
+
+    private Map<String, Object> getRequestMap(FacesContext facesContext)
+    {
+        if(facesContext.getExternalContext() == null || facesContext.getExternalContext().getRequestMap() == null)
+        {
+            //TODO log warning
+            return null;
+        }
+
+        return facesContext.getExternalContext().getRequestMap();
+    }
 }