package teamcity.crowd.plugin;
import com.atlassian.crowd.exception.*;
import com.atlassian.crowd.model.group.Group;
import com.atlassian.crowd.model.user.User;
import com.atlassian.crowd.service.client.CrowdClient;
import com.google.common.base.Optional;
import teamcity.crowd.plugin.utils.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static java.lang.String.format;
public class RealPluginCrowdClient implements PluginCrowdClient {
private final static String OPERATION_FAILED_MESSAGE = "Bummer. Something went wrong. Can't talk to Crowd at all.";
private final static String INVALID_AUTHENTICATION_MESSAGE = "Plugin can't authenticate with Crowd. Configuration details are incorrect.";
private final static String APPLICATION_PERMISSIONS_MESSAGE = "Crowd client permissions are incorrect. Configuration details are incorrect.";
private CrowdClient crowdClient;
private LoggerFactory loggerFactory;
public RealPluginCrowdClient(CrowdClient crowdClient, LoggerFactory loggerFactory) {
this.crowdClient = crowdClient;
this.loggerFactory = loggerFactory;
}
@Override
public Optional<User> loginUserWithPassword(String username, String password) {
try {
User user = crowdClient.authenticateUser(username, password);
return Optional.of(user);
} catch (UserNotFoundException e) {
loggerFactory.getServerLogger().warn(format("User with name [%s] doesn't exists.", username), e);
} catch (InactiveAccountException e) {
loggerFactory.getServerLogger().info(format("User account [%s] is inactive", username), e);
} catch (ExpiredCredentialException e) {
loggerFactory.getServerLogger().info(format("User [%s] credentials expired", username), e);
} catch (ApplicationPermissionException e) {
loggerFactory.getServerLogger().error(APPLICATION_PERMISSIONS_MESSAGE, e);
} catch (InvalidAuthenticationException e) {
loggerFactory.getServerLogger().error(INVALID_AUTHENTICATION_MESSAGE, e);
} catch (OperationFailedException e) {
loggerFactory.getServerLogger().error(OPERATION_FAILED_MESSAGE, e);
}
return Optional.absent();
}
@Override
public List<Group> getUserGroups(String username) {
try {
return crowdClient.getGroupsForUser(username, 0, Integer.MAX_VALUE);
} catch (OperationFailedException e) {
loggerFactory.getServerLogger().error(OPERATION_FAILED_MESSAGE, e);
} catch (InvalidAuthenticationException e) {
loggerFactory.getServerLogger().error(INVALID_AUTHENTICATION_MESSAGE, e);
} catch (ApplicationPermissionException e) {
loggerFactory.getServerLogger().error(APPLICATION_PERMISSIONS_MESSAGE, e);
} catch (UserNotFoundException e) {
loggerFactory.getServerLogger().error(format("User with name [%s] doesn't exists.", username), e);
}
return new ArrayList<>();
}
}