/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.mysql.edit;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.mysql.MySQLMessages;
import org.jkiss.dbeaver.ext.mysql.model.MySQLDataSource;
import org.jkiss.dbeaver.ext.mysql.model.MySQLUser;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.edit.prop.DBECommandComposite;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Grant/Revoke privilege command
*/
public class MySQLCommandChangeUser extends DBECommandComposite<MySQLUser, UserPropertyHandler> {
protected MySQLCommandChangeUser(MySQLUser user)
{
super(user, MySQLMessages.edit_command_change_user_name);
}
@Override
public void updateModel()
{
for (Map.Entry<Object, Object> entry : getProperties().entrySet()) {
switch (UserPropertyHandler.valueOf((String) entry.getKey())) {
case MAX_QUERIES: getObject().setMaxQuestions(CommonUtils.toInt(entry.getValue())); break;
case MAX_UPDATES: getObject().setMaxUpdates(CommonUtils.toInt(entry.getValue())); break;
case MAX_CONNECTIONS: getObject().setMaxConnections(CommonUtils.toInt(entry.getValue())); break;
case MAX_USER_CONNECTIONS: getObject().setMaxUserConnections(CommonUtils.toInt(entry.getValue())); break;
default:
break;
}
}
}
@Override
public void validateCommand() throws DBException
{
String passValue = CommonUtils.toString(getProperty(UserPropertyHandler.PASSWORD));
String confirmValue = CommonUtils.toString(getProperty(UserPropertyHandler.PASSWORD_CONFIRM));
if (!CommonUtils.isEmpty(passValue) && !CommonUtils.equalObjects(passValue, confirmValue)) {
throw new DBException("Password confirmation value is invalid");
}
}
@Override
public DBEPersistAction[] getPersistActions()
{
List<DBEPersistAction> actions = new ArrayList<>();
boolean newUser = !getObject().isPersisted();
if (newUser) {
actions.add(
new SQLDatabasePersistAction(MySQLMessages.edit_command_change_user_action_create_new_user, "CREATE USER " + getObject().getFullName()) { //$NON-NLS-2$
@Override
public void handleExecute(DBCSession session, Throwable error)
{
if (error == null) {
getObject().setPersisted(true);
}
}
});
}
StringBuilder script = new StringBuilder();
boolean hasSet;
final MySQLDataSource dataSource = getObject().getDataSource();
if (!dataSource.isMariaDB() && dataSource.isServerVersionAtLeast(5, 7)) {
hasSet = generateAlterScript(script);
} else {
hasSet = generateUpdateScript(script);
}
if (hasSet) {
actions.add(new SQLDatabasePersistAction(MySQLMessages.edit_command_change_user_action_update_user_record, script.toString()));
}
return actions.toArray(new DBEPersistAction[actions.size()]);
}
private boolean generateUpdateScript(StringBuilder script) {
script.append("UPDATE mysql.user SET "); //$NON-NLS-1$
boolean hasSet = false;
for (Map.Entry<Object, Object> entry : getProperties().entrySet()) {
if (entry.getKey() == UserPropertyHandler.PASSWORD_CONFIRM) {
continue;
}
String delim = hasSet ? "," : ""; //$NON-NLS-1$ //$NON-NLS-2$
switch (UserPropertyHandler.valueOf((String) entry.getKey())) {
case PASSWORD: script.append(delim).append("Password=PASSWORD(").append(SQLUtils.quoteString(CommonUtils.toString(entry.getValue()))).append(")"); hasSet = true; break; //$NON-NLS-1$ //$NON-NLS-2$
case MAX_QUERIES: script.append(delim).append("Max_Questions=").append(CommonUtils.toInt(entry.getValue())); hasSet = true; break; //$NON-NLS-1$
case MAX_UPDATES: script.append(delim).append("Max_Updates=").append(CommonUtils.toInt(entry.getValue())); hasSet = true; break; //$NON-NLS-1$
case MAX_CONNECTIONS: script.append(delim).append("Max_Connections=").append(CommonUtils.toInt(entry.getValue())); hasSet = true; break; //$NON-NLS-1$
case MAX_USER_CONNECTIONS: script.append(delim).append("Max_User_Connections=").append(CommonUtils.toInt(entry.getValue())); hasSet = true; break; //$NON-NLS-1$
default: break;
}
}
script.append(" WHERE User='").append(getObject().getUserName()).append("' AND Host='").append(getObject().getHost()).append("'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return hasSet;
}
private boolean generateAlterScript(StringBuilder script) {
boolean hasSet = false, hasResOptions = false;
script.append("ALTER USER ").append(getObject().getFullName()); //$NON-NLS-1$
if (getProperties().containsKey(UserPropertyHandler.PASSWORD.name())) {
script.append("\nIDENTIFIED BY ").append(SQLUtils.quoteString(CommonUtils.toString(getProperties().get(UserPropertyHandler.PASSWORD.name())))).append(" ");
hasSet = true;
}
StringBuilder resOptions = new StringBuilder();
for (Map.Entry<Object, Object> entry : getProperties().entrySet()) {
switch (UserPropertyHandler.valueOf((String) entry.getKey())) {
case MAX_QUERIES: resOptions.append(" MAX_QUERIES_PER_HOUR ").append(CommonUtils.toInt(entry.getValue())); hasResOptions = true; break; //$NON-NLS-1$
case MAX_UPDATES: resOptions.append(" MAX_UPDATES_PER_HOUR ").append(CommonUtils.toInt(entry.getValue())); hasResOptions = true; break; //$NON-NLS-1$
case MAX_CONNECTIONS: resOptions.append(" MAX_CONNECTIONS_PER_HOUR ").append(CommonUtils.toInt(entry.getValue())); hasResOptions = true; break; //$NON-NLS-1$
case MAX_USER_CONNECTIONS: resOptions.append(" MAX_USER_CONNECTIONS ").append(CommonUtils.toInt(entry.getValue())); hasResOptions = true; break; //$NON-NLS-1$
}
}
if (resOptions.length() > 0) {
script.append("\nWITH ").append(resOptions);
}
return hasSet || hasResOptions;
}
}