You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by vk...@apache.org on 2008/09/15 17:15:27 UTC
svn commit: r695499 - in
/portals/jetspeed-2/portal/branches/security-refactoring/components:
jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/
jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/
jetspeed-security/src/main/jav...
Author: vkumar
Date: Mon Sep 15 08:15:27 2008
New Revision: 695499
URL: http://svn.apache.org/viewvc?rev=695499&view=rev
Log: (empty)
Modified:
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/BaseJetspeedPrincipalManager.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/GroupManagerImpl.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/JetspeedPrincipalManagerProviderImpl.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/RoleManagerImpl.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/UserManagerImpl.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java
portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/UserPasswordCredentialPolicyManagerImpl.java
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-prefs/src/main/java/org/apache/jetspeed/prefs/impl/PreferencesFactoryImpl.java Mon Sep 15 08:15:27 2008
@@ -53,7 +53,7 @@
* Spring invoked constructor with a dummy parameter to distinguish it from the default constructor invoked by the Java Preferences
* @param dummy
*/
- public PreferencesFactoryImpl(int dummy)
+ public PreferencesFactoryImpl(String dummy)
{
System.setProperty("java.util.prefs.PreferencesFactory", getClass().getName());
}
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/BaseJetspeedPrincipalManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/BaseJetspeedPrincipalManager.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/BaseJetspeedPrincipalManager.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/BaseJetspeedPrincipalManager.java Mon Sep 15 08:15:27 2008
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Set;
+import org.apache.jetspeed.Jetspeed;
import org.apache.jetspeed.security.DependentPrincipalException;
import org.apache.jetspeed.security.JetspeedPrincipal;
import org.apache.jetspeed.security.JetspeedPrincipalAssociationHandler;
@@ -88,6 +89,7 @@
private JetspeedPrincipalStorageManager jpsm;
//added for removing circular dependciese
protected static JetspeedPrincipalManagerProvider jpmp;
+ private static boolean loaded = false;
public BaseJetspeedPrincipalManager(JetspeedPrincipalType principalType, JetspeedPrincipalAccessManager jpam,
JetspeedPrincipalStorageManager jpsm)
{
@@ -115,6 +117,11 @@
protected JetspeedPrincipalManagerProvider getJetspeedPrincipalManagerProvider()
{
+ if(!loaded && jpmp==null)
+ {
+ jpmp= (JetspeedPrincipalManagerProvider)Jetspeed.getComponentManager().getComponent("org.apache.jetspeed.security.spi.JetspeedPrincipalManagerProvider");
+ loaded = true;
+ }
return jpmp;
}
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/GroupManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/GroupManagerImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/GroupManagerImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/GroupManagerImpl.java Mon Sep 15 08:15:27 2008
@@ -74,9 +74,12 @@
this.userType = userType;
this.roleType = roleType;
}
- public void init()
+ public void checkInitialized()
{
- userManager = (UserManager)getJetspeedPrincipalManagerProvider().getManager(userType);
+ if (userManager == null)
+ {
+ userManager = (UserManager)getJetspeedPrincipalManagerProvider().getManager(userType);
+ }
}
/* (non-Javadoc)
@@ -226,7 +229,8 @@
{
try
{
- User user = userManager.getUser(username);
+ checkInitialized();
+ User user = userManager.getUser(username);
if (user == null)
{
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
@@ -262,6 +266,7 @@
{
try
{
+ checkInitialized();
User user = userManager.getUser(username);
if (user == null)
{
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/JetspeedPrincipalManagerProviderImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/JetspeedPrincipalManagerProviderImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/JetspeedPrincipalManagerProviderImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/JetspeedPrincipalManagerProviderImpl.java Mon Sep 15 08:15:27 2008
@@ -39,7 +39,6 @@
public JetspeedPrincipalManagerProviderImpl(Set<JetspeedPrincipalManager> managers)
{
- HashSet<JetspeedPrincipalType> types = new HashSet<JetspeedPrincipalType>();
nameMap = new HashMap<String, JetspeedPrincipalType>();
classNameMap = new HashMap<String, JetspeedPrincipalType>();
managersMap = new HashMap<String, JetspeedPrincipalManager>();
@@ -56,7 +55,6 @@
}
nameMap.put(type.getName(), type);
classNameMap.put(type.getClassName(), type);
- types.add(type);
managersMap.put(type.getName(), m);
}
this.nameMap = Collections.unmodifiableMap(nameMap);
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/RoleManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/RoleManagerImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/RoleManagerImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/RoleManagerImpl.java Mon Sep 15 08:15:27 2008
@@ -79,19 +79,16 @@
this.userType = userType;
this.groupType = groupType;
}
- public void init()
+ public void checkInitialized()
{
- userManager = (UserManager)getJetspeedPrincipalManagerProvider().getManager(userType);
- groupManager = (GroupManager)getJetspeedPrincipalManagerProvider().getManager(groupType);
- }
- public void setUserManager(UserManager manager)
- {
- this.userManager = manager;
- }
-
- public void setGroupManager(GroupManager manager)
- {
- this.groupManager = manager;
+ if (userManager == null)
+ {
+ userManager = (UserManager)getJetspeedPrincipalManagerProvider().getManager(userType);
+ }
+ if (groupManager == null)
+ {
+ groupManager = (GroupManager)getJetspeedPrincipalManagerProvider().getManager(groupType);
+ }
}
/* (non-Javadoc)
@@ -245,7 +242,8 @@
{
try
{
- User user = userManager.getUser(username);
+ checkInitialized();
+ User user = userManager.getUser(username);
if (user == null)
{
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
@@ -280,7 +278,8 @@
{
try
{
- User user = userManager.getUser(username);
+ checkInitialized();
+ User user = userManager.getUser(username);
if (user == null)
{
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
@@ -320,7 +319,8 @@
{
try
{
- Group group = groupManager.getGroup(groupName);
+ checkInitialized();
+ Group group = groupManager.getGroup(groupName);
if (group == null)
{
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.GROUP_TYPE_NAME, groupName));
@@ -355,7 +355,8 @@
{
try
{
- Group group = groupManager.getGroup(groupName);
+ checkInitialized();
+ Group group = groupManager.getGroup(groupName);
if (group == null)
{
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.GROUP_TYPE_NAME, groupName));
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/UserManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/UserManagerImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/UserManagerImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/UserManagerImpl.java Mon Sep 15 08:15:27 2008
@@ -51,6 +51,7 @@
import org.apache.jetspeed.security.spi.JetspeedPrincipalAccessManager;
import org.apache.jetspeed.security.spi.JetspeedPrincipalStorageManager;
import org.apache.jetspeed.security.spi.UserPasswordCredentialManager;
+import org.springframework.beans.factory.InitializingBean;
/**
* <p>
@@ -68,13 +69,13 @@
private String anonymousUser = "guest";
private JetspeedPrincipalType roleType;
private JetspeedPrincipalType groupType;
-
+
private UserPasswordCredentialManager credentialManager;
private RoleManager roleManager;
private GroupManager groupManager;
public UserManagerImpl(JetspeedPrincipalType principalType, JetspeedPrincipalType roleType, JetspeedPrincipalType groupType,
- JetspeedPrincipalAccessManager jpam, JetspeedPrincipalStorageManager jpsm, UserPasswordCredentialManager credentialManager)
+ JetspeedPrincipalAccessManager jpam, JetspeedPrincipalStorageManager jpsm, UserPasswordCredentialManager credentialManager)
{
super(principalType, jpam, jpsm);
this.credentialManager = credentialManager;
@@ -82,23 +83,29 @@
this.groupType = groupType;
}
- public void init()
- {
- groupManager = (GroupManager)getJetspeedPrincipalManagerProvider().getManager(groupType);
- roleManager = (RoleManager)getJetspeedPrincipalManagerProvider().getManager(roleType);
- }
-
+ public void checkInitialized()
+ {
+ if (groupManager == null)
+ {
+ groupManager = (GroupManager) getJetspeedPrincipalManagerProvider().getManager(groupType);
+ }
+ if (roleManager == null)
+ {
+ roleManager = (RoleManager) getJetspeedPrincipalManagerProvider().getManager(roleType);
+ }
+ }
+
public User addUser(String username) throws SecurityException
{
- return addUser(username, true);
+ return addUser(username, true);
}
public User addUser(String username, boolean mapped) throws SecurityException
{
- User user = newUser(username, mapped);
+ User user = newUser(username, mapped);
try
{
- super.addPrincipal(user, null);
+ super.addPrincipal(user, null);
}
catch (PrincipalAlreadyExistsException e)
{
@@ -111,19 +118,19 @@
catch (PrincipalAssociationNotAllowedException e)
{
throw new SecurityException(SecurityException.PRINCIPAL_ASSOCIATION_NOT_ALLOWED.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
- }
- catch (PrincipalAssociationUnsupportedException e)
- {
- throw new SecurityException(SecurityException.PRINCIPAL_ASSOCIATION_UNSUPPORTED.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
- }
- catch (PrincipalNotFoundException e)
- {
- throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
- }
+ }
+ catch (PrincipalAssociationUnsupportedException e)
+ {
+ throw new SecurityException(SecurityException.PRINCIPAL_ASSOCIATION_UNSUPPORTED.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
+ }
+ catch (PrincipalNotFoundException e)
+ {
+ throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, username));
+ }
if (log.isDebugEnabled())
log.debug("Added user: " + username);
- return user;
+ return user;
}
public String getAnonymousUser()
@@ -133,11 +140,11 @@
public PasswordCredential getPasswordCredential(User user) throws SecurityException
{
- if (credentialManager != null)
- {
- return credentialManager.getPasswordCredential(user);
- }
- return null;
+ if (credentialManager != null)
+ {
+ return credentialManager.getPasswordCredential(user);
+ }
+ return null;
}
public Subject getSubject(User user) throws SecurityException
@@ -147,7 +154,7 @@
PasswordCredential pwc = getPasswordCredential(user);
if (pwc != null)
{
- UserCredential credential = new UserCredentialImpl(pwc);
+ UserCredential credential = new UserCredentialImpl(pwc);
HashSet<Object> privateCred = new HashSet<Object>();
privateCred.add(credential);
return getSubject(new AuthenticatedUserImpl(user, null, privateCred));
@@ -155,51 +162,52 @@
}
return getSubject(new AuthenticatedUserImpl(user, null, null));
}
-
+
public Subject getSubject(AuthenticatedUser user) throws SecurityException
{
- Set<Principal> principals = new PrincipalsSet();
- addSubjectPrincipals(user, principals);
- return JetspeedSubjectFactory.createSubject(user.getUser(), getPublicCredentialsForSubject(user), getPrivateCredentialsForSubject(user), principals);
+ Set<Principal> principals = new PrincipalsSet();
+ addSubjectPrincipals(user, principals);
+ return JetspeedSubjectFactory.createSubject(user.getUser(), getPublicCredentialsForSubject(user), getPrivateCredentialsForSubject(user), principals);
}
-
+
protected Set<Object> getPublicCredentialsForSubject(AuthenticatedUser user)
{
- HashSet<Object> credentials = new HashSet<Object>();
- if (user.getPublicCredentials() != null)
- {
- credentials.addAll(user.getPublicCredentials());
- }
- return credentials;
- }
-
- protected Set<Object> getPrivateCredentialsForSubject(AuthenticatedUser user)
- {
- HashSet<Object> credentials = new HashSet<Object>();
- if (user.getPrivateCredentials() != null)
- {
- credentials.addAll(user.getPrivateCredentials());
- }
- return credentials;
- }
-
+ HashSet<Object> credentials = new HashSet<Object>();
+ if (user.getPublicCredentials() != null)
+ {
+ credentials.addAll(user.getPublicCredentials());
+ }
+ return credentials;
+ }
+
+ protected Set<Object> getPrivateCredentialsForSubject(AuthenticatedUser user)
+ {
+ HashSet<Object> credentials = new HashSet<Object>();
+ if (user.getPrivateCredentials() != null)
+ {
+ credentials.addAll(user.getPrivateCredentials());
+ }
+ return credentials;
+ }
+
protected void addSubjectPrincipals(AuthenticatedUser user, Set<Principal> principals) throws SecurityException
{
- addSubjectRolePrincipals(user, principals, roleManager);
- addSubjectGroupPrincipals(user, principals, groupManager);
- // still TODO: adding roles for groups
+ checkInitialized();
+ addSubjectRolePrincipals(user, principals, roleManager);
+ addSubjectGroupPrincipals(user, principals, groupManager);
+ // still TODO: adding roles for groups
}
-
+
protected void addSubjectRolePrincipals(AuthenticatedUser user, Set<Principal> principals, RoleManager roleManager) throws SecurityException
{
- principals.addAll(roleManager.resolveRolesForUser(user.getUserName()));
+ principals.addAll(roleManager.resolveRolesForUser(user.getUserName()));
+ }
+
+ protected void addSubjectGroupPrincipals(AuthenticatedUser user, Set<Principal> principals, GroupManager groupManager) throws SecurityException
+ {
+ principals.addAll(groupManager.resolveGroupsForUser(user.getUserName()));
}
- protected void addSubjectGroupPrincipals(AuthenticatedUser user, Set<Principal> principals, GroupManager groupManager) throws SecurityException
- {
- principals.addAll(groupManager.resolveGroupsForUser(user.getUserName()));
- }
-
public User getUser(String username) throws SecurityException
{
return (User) getPrincipal(username);
@@ -212,7 +220,7 @@
public List<User> getUsers(String nameFilter) throws SecurityException
{
- return (List<User>)getPrincipals(nameFilter);
+ return (List<User>) getPrincipals(nameFilter);
}
public List<User> getUsersInGroup(String groupFullPathName) throws SecurityException
@@ -273,15 +281,15 @@
public void storePasswordCredential(PasswordCredential credential) throws SecurityException
{
- if (credentialManager == null)
- {
- throw new UnsupportedOperationException();
- }
- credentialManager.storePasswordCredential(credential);
+ if (credentialManager == null)
+ {
+ throw new UnsupportedOperationException();
+ }
+ credentialManager.storePasswordCredential(credential);
}
public void updateUser(User user) throws SecurityException
- {
+ {
try
{
super.updatePrincipal(user);
@@ -294,10 +302,10 @@
{
throw new SecurityException(SecurityException.PRINCIPAL_UPDATE_FAILURE.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, user.getName()), pue);
}
- catch (PrincipalReadOnlyException e)
- {
- throw new SecurityException(SecurityException.PRINCIPAL_IS_READ_ONLY.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, user.getName()));
- }
+ catch (PrincipalReadOnlyException e)
+ {
+ throw new SecurityException(SecurityException.PRINCIPAL_IS_READ_ONLY.createScoped(JetspeedPrincipalType.USER_TYPE_NAME, user.getName()));
+ }
}
public boolean userExists(String username)
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java Mon Sep 15 08:15:27 2008
@@ -61,8 +61,14 @@
{
super(repositoryPath);
}
-
- public boolean principalExists(JetspeedPrincipal principal)
+ //Adding for testing purpose only. This would be removed
+ //TODO remove this method
+ public void init() throws Exception
+ {
+
+ }
+
+ public boolean principalExists(JetspeedPrincipal principal)
{
if (principal.getId() == null)
{
Modified: portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/UserPasswordCredentialPolicyManagerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/UserPasswordCredentialPolicyManagerImpl.java?rev=695499&r1=695498&r2=695499&view=diff
==============================================================================
--- portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/UserPasswordCredentialPolicyManagerImpl.java (original)
+++ portals/jetspeed-2/portal/branches/security-refactoring/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/UserPasswordCredentialPolicyManagerImpl.java Mon Sep 15 08:15:27 2008
@@ -45,7 +45,10 @@
{
this.encoder = encoder;
this.validator = validator;
- this.interceptors = (PasswordCredentialInterceptor[]) interceptors.toArray(new PasswordCredentialInterceptor[interceptors.size()]);
+ //Remove the following comment and check, if interceptors are null or not
+ //if(interceptors !=null){
+ // this.interceptors = (PasswordCredentialInterceptor[]) interceptors.toArray(new PasswordCredentialInterceptor[interceptors.size()]);
+ //}
}
public CredentialPasswordEncoder getCredentialPasswordEncoder()
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org