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

prerna.auth.utils.SecurityAPIUserUtils Maven / Gradle / Ivy

The newest version!
package prerna.auth.utils;

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import java.util.UUID;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.auth.AuthProvider;
import prerna.engine.api.IRawSelectWrapper;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.ConnectionUtils;
import prerna.util.Constants;
import prerna.util.SocialPropertiesUtil;
import prerna.util.Utility;

public class SecurityAPIUserUtils extends AbstractSecurityUtils {

	private static final Logger classLogger = LogManager.getLogger(SecurityAPIUserUtils.class);

	private static final String SMSS_USER_TABLE_NAME = "SMSS_USER";
	private static final String USERID_COL = SMSS_USER_TABLE_NAME + "__ID";
	private static final String TYPE_COL = SMSS_USER_TABLE_NAME + "__TYPE";
	private static final String PASSWORD_COL = SMSS_USER_TABLE_NAME + "__PASSWORD";
	private static final String SALT_COL = SMSS_USER_TABLE_NAME + "__SALT";
	
	// check for API User Key
	public static final String API_USER_CHECK = "api_user_token_check";
	// do we require a dynamic api token or do we login
	public static final String REQUIRE_DYNAMIC_API_TOKEN = "api_user_require_dynamic_token";
	
	private SecurityAPIUserUtils() {

	}
	
	/**
	 * 
	 * @return
	 */
	public static Boolean getApplicationAPIUserTokenCheck() {
		String apiCheck = SocialPropertiesUtil.getInstance().getProperty(API_USER_CHECK); 
		if(apiCheck == null || (apiCheck=apiCheck.trim()).isEmpty()) {
			// default to true
			return true;
		}
		
		return Boolean.parseBoolean(apiCheck);
	}
	
	/**
	 * 
	 * @return
	 */
	public static Boolean getApplicationRequireDynamicToken() {
		String requireDynamicToken = SocialPropertiesUtil.getInstance().getProperty(REQUIRE_DYNAMIC_API_TOKEN);
		if(requireDynamicToken == null || (requireDynamicToken=requireDynamicToken.trim()).isEmpty()) {
			// default to true
			return true;
		}
		
		return Boolean.parseBoolean(requireDynamicToken);
	}

	/**
	 * 
	 * @param clientId
	 * @param secretKey
	 * @return
	 */
	public static boolean validCredentials(String clientId, String secretKey) {
		String saltedPassword = null;
		String salt = null;
		
		SelectQueryStruct qs = new SelectQueryStruct();
		qs.addSelector(new QueryColumnSelector(PASSWORD_COL));
		qs.addSelector(new QueryColumnSelector(SALT_COL));
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(USERID_COL, "==", clientId));
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(TYPE_COL, "==", AuthProvider.API_USER.toString()));

		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(securityDb, qs);
			if (wrapper.hasNext()) {
				Object[] values = wrapper.next().getValues();
				saltedPassword = (String) values[0];
				salt = (String) values[1];
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}

		if(saltedPassword == null || salt == null) {
			return false;
		}

		String typedHash = hash(secretKey, salt);
		return saltedPassword.equals(typedHash);
	}

	/**
	 * 
	 * @param name
	 * @return
	 */
	public static Map createAPIUser(String name) {
		Map details = new HashMap<>();
		String salt = AbstractSecurityUtils.generateSalt();
		String clientId = UUID.randomUUID().toString();
		String secretKey = UUID.randomUUID().toString();
		String hashedPassword = (AbstractSecurityUtils.hash(secretKey, salt));

		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(Utility.getApplicationTimeZoneId()));
		java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf(LocalDateTime.now());

		String insertQuery = "INSERT INTO "+SMSS_USER_TABLE_NAME+" (ID, NAME, USERNAME, EMAIL, TYPE, ADMIN, PASSWORD, SALT, DATECREATED, "
				+ "LOCKED, PHONE, PHONEEXTENSION, COUNTRYCODE) "
				+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";

		PreparedStatement ps = null;
		try {
			int parameterIndex = 1;
			ps = securityDb.getPreparedStatement(insertQuery);
			ps.setString(parameterIndex++, clientId); // ID is the client ID
			ps.setString(parameterIndex++, name);
			ps.setNull(parameterIndex++, java.sql.Types.VARCHAR); // no username
			ps.setNull(parameterIndex++, java.sql.Types.VARCHAR); // no email
			ps.setString(parameterIndex++, AuthProvider.API_USER.toString());
			// shouldn't be adding API as an admin
			ps.setBoolean(parameterIndex++, false);
			ps.setString(parameterIndex++, hashedPassword);
			ps.setString(parameterIndex++, salt);
			ps.setTimestamp(parameterIndex++, timestamp, cal);
			// not locked ...
			ps.setBoolean(parameterIndex++, false);
			ps.setNull(parameterIndex++, java.sql.Types.VARCHAR);
			ps.setNull(parameterIndex++, java.sql.Types.VARCHAR);
			ps.setNull(parameterIndex++, java.sql.Types.VARCHAR);
			ps.execute();
			if(!ps.getConnection().getAutoCommit()) {
				ps.getConnection().commit();
			}
		} catch (SQLException e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			ConnectionUtils.closeAllConnectionsIfPooling(securityDb, ps);
		}

		details.put("clientId", clientId);
		details.put("secretKey", secretKey);

		return details;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy