/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.security.userstore.connector.remote;
import java.util.Collection;
import com.enonic.cms.core.security.user.UpdateUserCommand;
import com.enonic.cms.core.security.userstore.UserStoreConnectorPolicyBrokenException;
import com.enonic.cms.core.security.userstore.UserStoreEntity;
import com.enonic.cms.core.security.userstore.connector.config.UserStoreConnectorConfig;
import com.enonic.cms.api.plugin.ext.userstore.UserField;
import com.enonic.cms.api.plugin.ext.userstore.UserFields;
import com.enonic.cms.api.plugin.ext.userstore.RemoteUser;
public class UserPolicyValidator
{
private UserStoreConnectorConfig connectorConfig;
private UserStoreEntity userStore;
public UserPolicyValidator( UserStoreConnectorConfig connectorConfig, UserStoreEntity userStore )
{
this.connectorConfig = connectorConfig;
this.userStore = userStore;
}
public void validateFieldsForUpdate( final UpdateUserCommand command, final RemoteUser remoteUser )
{
if ( connectorConfig.canUpdateUser() )
{
return;
}
if ( command.getEmail() != null || command.isUpdateStrategy() )
{
if ( !equals( remoteUser.getEmail(), command.getEmail() ) )
{
throw new UserStoreConnectorPolicyBrokenException( userStore.getName(), userStore.getConnectorName(),
"Trying to update email on a user store without 'update' policy." );
}
}
// includeMissing: treats a missing field in command also as a change
final boolean includeMissing = command.isUpdateStrategy();
final UserFields commandUserFields;
if ( includeMissing )
{
commandUserFields = command.getUserFields().getConfiguredFieldsOnly( userStore.getConfig(), true );
}
else
{
commandUserFields = command.getUserFields().getConfiguredFieldsOnly( userStore.getConfig(), false );
}
final UserFields remoteUserFields = remoteUser.getUserFields().getConfiguredFieldsOnly( userStore.getConfig() );
final UserFields changedUserFields = commandUserFields.getChangedUserFields( remoteUserFields, includeMissing );
final UserFields changedUserFieldsRemoteOnly = changedUserFields.getRemoteFields( userStore.getConfig() );
if ( changedUserFieldsRemoteOnly.getSize() == 0 )
{
return;
}
final StringBuilder remoteFields = new StringBuilder();
Collection<UserField> remainingRemoteFields = changedUserFieldsRemoteOnly.getAll();
for ( UserField userField : remainingRemoteFields )
{
remoteFields.append( userField.getType().getName() ).append( ", " );
}
throw new UserStoreConnectorPolicyBrokenException( userStore.getName(), userStore.getConnectorName(),
"Trying to update remote fields on a user store without 'update' policy. The fields are: " +
remoteFields.toString() );
}
private boolean equals( Object a, Object b )
{
if ( a == null && b == null )
{
return true;
}
else if ( a == null || b == null )
{
return false;
}
return a.equals( b );
}
}