diff --git a/source/java/org/alfresco/web/app/ContextListener.java b/source/java/org/alfresco/web/app/ContextListener.java index 7d73f05010..868a64154b 100644 --- a/source/java/org/alfresco/web/app/ContextListener.java +++ b/source/java/org/alfresco/web/app/ContextListener.java @@ -253,10 +253,11 @@ public class ContextListener implements ServletContextListener, HttpSessionListe if (user != null) { - // invalidate ticket + // invalidate ticket and clear the Security context for this thread WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); - AuthenticationService authService = (AuthenticationService) ctx.getBean("authenticationService"); + AuthenticationService authService = (AuthenticationService)ctx.getBean("authenticationService"); authService.invalidateTicket(user.getTicket()); + authService.clearCurrentSecurityContext(); event.getSession().removeAttribute(AuthenticationHelper.AUTHENTICATION_USER); } } diff --git a/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java b/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java index 79b13cfb53..dfd980121a 100644 --- a/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java +++ b/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java @@ -128,6 +128,10 @@ public class ExternalAccessServlet extends HttpServlet // TODO: the browse bean should accept a full NodeRef - not just an ID browseBean.setupContentAction(nodeRef.getId(), true); } + + // perform the appropriate JSF navigation outcome + NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); + navigationHandler.handleNavigation(fc, null, outcome); } else if (OUTCOME_SPACEDETAILS.equals(outcome)) { @@ -149,6 +153,10 @@ public class ExternalAccessServlet extends HttpServlet // TODO: the browse bean should accept a full NodeRef - not just an ID browseBean.setupSpaceAction(nodeRef.getId(), true); } + + // perform the appropriate JSF navigation outcome + NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); + navigationHandler.handleNavigation(fc, null, outcome); } else if (OUTCOME_BROWSE.equals(outcome)) { @@ -162,29 +170,22 @@ public class ExternalAccessServlet extends HttpServlet StoreRef storeRef = new StoreRef(args[0+offset], args[1+offset]); nodeRef = new NodeRef(storeRef, args[2+offset]); - // setup the ref as current Id in the global navigation bean - NavigationBean navigator = (NavigationBean)ServletHelper.getManagedBean(fc, "NavigationBean"); - navigator.setCurrentNodeId(nodeRef.getId()); + // this call sets up the current node Id, and updates or initialises the + // breadcrumb component with the selected node as appropriate. + browseBean.updateUILocation(nodeRef); + browseBean.contextUpdated(); - // - // TODO: handle this code - /* // check for view mode first argument if (args[0].equals(ARG_TEMPLATE)) { browseBean.setDashboardView(true); - // the above call will auto-navigate to the correct outcome - so we don't! - //externalOutcome = null; } - */ + + // the above calls setup the NavigationHandler automatically } } } - // perform the appropriate JSF navigation outcome - NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); - navigationHandler.handleNavigation(fc, null, outcome); - // perform the forward to the page processed by the Faces servlet String viewId = fc.getViewRoot().getViewId(); getServletContext().getRequestDispatcher(AuthenticationHelper.FACES_SERVLET + viewId).forward(req, res); diff --git a/source/java/org/alfresco/web/bean/BrowseBean.java b/source/java/org/alfresco/web/bean/BrowseBean.java index 20ab2ef2df..57a29b0c89 100644 --- a/source/java/org/alfresco/web/bean/BrowseBean.java +++ b/source/java/org/alfresco/web/bean/BrowseBean.java @@ -1257,7 +1257,7 @@ public class BrowseBean implements IContextListener * * @param ref NodeRef of the selected space */ - /*package*/ void updateUILocation(NodeRef ref) + public void updateUILocation(NodeRef ref) { // get the current breadcrumb location and append a new handler to it // our handler know the ID of the selected node and the display label for it diff --git a/source/java/org/alfresco/web/bean/LoginBean.java b/source/java/org/alfresco/web/bean/LoginBean.java index f2fdd88de3..2dc4bbba5c 100644 --- a/source/java/org/alfresco/web/bean/LoginBean.java +++ b/source/java/org/alfresco/web/bean/LoginBean.java @@ -351,7 +351,9 @@ public class LoginBean boolean alfrescoAuth = (session.get(LOGIN_EXTERNAL_AUTH) == null); - // invalidate Session for this user + // Invalidate Session for this user. + // This causes the sessionDestroyed() event to be processed by ContextListener + // which is responsible for invalidating the ticket and clearing the security context if (Application.inPortalServer() == false) { HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); @@ -363,13 +365,6 @@ public class LoginBean request.getPortletSession().invalidate(); } - // invalidate User ticket - if (user != null) - { - this.authenticationService.invalidateTicket(user.getTicket()); - this.authenticationService.clearCurrentSecurityContext(); - } - // Request that the username cookie state is removed - this is not // possible from JSF - so instead we setup a session variable // which will be detected by the login.jsp/Portlet as appropriate. diff --git a/source/java/org/alfresco/web/bean/NavigationBean.java b/source/java/org/alfresco/web/bean/NavigationBean.java index 8032c215ff..78ef0fc760 100644 --- a/source/java/org/alfresco/web/bean/NavigationBean.java +++ b/source/java/org/alfresco/web/bean/NavigationBean.java @@ -389,17 +389,24 @@ public class NavigationBean { if (this.location == null) { - // init the location from the User object for the first time - User user = Application.getCurrentUser(FacesContext.getCurrentInstance()); - - NodeRef homeSpaceRef = new NodeRef(Repository.getStoreRef(), user.getHomeSpaceId()); - String homeSpaceName = Repository.getNameForNode(this.nodeService, homeSpaceRef); - - // set the current node to the users Home Space Id - setCurrentNodeId(user.getHomeSpaceId()); - - // setup the breadcrumb with the same location + // set the current node to the users Home Space Id if one has not already been set + NodeRef homeSpaceRef; List elements = new ArrayList(1); + if (getCurrentNodeId() == null) + { + User user = Application.getCurrentUser(FacesContext.getCurrentInstance()); + homeSpaceRef = new NodeRef(Repository.getStoreRef(), user.getHomeSpaceId()); + } + else + { + homeSpaceRef = new NodeRef(Repository.getStoreRef(), getCurrentNodeId()); + } + + // set initial node ID + setCurrentNodeId(homeSpaceRef.getId()); + + // setup the breadcrumb with the same initial location + String homeSpaceName = Repository.getNameForNode(this.nodeService, homeSpaceRef); elements.add(new NavigationBreadcrumbHandler(homeSpaceRef, homeSpaceName)); setLocation(elements); }