diff --git a/source/java/org/alfresco/repo/web/activiti/ActivitiLoggedInUser.java b/source/java/org/alfresco/repo/web/activiti/ActivitiLoggedInUser.java
new file mode 100644
index 0000000000..537d9d7184
--- /dev/null
+++ b/source/java/org/alfresco/repo/web/activiti/ActivitiLoggedInUser.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.repo.web.activiti;
+
+import org.activiti.explorer.identity.LoggedInUser;
+
+/**
+ * Logged in user for Activiti admin ui, based on the authenticated person node
+ * properties.
+ *
+ * @author Frederik Heremans
+ */
+public class ActivitiLoggedInUser implements LoggedInUser
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private String id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private boolean admin;
+
+ private boolean user;
+
+ public ActivitiLoggedInUser(String id)
+ {
+ this.id = id;
+ }
+
+ public String getFirstName()
+ {
+ return firstName;
+ }
+
+ public String getFullName()
+ {
+ return getFirstName() + " " + getLastName();
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public String getLastName()
+ {
+ return lastName;
+ }
+
+ public String getPassword()
+ {
+ // Password is not exposed, not needed anymore after authentication
+ return null;
+ }
+
+ public boolean isAdmin()
+ {
+ return admin;
+ }
+
+ public boolean isUser()
+ {
+ return user;
+ }
+
+ public void setFirstName(String firstName)
+ {
+ this.firstName = firstName;
+ }
+
+ public void setLastName(String lastName)
+ {
+ this.lastName = lastName;
+ }
+
+ public void setAdmin(boolean admin)
+ {
+ this.admin = admin;
+ }
+
+ public void setUser(boolean user)
+ {
+ this.user = user;
+ }
+}
diff --git a/source/java/org/alfresco/repo/web/activiti/AlfrescoLoginHandler.java b/source/java/org/alfresco/repo/web/activiti/AlfrescoLoginHandler.java
new file mode 100644
index 0000000000..558c131b13
--- /dev/null
+++ b/source/java/org/alfresco/repo/web/activiti/AlfrescoLoginHandler.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.repo.web.activiti;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.activiti.explorer.ExplorerApp;
+import org.activiti.explorer.identity.LoggedInUser;
+import org.activiti.explorer.ui.login.LoginHandler;
+import org.alfresco.model.ContentModel;
+import org.alfresco.repo.security.authentication.AuthenticationException;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.security.AuthenticationService;
+import org.alfresco.service.cmr.security.AuthorityService;
+import org.alfresco.service.cmr.security.PersonService;
+import org.alfresco.service.namespace.QName;
+
+/**
+ * Handler for logging in into the Activiti administration UI, authenticates
+ * against Alfresco {@link AuthenticationService} and
+ * {@link AuthenticationService}.
+ *
+ * @author Frederik Heremans
+ */
+public class AlfrescoLoginHandler implements LoginHandler
+{
+ protected AuthenticationService authenticationService;
+ protected PersonService personService;
+ protected NodeService nodeService;
+ protected AuthorityService authorityService;
+
+ @Override
+ public LoggedInUser authenticate(String userName, String password)
+ {
+ LoggedInUser loggedInUser = null;
+
+ if (checkCredentials(userName, password))
+ {
+ // Check if the user has the rights to use administrative
+ // capabilities
+ if (authorityService.isAdminAuthority(userName))
+ {
+ loggedInUser = createLoggedInUser(userName);
+ }
+ }
+ return loggedInUser;
+ }
+
+ @Override
+ public LoggedInUser authenticate()
+ {
+ LoggedInUser loggedInUser = null;
+ try
+ {
+ String authenticatedUser = authenticationService.getCurrentUserName();
+ if (authenticatedUser != null && authorityService.isAdminAuthority(authenticatedUser))
+ {
+ loggedInUser = createLoggedInUser(authenticatedUser);
+ }
+ }
+ catch (AuthenticationException ae)
+ {
+ // Ignore, no user in current security-context
+ }
+ catch(net.sf.acegisecurity.AuthenticationException ae2)
+ {
+ // Ignore, no user in current security-context
+ }
+ return loggedInUser;
+ }
+
+ @Override
+ public void logout(LoggedInUser loggedInUser)
+ {
+ // Clear context
+ authenticationService.clearCurrentSecurityContext();
+ }
+
+ protected LoggedInUser createLoggedInUser(String userName)
+ {
+ final NodeRef personNode = personService.getPerson(userName);
+ final Map allProperties = nodeService.getProperties(personNode);
+
+ // Create user based on node properties
+ final ActivitiLoggedInUser loggedInUser = new ActivitiLoggedInUser(userName);
+ loggedInUser.setFirstName((String) allProperties.get(ContentModel.PROP_FIRSTNAME));
+ loggedInUser.setLastName((String) allProperties.get(ContentModel.PROP_LASTNAME));
+
+ // Indicate user can use and administer the app
+ loggedInUser.setUser(true);
+ loggedInUser.setAdmin(true);
+
+ return loggedInUser;
+ }
+
+ protected boolean checkCredentials(String userName, String password)
+ {
+ try
+ {
+ authenticationService.authenticate(userName, password.toCharArray());
+ return true;
+ }
+ catch (AuthenticationException ae)
+ {
+ return false;
+ }
+ }
+
+ public void setAuthenticationService(AuthenticationService authenticationService)
+ {
+ this.authenticationService = authenticationService;
+ }
+
+ public void setPersonService(PersonService personService)
+ {
+ this.personService = personService;
+ }
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ public void setAuthorityService(AuthorityService authorityService)
+ {
+ this.authorityService = authorityService;
+ }
+
+ @Override
+ public void onRequestEnd(HttpServletRequest req, HttpServletResponse res)
+ {
+ // Nothing to do here
+ }
+
+ @Override
+ public void onRequestStart(HttpServletRequest req, HttpServletResponse res)
+ {
+ if(ExplorerApp.get().getLoggedInUser() != null) {
+ // Revalidate the ticket, if any the user is logged in to make sure all
+ // calls to alfresco from activiti happen in right security context
+ try
+ {
+ authenticationService.validate(authenticationService.getCurrentTicket());
+ }
+ catch (AuthenticationException ae)
+ {
+ ticketExpired();
+ }
+ catch(net.sf.acegisecurity.AuthenticationException ae2)
+ {
+ ticketExpired();
+ }
+ }
+ }
+
+ private void ticketExpired()
+ {
+ ExplorerApp.get().close();
+ }
+
+}
diff --git a/source/web/WEB-INF/web.xml b/source/web/WEB-INF/web.xml
index ce57bae73b..a3f30d4e89 100644
--- a/source/web/WEB-INF/web.xml
+++ b/source/web/WEB-INF/web.xml
@@ -99,6 +99,8 @@
org.apache.myfaces.ERROR_HANDLING
false
+
+
Authentication Filter
@@ -321,6 +323,8 @@
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
+
+
@@ -524,7 +528,9 @@
authenticatorServlet
org.alfresco.repo.web.scripts.servlet.AuthenticatorServlet
-
+
+
+
Faces Servlet
/faces/*
@@ -709,6 +715,8 @@
cmisbrowser
/cmisbrowser/*
+
+
60