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

com.identity4j.connector.mysql.users.MySQLUsersConfiguration Maven / Gradle / Ivy

package com.identity4j.connector.mysql.users;

import java.sql.SQLException;

import com.identity4j.connector.Connector;

/*
 * #%L
 * Identity4J MySQL Users Connector
 * %%
 * Copyright (C) 2013 - 2017 LogonBox
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * .
 * #L%
 */

import com.identity4j.connector.jdbc.JDBCConfiguration;
import com.identity4j.connector.jdbc.NamedParameterStatement;
import com.identity4j.util.MultiMap;
import com.identity4j.util.StringUtil;

public class MySQLUsersConfiguration extends JDBCConfiguration {

	public enum SchemaVersion {
		PRE_5_7, POST_5_7, AUTO
	}

	private static final String AMPERSAND = "@";

	// Enable Disable feature enable
	public static final String IDENTITY_ENABLE_DISABLE_FEATURE = "identityEnableDisableFeature";
	public static final String IDENTITY_ENABLE_DISABLE_FLAG = "identityEnableDisableFlag";

	// Identity Table
	public static final String SQL_IDENTITIES_TABLE_SELECT = "sqlIdentitiesTableGrant";
	public static final String SQL_IDENTITY_TABLE_GRANT = "sqlIdentityTableGrant";
	public static final String SQL_IDENTITY_TABLE_REVOKE = "sqlIdentityTableRevoke";
	public static final String SQL_IDENTITY_TABLE_GRANT_SHOW = "sqlIdentityTableGrantShow";
	public static final String SQL_IDENTITY_TABLE_ENABLE_DISABLE = "sqlIdentityTableEnableDisable";

	// Password
	public static final String SQL_PASSWORD_SET = "sqlPasswordSet";

	// Flush Privileges
	public static final String SQL_FLUSH_PRIVILEGES = "sqlFlushPrivileges";

	//
	public static final String MYSQL_VERSION = "mysqlVersion";

	public MySQLUsersConfiguration(MultiMap configurationParameters) {
		super(configurationParameters);
	}

	public SchemaVersion getMysqlVersion() {
		return SchemaVersion
				.valueOf(configurationParameters.getStringOrDefault(MYSQL_VERSION, SchemaVersion.AUTO.name()));
	}

	public void setMysqlVersion(SchemaVersion schemaVersion) {
		configurationParameters.set(MYSQL_VERSION, schemaVersion.name());
	}

	@Override
	public String getIdentityPasswordEncoding() {
		return "plain";
	}

	@Override
	public String getJDBCDriverName() {
		return "mysql";
	}

	@Override
	public Integer getDefaultPort() {
		return new Integer(3306);
	}

	@Override
	public String getDriverClassName() {
		return "com.mysql.jdbc.Driver";
	}

	@Override
	public String getJDBUrlProperties(boolean safe) {
		StringBuilder buf = new StringBuilder();
		buf.append("user=");
		buf.append(configurationParameters.getString(JDBC_USERNAME));
		buf.append("&");
		buf.append("password=");
		if (safe) {
			buf.append("********");
		} else {
			buf.append(configurationParameters.getString(JDBC_PASSWORD));
		}
		return buf.toString();
	}

	public String getSelectIdentitySQL() {
		return configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_SELECT,
				"SELECT * FROM mysql.user WHERE User = ? and  ( Host = ? or Host = ? ) ");
	}

	@Override
	public String getSelectIdentitiesSQL() {
		return configurationParameters.getStringOrDefault(SQL_IDENTITIES_TABLE_SELECT, "SELECT * FROM mysql.user");
	}

	public NamedParameterStatement prepareSelectIdentity(NamedParameterStatement statement, String user, String host)
			throws SQLException {
		statement.parse(configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_SELECT,
				"SELECT * FROM mysql.user WHERE user = :user AND ( host = :host OR host = :disabledHost OR ( :host = '%' AND host = '' ) )"));
		statement.setString("user", user);
		statement.setString("host", normalizeHost(host));
		statement.setString("disabledHost", getDisabledIdentityHostName(normalizeHost(host)));
		return statement;
	}

	public NamedParameterStatement prepareGrantIdentity(NamedParameterStatement statement, String access, String user,
			String host) throws SQLException {
		statement.parse(
				configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_GRANT, "GRANT :access TO :user@:host")
						.replace(":access", access));
		statement.setString("user", user);
		statement.setString("host", normalizeHost(host));
		return statement;
	}

	public NamedParameterStatement prepareRevokeIdentity(NamedParameterStatement statement, String access, String user,
			String host) throws SQLException {
		statement.parse(
				configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_GRANT, "REVOKE :access FROM :user@:host")
						.replace(":access", access));
		statement.setString("user", user);
		statement.setString("host", normalizeHost(host));
		return statement;
	}

	public NamedParameterStatement prepareShowGrants(NamedParameterStatement statement, String user, String host)
			throws SQLException {
		statement.parse(configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_GRANT_SHOW,
				"SHOW GRANTS FOR :user@:host"));
		statement.setString("user", user);
		statement.setString("host", host);
		return statement;
	}

	public NamedParameterStatement prepareCreateIdentity(NamedParameterStatement statement, String user, String host,
			String password) throws SQLException {
		if ((StringUtil.isNullOrEmpty(host))) {
			statement.parse(configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_GRANT,
					"CREATE USER :user IDENTIFIED BY :password"));
			statement.setString("user", user);
			statement.setString("password", new String(password));
		} else {
			statement.parse(configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_GRANT,
					"CREATE USER :user@:host IDENTIFIED BY :password"));
			statement.setString("host", host);
			statement.setString("user", user);
			statement.setString("password", new String(password));
		}
		return statement;
	}

	public String getDeleteIdentitySQL() {
		return configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_DELETE, "DROP USER ?@?");
	}

	public String getEnableDisableIdentitySQL() {
		return configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_ENABLE_DISABLE,
				"UPDATE mysql.user set Host = ? where User = ? and Host = ?");
	}

	public String getFlushPrivilegesSQL() {
		return configurationParameters.getStringOrDefault(SQL_IDENTITY_TABLE_ENABLE_DISABLE, "FLUSH PRIVILEGES");
	}

	public String getSelectPasswordSQL(SchemaVersion schemeVersion) {
		switch (schemeVersion) {
		case PRE_5_7:
			return configurationParameters.getStringOrDefault(SQL_PASSWORD_SELECT,
					"SELECT * FROM mysql.user WHERE PASSWORD = PASSWORD(?) AND User = ? AND Host = ?");
		case POST_5_7:
			return configurationParameters.getStringOrDefault(SQL_PASSWORD_SELECT,
					"SELECT * FROM mysql.user WHERE plugin = 'mysql_native_password' AND authentication_string = PASSWORD(?) AND User = ? AND Host = ?");
		default:
			throw new UnsupportedOperationException();
		}
	}

	public String getPasswordSetSQL(SchemaVersion version) {
		return configurationParameters.getStringOrDefault(SQL_PASSWORD_SET, "SET PASSWORD FOR ?@? = PASSWORD(?)");
	}

	public boolean getIdentityEnableDisableFeature() {
		return Boolean
				.parseBoolean(configurationParameters.getStringOrDefault(IDENTITY_ENABLE_DISABLE_FEATURE, "true"));
	}

	public String getDisableFlag() {
		return configurationParameters.getStringOrDefault(IDENTITY_ENABLE_DISABLE_FLAG, "dis!");
	}

	public String getDisabledIdentityHostName(String host) {
		return getDisableFlag() + host;
	}

	public String getDisabledIdentityPrincipalName(String user, String host) {
		if (StringUtil.isNullOrEmpty(host))
			return user + AMPERSAND + getDisableFlag();
		else
			return user + AMPERSAND + getDisableFlag() + host;
	}

	public String getEnabledIdentityPrincipalName(String user, String host) {
		if (StringUtil.isNullOrEmpty(host))
			return user;
		else
			return user + AMPERSAND + host;
	}

	@Override
	public Class> getConnectorClass() {
		return MySQLUsersConnector.class;
	}

	private String normalizeHost(String host) {
		return StringUtil.isNullOrEmpty(host) ? "%" : host;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy