All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.payneteasy.superfly.service.impl.remote.SSOServiceImpl Maven / Gradle / Ivy

package com.payneteasy.superfly.service.impl.remote;

import com.payneteasy.superfly.api.ActionDescription;
import com.payneteasy.superfly.api.AuthenticationRequestInfo;
import com.payneteasy.superfly.api.BadPublicKeyException;
import com.payneteasy.superfly.api.MessageSendException;
import com.payneteasy.superfly.api.PasswordReset;
import com.payneteasy.superfly.api.PolicyValidationException;
import com.payneteasy.superfly.api.RoleGrantSpecification;
import com.payneteasy.superfly.api.SSOService;
import com.payneteasy.superfly.api.SSOUser;
import com.payneteasy.superfly.api.SSOUserWithActions;
import com.payneteasy.superfly.api.UserDescription;
import com.payneteasy.superfly.api.UserExistsException;
import com.payneteasy.superfly.api.UserNotFoundException;
import com.payneteasy.superfly.api.UserRegisterRequest;
import com.payneteasy.superfly.api.UserStatus;
import com.payneteasy.superfly.crypto.PublicKeyCrypto;
import com.payneteasy.superfly.email.EmailService;
import com.payneteasy.superfly.model.UserWithStatus;
import com.payneteasy.superfly.model.ui.user.UserForDescription;
import com.payneteasy.superfly.resetpassword.ResetPasswordStrategy;
import com.payneteasy.superfly.service.InternalSSOService;
import com.payneteasy.superfly.spisupport.HOTPService;
import com.payneteasy.superfly.utils.StringUtils;
import org.springframework.beans.factory.annotation.Required;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Implementation of SSOService.
 *
 * @author Roman Puchkovskiy
 */
public class SSOServiceImpl implements SSOService {

    private InternalSSOService internalSSOService;
    private HOTPService hotpService;
    private ResetPasswordStrategy resetPasswordStrategy;
    private SubsystemIdentifierObtainer subsystemIdentifierObtainer = new AuthRequestInfoObtainer();
    private EmailService emailService;
    private PublicKeyCrypto publicKeyCrypto;

    @Required
    public void setInternalSSOService(InternalSSOService internalSSOService) {
        this.internalSSOService = internalSSOService;
    }

    @Required
    public void setHotpService(HOTPService hotpService) {
        this.hotpService = hotpService;
    }

    @Required
    public void setResetPasswordStrategy(ResetPasswordStrategy resetPasswordStrategy) {
        this.resetPasswordStrategy = resetPasswordStrategy;
    }

    public void setSubsystemIdentifierObtainer(
            SubsystemIdentifierObtainer subsystemIdentifierObtainer) {
        this.subsystemIdentifierObtainer = subsystemIdentifierObtainer;
    }

    @Required
    public void setEmailService(EmailService emailService) {
        this.emailService = emailService;
    }

    @Required
    public void setPublicKeyCrypto(PublicKeyCrypto publicKeyCrypto) {
        this.publicKeyCrypto = publicKeyCrypto;
    }

    /**
     * @see SSOService#authenticate(String, String, AuthenticationRequestInfo)
     */
    @Override
    public SSOUser authenticate(String username, String password,
            AuthenticationRequestInfo authRequestInfo) {
        return internalSSOService.authenticate(username, password,
                obtainSubsystemIdentifier(authRequestInfo.getSubsystemIdentifier()),
                authRequestInfo.getIpAddress(),
                authRequestInfo.getSessionInfo());
    }

    /**
     * @see SSOService#pseudoAuthenticate(String, String)
     */
    @Override
    public SSOUser pseudoAuthenticate(String username, String subsystemIdentifier) {
        return internalSSOService.pseudoAuthenticate(username, obtainSubsystemIdentifier(subsystemIdentifier));
    }

    /**
     * @see SSOService#sendSystemData(String, com.payneteasy.superfly.api.ActionDescription[])
     */
    @Override
    public void sendSystemData(String systemIdentifier,
            ActionDescription[] actionDescriptions) {
        internalSSOService.saveSystemData(obtainSubsystemIdentifier(systemIdentifier),
                actionDescriptions);
    }

    /**
     * @see SSOService#getUsersWithActions(String)
     */
    @Override
    public List getUsersWithActions(
            String subsystemIdentifier) {
        return internalSSOService.getUsersWithActions(
                obtainSubsystemIdentifier(subsystemIdentifier));
    }

    /**
     * @see SSOService#registerUser(String, String, String, String, com.payneteasy.superfly.api.RoleGrantSpecification[], String, String, String, String, String, String)
     * @deprecated use #registerUser(UserRegisterRequest) instead
     */
    @Override
    @Deprecated
    public void registerUser(String username, String password, String email,
            String subsystemIdentifier, RoleGrantSpecification[] roleGrants,
            String name, String surname, String secretQuestion, String secretAnswer,
            String publicKey, String organization)
            throws UserExistsException, PolicyValidationException, BadPublicKeyException, MessageSendException {
        internalSSOService.registerUser(username, password, email,
                obtainSubsystemIdentifier(subsystemIdentifier), roleGrants,
                name, surname, secretQuestion, secretAnswer, publicKey, organization);
    }

    /**
     * @see SSOService#registerUser(com.payneteasy.superfly.api.UserRegisterRequest)
     */
    @Override
    public void registerUser(UserRegisterRequest registerRequest)
            throws UserExistsException, PolicyValidationException, BadPublicKeyException, MessageSendException {
        internalSSOService.registerUser(registerRequest.getUsername(),
                registerRequest.getPassword(),
                registerRequest.getEmail(),
                obtainSubsystemIdentifier(registerRequest.getSubsystemHint()),
                registerRequest.getRoleGrants(),
                registerRequest.getFirstName(),
                registerRequest.getLastName(),
                registerRequest.getSecretQuestion(),
                registerRequest.getSecretAnswer(),
                registerRequest.getPublicKey(),
                registerRequest.getOrganization());
    }

    /**
     * @see SSOService#authenticateUsingHOTP(String, String)
     */
    @Override
    public boolean authenticateUsingHOTP(String username, String hotp) {
        String subsystemIdentifier = obtainSubsystemIdentifier(null); // TODO: take default from API
        return internalSSOService.authenticateHOTP(subsystemIdentifier, username, hotp);
    }

    protected String obtainSubsystemIdentifier(String systemIdentifier) {
        return subsystemIdentifierObtainer.obtainSubsystemIdentifier(systemIdentifier);
    }

    @Override
    public void changeTempPassword(String userName, String password) throws PolicyValidationException {
        internalSSOService.changeTempPassword(userName, password);
    }

    /**
     * @see SSOService#getUserDescription(String)
     */
    @Override
    public UserDescription getUserDescription(String username) {
        UserDescription result;
        UserForDescription user = internalSSOService.getUserDescription(username);
        if (user == null) {
            result = null;
        } else {
            result = new UserDescription();
            result.setUsername(user.getUsername());
            result.setEmail(user.getEmail());
            result.setFirstName(user.getName());
            result.setLastName(user.getSurname());
            result.setSecretQuestion(user.getSecretQuestion());
            result.setSecretAnswer(user.getSecretAnswer());
            result.setPublicKey(user.getPublicKey());
        }

        return result;
    }

    /**
     * @see SSOService#resetAndSendOTPTable(String)
     */
    @Override
    public void resetAndSendOTPTable(String username) throws UserNotFoundException, MessageSendException {
        resetAndSendOTPTable(null, username);
    }

    /**
     * @see SSOService#resetAndSendOTPTable(String, String)
     */
    @Override
    public void resetAndSendOTPTable(String subsystemIdentifier,
            String username) throws UserNotFoundException, MessageSendException {
        UserForDescription user = internalSSOService.getUserDescription(username);
        if (user == null) {
            throw new UserNotFoundException(username);
        }
        hotpService.sendTableIfSupported(obtainSubsystemIdentifier(subsystemIdentifier), user.getUserId());
    }

    /**
     * @see SSOService#updateUserDescription(UserDescription)
     */
    @Override
    public void updateUserDescription(UserDescription user)
            throws UserNotFoundException, BadPublicKeyException {
        UserForDescription userForDescription = internalSSOService.getUserDescription(user.getUsername());
        if (userForDescription == null) {
            throw new UserNotFoundException(user.getUsername());
        }
        userForDescription.setEmail(user.getEmail());
        userForDescription.setName(user.getFirstName());
        userForDescription.setSurname(user.getLastName());
        userForDescription.setSecretQuestion(user.getSecretQuestion());
        userForDescription.setSecretAnswer(user.getSecretAnswer());
        userForDescription.setPublicKey(user.getPublicKey());
        userForDescription.setOrganization(user.getOrganization());
        internalSSOService.updateUserForDescription(userForDescription);
    }

    /**
     * @see SSOService#resetPassword(String, String)
     */
    @Override
    public void resetPassword(String username, String newPassword)
            throws UserNotFoundException, PolicyValidationException {
        doResetPassword(username, newPassword, false);
    }

    private void doResetPassword(String username, String newPassword,
            boolean sendPasswordByEmail) throws UserNotFoundException {
        UserForDescription user = internalSSOService.getUserDescription(username);
        if (user == null) {
            throw new UserNotFoundException(username);
        }
        resetPasswordStrategy.resetPassword(user.getUserId(), username, newPassword);
        if (sendPasswordByEmail && user.getPublicKey() != null) {
            // TODO: we could factor this code out to some
            // service method to use it also when resetting password
            // using Superfly UI and other means, but it's not clear
            // how to get SMTP server when subsystem is not known
            // This is to be resolved later
            String subsystemIdentifier = obtainSubsystemIdentifier(null); // TODO: take default from API?
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            final String fileName = "password.txt";
            try {
                publicKeyCrypto.encrypt(getStringBytes(newPassword), fileName, user.getPublicKey(), baos);
            } catch (IOException e) {
                // should not happen as we encrypt in memory
                throw new IllegalStateException("Should not happen", e);
            }
            emailService.sendPassword(subsystemIdentifier, user.getEmail(), fileName, baos.toByteArray());
        }
    }

    private byte[] getStringBytes(String s) {
        return s.getBytes(StandardCharsets.UTF_8);
    }

    /**
     * @see SSOService#resetPassword(com.payneteasy.superfly.api.PasswordReset)
     */
    @Override
    public void resetPassword(PasswordReset reset)
            throws UserNotFoundException, PolicyValidationException {
        doResetPassword(reset.getUsername(), reset.getPassword(), reset.isSendByEmail());
    }

    @Override
    public List getUserStatuses(List userNames) {
        List daoUsers;
        if (userNames == null) {
            daoUsers = internalSSOService.getUserStatuses(null);
        } else if (userNames.isEmpty()) {
            daoUsers = Collections.emptyList();
        } else {
            daoUsers = internalSSOService.getUserStatuses(
                    StringUtils.collectionToCommaDelimitedString(userNames));
        }
        List result = new ArrayList(daoUsers.size());
        for (UserWithStatus daoUser : daoUsers) {
            UserStatus user = new UserStatus();
            user.setUsername(daoUser.getUserName());
            user.setAccountLocked(daoUser.isAccountLocked());
            user.setLoginsFailed(daoUser.getLoginsFailed());
            user.setLastLoginDate(daoUser.getLastLoginDate());
            user.setLastFailedLoginDate(daoUser.getLastFailedLoginDate());
            user.setLastFailedLoginIp(daoUser.getLastFailedLoginIp());
            result.add(user);
        }
        return result;
    }

    @Override
    public SSOUser exchangeSubsystemToken(String subsystemToken) {
        return internalSSOService.exchangeSubsystemToken(subsystemToken);
    }

    @Override
    public void touchSessions(List sessionIds) {
        internalSSOService.touchSessions(sessionIds);
    }

    @Override
    public void completeUser(String username) {
        internalSSOService.completeUser(username);
    }

    @Override
    public void changeUserRole(String username, String newRole) {
        changeUserRole(username, newRole, null);
    }

    @Override
    public void changeUserRole(String username, String newRole, String subsystemHint) {
        internalSSOService.changeUserRole(username, newRole, obtainSubsystemIdentifier(subsystemHint));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy