package gov.nysenate.openleg.dao.auth; import gov.nysenate.openleg.dao.base.ImmutableParams; import gov.nysenate.openleg.dao.base.SqlBaseDao; import gov.nysenate.openleg.model.auth.AdminUser; import org.mindrot.jbcrypt.BCrypt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class SqlAdminUserDao extends SqlBaseDao implements AdminUserDao { public static final Logger logger = LoggerFactory.getLogger(SqlAdminUserDao.class); /** * Add a new Admin account from an admin in the model * @param admin The admin to be added to the Database * @throws org.springframework.dao.DataAccessException */ @Override public void addAdmin(AdminUser admin) throws DataAccessException { if (jdbcNamed.update(AdminUserQuery.UPDATE_ADMIN.getSql(schema()), userParams(admin)) == 0) jdbcNamed.update(AdminUserQuery.INSERT_ADMIN.getSql(schema()), userParams(admin)); } /** * Deletes the admin account with the given username * @param username The username of the account that is being deleted * @throws DataAccessException */ @Override public void deleteAdmin(String username) throws DataAccessException { ImmutableParams params = ImmutableParams.from(new MapSqlParameterSource().addValue("username", username)); jdbcNamed.update(AdminUserQuery.DELETE_BY_NAME.getSql(schema()), params); } /** * Update an admin * @param admin The administrator account * @throws DataAccessException */ @Override public void updateAdmin(AdminUser admin) throws DataAccessException { jdbcNamed.update(AdminUserQuery.UPDATE_ADMIN.getSql(schema()), userParams(admin)); } protected MapSqlParameterSource userParams(AdminUser admin) { return new MapSqlParameterSource() .addValue("username", admin.getUsername()) .addValue("password", BCrypt.hashpw(admin.getPassword(), BCrypt.gensalt())) .addValue("active", admin.isActive()) .addValue("master", admin.isMaster()); } @Override public List<AdminUser> getAdminUsers() throws DataAccessException { return jdbcNamed.query(AdminUserQuery.SELECT_ALL.getSql(schema()), adminUserRowMapper); } /** * From a given username, check the database to find their password. * @param user The username * @return The user's password * @throws org.springframework.dao.DataAccessException */ public AdminUser getAdminUser(String user) throws DataAccessException { ImmutableParams params = ImmutableParams.from(new MapSqlParameterSource().addValue("username", user)); return jdbcNamed.queryForObject(AdminUserQuery.SELECT_BY_NAME.getSql(schema()), params, adminUserRowMapper); } private static RowMapper<AdminUser> adminUserRowMapper = (rs,row) -> new AdminUser(rs.getString("username"), rs.getString("password"), rs.getBoolean("active"), rs.getBoolean("master")); }