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

com.payneteasy.superfly.dao.UserDao Maven / Gradle / Ivy

package com.payneteasy.superfly.dao;

import java.util.List;

import com.googlecode.jdbcproc.daofactory.annotation.AStoredProcedure;
import com.payneteasy.superfly.model.*;
import com.payneteasy.superfly.model.ui.action.UIActionForCheckboxForUser;
import com.payneteasy.superfly.model.ui.role.UIRoleForCheckbox;
import com.payneteasy.superfly.model.ui.user.*;
import com.payneteasy.superfly.policy.password.PasswordSaltPair;

/**
 * DAO used to work with users.
 *
 * @author Roman Puchkovskiy
 */
public interface UserDao {
    /**
     * Authenticates a user and, if ok, returns his roles with actions.
     *
     * @param username      username to use
     * @param password      password to use
     * @param subsystemName name of the subsystem used to authenticate
     * @param ipAddress     IP address of the user who logs in
     * @param sessionInfo   session info
     * @return session
     */
    @AStoredProcedure(name = "authenticate")
    AuthSession authenticate(String username, String password, String subsystemName, String ipAddress,
            String sessionInfo);

    /**
     * Returns user's role and action as if he was successfully authenticated.
     *
     * @param username      username to use
     * @param subsystemName name of the subsystem used to use
     * @return session
     */
    @AStoredProcedure(name = "get_user_actions")
    AuthSession pseudoAuthenticate(String username, String subsystemName);

    /**
     * Returns a list of users with actions given to them through a role with a
     * given principal.
     *
     * @param subsystemName name of the subsystem from which to obtain info
     * @return users with actions
     */
    @AStoredProcedure(name = "list_users")
    List getUsersAndActions(String subsystemName);

    /**
     * Returns users which satisfy to the given conditions.
     *
     * @param startFrom        user offset
     * @param recordsCount     user limit
     * @param orderFieldNumber number of the field to order by
     * @param orderType        asc/desc
     * @param userNamePrefix   prefix of the username (ignored if null)
     * @param roleId           ID of the role which users must have (ignored if null)
     * @param complectId       ID of the complect which users must have (ignored if null)
     * @param subsystemId      ID of the subsystem to which user has access (ignored if null)
     * @return users
     */
    @AStoredProcedure(name = "ui_get_users_list")
    List getUsers(long startFrom, long recordsCount, int orderFieldNumber, String orderType,
            String userNamePrefix, Long roleId, Long complectId, Long subsystemId);

    /**
     * Returns total count of users satisfy to the given conditions.
     *
     * @param userNamePrefix prefix of the username (ignored if null)
     * @param roleId         ID of the role which users must have (ignored if null)
     * @param complectId     ID of the complect which users must have (ignored if null)
     * @param subsystemId    ID of the subsystem to which user has access (ignored if null)
     * @return users count
     */
    @AStoredProcedure(name = "ui_get_users_list_count")
    long getUsersCount(String userNamePrefix, Long roleId, Long complectId, Long subsystemId);

    /**
     * Returns a user for editing.
     *
     * @param userId ID of the user to return
     * @return user of null if not found
     */
    @AStoredProcedure(name = "ui_get_user")
    UIUserDetails getUser(long userId);

    /**
     * Creates a user.
     *
     * @param user user to create
     * @return routine result
     */
    @AStoredProcedure(name = "ui_create_user")
    RoutineResult createUser(UIUserForCreate user);

    /**
     * Updates a user.
     *
     * @param user user to update (username, password, salt are not changed)
     * @return routine result
     */
    @AStoredProcedure(name = "ui_update_user")
    RoutineResult updateUser(UIUser user);

    /**
     * Deletes a user.
     *
     * @param userId ID of the user to delete
     * @return routine result
     */
    @AStoredProcedure(name = "ui_delete_user")
    RoutineResult deleteUser(long userId);

    /**
     * Locks a user.
     *
     * @param userId ID of the user to lock
     * @return routine result
     */
    @AStoredProcedure(name = "ui_lock_user")
    RoutineResult lockUser(long userId);

    /**
     * Unlocks a user.
     *
     * @param userId ID of the user to unlock
     * @return routine result
     */
    @AStoredProcedure(name = "ui_unlock_user")
    RoutineResult unlockUser(long userId);

    /**
     * Unlocks a suspended user.
     *
     * @param userId      ID of the user to unlock
     * @param newPassword new password to set as a temp password
     * @return routine result
     */
    @AStoredProcedure(name = "ui_unlock_suspended_user")
    RoutineResult unlockSuspendedUser(long userId, String newPassword);

    /**
     * Creates a clone of the given user with new name and password.
     *
     * @param cloneUserRequest clone request
     * @return routine result
     */
    @AStoredProcedure(name = "ui_clone_user")
    RoutineResult cloneUser(UICloneUserRequest cloneUserRequest);

    /**
     * Returns a list of roles assigned to the given user.
     *
     * @param startFrom        starting index for paging
     * @param recordsCount     limit for paging
     * @param orderFieldNumber number of field to order by
     * @param orderType        'asc'/'desc'
     * @param userId           ID of the user whose roles are to be returned
     * @param subsystemIds     comma-separated list of IDs of subsystems which roles are to
     *                         be returned (ignored if null)
     * @return roles
     */
    @AStoredProcedure(name = "ui_get_mapped_user_roles_list")
    List getMappedUserRoles(int startFrom, int recordsCount, int orderFieldNumber, String orderType,
            long userId, String subsystemIds);

    /**
     * Returns a list of roles for the given user. Both assigned and
     * not-assigned roles are returned.
     *
     * @param startFrom        starting index for paging
     * @param recordsCount     limit for paging
     * @param orderFieldNumber number of field to order by
     * @param orderType        'asc'/'desc'
     * @param userId           ID of the user whose roles are to be returned
     * @param subsystemIds     comma-separated list of IDs of subsystems which roles are to
     *                         be returned (ignored if null)
     * @return roles
     */
    @AStoredProcedure(name = "ui_get_all_user_roles_list")
    List getAllUserRoles(int startFrom, int recordsCount, int orderFieldNumber, String orderType,
            long userId, String subsystemIds);

    /**
     * Returns count of roles for the given user. Both assigned and not-assigned
     * roles are considered.
     *
     * @param userId       ID of the user whose roles are to be returned
     * @param subsystemIds comma-separated list of IDs of subsystems which roles are to
     *                     be returned (ignored if null)
     * @return roles count
     */
    @AStoredProcedure(name = "ui_get_all_user_roles_list_count")
    int getAllUserRolesCount(long userId, String subsystemIds);

    /**
     * Returns a list of non-assigned roles for the given user.
     *
     * @param startFrom        starting index for paging
     * @param recordsCount     limit for paging
     * @param orderFieldNumber number of field to order by
     * @param orderType        'asc'/'desc'
     * @param userId           ID of the user whose roles are to be returned
     * @param subsystemIds     comma-separated list of IDs of subsystems which roles are to
     *                         be returned (ignored if null)
     * @return roles
     */
    @AStoredProcedure(name = "ui_get_unmapped_user_roles_list")
    List getUnmappedUserRoles(int startFrom, int recordsCount, int orderFieldNumber,
            String orderType, long userId, String subsystemIds);

    /**
     * Returns count of non-assigned roles for the given user.
     *
     * @param userId       ID of the user whose roles are to be returned
     * @param subsystemIds comma-separated list of IDs of subsystems which roles are to
     *                     be returned (ignored if null)
     * @return roles count
     */
    @AStoredProcedure(name = "ui_get_unmapped_user_roles_list_count")
    int getUnmappedUserRolesCount(long userId, String subsystemIds);

    /**
     * Changes a list of roles assigned to a user.
     *
     * @param userId                 ID of the user to change
     * @param rolesToAddIds          comma-separated list of IDs of roles to be added
     * @param rolesToRemoveIds       comma-separated list of IDs of roles to be removed
     * @param rolesToGrantActionsIds comma-separated list of IDs of roles from which all roles will
     *                               be assigned to user (it must be a subset of rolesToAddIds)
     * @return routine result
     */
    @AStoredProcedure(name = "ui_change_user_roles")
    RoutineResult changeUserRoles(long userId, String rolesToAddIds, String rolesToRemoveIds,
            String rolesToGrantActionsIds);

    /**
     * Returns a list of actions for the given user.
     *
     * @param startFrom        starting index for paging
     * @param recordsCount     limit for paging
     * @param orderFieldNumber number of field to order by
     * @param orderType        'asc'/'desc'
     * @param userId           ID of the user whose actions are to be returned
     * @param subsystemIds     IDs of subsystems of interest (if null, all subsystems are
     *                         considered)
     * @param actionSubstring  substring which must be inside action name (ignored if null)
     * @return actions
     */
    @AStoredProcedure(name = "ui_get_all_user_actions_list")
    List getAllUserActions(int startFrom, int recordsCount, int orderFieldNumber,
            String orderType, long userId, String subsystemIds, String actionSubstring);

    /**
     * Returns count of actions for the given user.
     *
     * @param userId          ID of the user whose actions are to be counted
     * @param subsystemIds    IDs of subsystems of interest (if null, all subsystems are
     *                        considered)
     * @param actionSubstring substring which must be inside action name (ignored if null)
     * @return actions count
     */
    @AStoredProcedure(name = "ui_get_all_user_actions_list_count")
    int getAllUserActionsCount(long userId, String subsystemIds, String actionSubstring);

    /**
     * Returns a list of non-assigned actions for the given user.
     *
     * @param startFrom        starting index for paging
     * @param recordsCount     limit for paging
     * @param orderFieldNumber number of field to order by
     * @param orderType        'asc'/'desc'
     * @param userId           ID of the user whose actions are to be returned
     * @param subsystemIds     IDs of subsystems of interest (if null, all subsystems are
     *                         considered)
     * @param actionSubstring  substring which must be inside action name (ignored if null)
     * @return actions
     */
    @AStoredProcedure(name = "ui_get_unmapped_user_actions_list")
    List getUnmappedUserActions(int startFrom, int recordsCount, int orderFieldNumber,
            String orderType, long userId, String subsystemIds, long roleId, String actionSubstring);

    /**
     * Returns count of non-assigned actions for the given user.
     *
     * @param userId          ID of the user whose actions are to be counted
     * @param subsystemIds    IDs of subsystems of interest (if null, all subsystems are
     *                        considered)
     * @param actionSubstring substring which must be inside action name (ignored if null)
     * @return actions count
     */
    @AStoredProcedure(name = "ui_get_unmapped_user_actions_list_count")
    int getUnmappedUserActionsCount(long userId, String subsystemIds, long roleId, String actionSubstring);

    /**
     * @param startFrom
     * @param recordsCount
     * @param orderFieldNumber
     * @param orderType
     * @param userId
     * @param subsystemIds
     * @param actionSubstring
     * @return
     */
    @AStoredProcedure(name = "ui_get_mapped_user_actions_list")
    List getMappedUserActions(int startFrom, int recordsCount, int orderFieldNumber,
            String orderType, long userId, String subsystemIds, long roleId, String actionSubstring);

    /**
     * @param userId
     * @param subsystemIds
     * @param actionSubstring
     * @return
     */
    @AStoredProcedure(name = "ui_get_mapped_user_actions_list_count")
    int getMappedUserActionsCount(long userId, String subsystemIds, long roleId, String actionSubstring);

    /**
     * Changes a list of actions assigned to a user.
     *
     * @param userId                ID of the user to change
     * @param roleActionToAddIds    comma-separated list of IDs of action+roles to be added
     * @param roleActionToRemoveIds comma-separated list of IDs of action+roles to be removed
     * @return routine result
     */
    @AStoredProcedure(name = "ui_change_user_role_actions")
    RoutineResult changeUserRoleActions(long userId, String roleActionToAddIds, String roleActionToRemoveIds);

    /**
     * Returns a user with roles assigned to him and actions assigned through
     * them.
     *
     * @param userId              ID of the user to get
     * @param subsystemIds        IDs of subsystems to which roles and actions must be
     *                            restricted (ignored if null)
     * @param actionNameSubstring substring which must be contained in the action name to allow
     *                            action in the list
     * @param roleNameSubstring   substring which must be contained in the role name to allow
     *                            role in the list
     * @return user with roles and actions
     */
    @AStoredProcedure(name = "ui_get_user_role_actions")
    UIUserWithRolesAndActions getUserRoleActions(long userId, String subsystemIds, String actionNameSubstring,
            String roleNameSubstring);

    /**
     * @param userId
     * @param roleId
     * @return
     */
    @AStoredProcedure(name = "ui_add_subsystem_with_role")
    RoutineResult addSubsystemWithRole(long userId, long roleId);

    /**
     * Registers a user.
     *
     * @param registerUser user to be registered
     * @return routine result
     */
    @AStoredProcedure(name = "register_user")
    RoutineResult registerUser(UserRegisterRequest registerUser);

    /**
     * Grants roles with the given principal names in a subsystem with the given
     * name to a user with the given ID.
     *
     * @param userId         ID of the user
     * @param subsystemName  name of a subsystem
     * @param principalNames comma-separated list of principal names
     * @return routine result
     */
    @AStoredProcedure(name = "grant_roles_to_user")
    RoutineResult grantRolesToUser(long userId, String subsystemName, String principalNames);

    /**
     * @param userName        user's name
     * @param maxLoginsFailed maximum logins failed
     * @return routine result
     */
    @AStoredProcedure(name = "login_locked")
    RoutineResult lockoutConditionnally(String userName, long maxLoginsFailed, String lockoutType);

    @AStoredProcedure(name = "get_user_salt")
    String getUserSalt(String userName);

    @AStoredProcedure(name = "update_user_salt")
    void updateUserSalt(String username, String salt);

    @AStoredProcedure(name = "get_user_salt_by_user_id")
    String getUserSaltByUserId(long userId);

    @AStoredProcedure(name = "get_user_password_history_and_current_password")
    List getUserPasswordHistoryAndCurrentPassword(String username);

    @AStoredProcedure(name = "update_user_salt_by_user_id")
    void updateUserSaltByUserId(long userId, String salt);

    /**
     * @param userName user name
     * @param password password
     * @return routine result
     */
    @AStoredProcedure(name = "change_temp_password")
    RoutineResult changeTempPassword(String userName, String password);

    /**
     * @param userId   user id
     * @param password generated password
     * @return routine result
     */
    @AStoredProcedure(name = "reset_password")
    RoutineResult resetPassword(long userId, String password);

    @AStoredProcedure(name = "get_users_with_expired_passwords")
    List getUsersWithExpiredPasswords(int days);

    @AStoredProcedure(name = "ui_suspend_user")
    RoutineResult suspendUser(long anyLong);

    /**
     * Returns uses which satisfy to 'suspension' criteria.
     * Now, we suspend users that did not login for N days
     * (by default, it's 90 days).
     *
     * @param days  number of days; if more than this number
     *              of days passed since last user's login
     *              (or creation if no login ever occurred),
     *              the user is subject to suspension
     * @return users to suspend
     */
    @AStoredProcedure(name = "get_users_to_suspend")
    List getUsersToSuspend(int days);

    @AStoredProcedure(name = "clear_hotp_logins_failed")
    void clearHOTPLoginsFailed(String username);

    @AStoredProcedure(name = "increment_hotp_logins_failed")
    void incrementHOTPLoginsFailed(String username);

    @AStoredProcedure(name = "get_user_for_description")
    UserForDescription getUserForDescription(String username);

    @AStoredProcedure(name = "update_user_for_description")
    void updateUserForDescription(UserForDescription user);

    @AStoredProcedure(name = "get_user_statuses")
    List getUserStatuses(String userNames);

    /**
     * Checks user login status. That is: tries to login to the
     * specified subsystem and returns one of the following:
     * Y (login successful, there are some actions)
     * N (no user, password mismatched, user locked or no actions)
     * T (login successful, but user's password has expired)
     *
     * @param username            name of the user
     * @param password            hashed password
     * @param subsystemIdentifier subsystem identifier
     * @return user login status
     */
    @AStoredProcedure(name = "get_user_login_status")
    String getUserLoginStatus(String username, String password, String subsystemIdentifier);

    /**
     * Exchanges subsystem token to SSOUser. After this operation
     * returns, subsystem token is not valid anymore and cannot
     * be used for exchanging.
     *
     * @param subsystemToken subsystem token
     * @return SSOUser or null if token does not exist, expired or
     * already used
     */
    @AStoredProcedure(name = "exchange_subsystem_token")
    AuthSession exchangeSubsystemToken(String subsystemToken);

    /**
     * Makes a user complete.
     *
     * @param username name of the user to complete
     */
    @AStoredProcedure(name = "complete_user")
    void completeUser(String username);

    /**
     * Revokes from a user all his roles and replaces them with a given role.
     *
     * @param username      name of the user to work with
     * @param newRole       role to grant
     * @param subsystemName name of the subsystem we work with
     */
    @AStoredProcedure(name = "change_user_role")
    RoutineResult changeUserRole(String username, String newRole, String subsystemName);
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy