package com.tesora.dve.db.mysql.portal;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;
import com.tesora.dve.charset.NativeCharSet;
import com.tesora.dve.charset.MysqlNativeCharSetCatalog;
import com.tesora.dve.db.DBEmptyTextResultConsumer;
import com.tesora.dve.db.mysql.common.MysqlHandshake;
import com.tesora.dve.db.mysql.libmy.MyErrorResponse;
import com.tesora.dve.db.mysql.libmy.MyMessage;
import com.tesora.dve.db.mysql.libmy.MyOKResponse;
import com.tesora.dve.db.mysql.portal.protocol.InboundMysqlAuthenticationHandlerV10;
import com.tesora.dve.db.mysql.portal.protocol.MSPAuthenticateV10MessageMessage;
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.server.connectionmanager.SSConnection;
import com.tesora.dve.server.connectionmanager.messages.ExecuteRequestExecutor;
import com.tesora.dve.worker.UserCredentials;
public class MSPAuthenticateHandlerV10 extends InboundMysqlAuthenticationHandlerV10 {
public MSPAuthenticateHandlerV10() {
}
protected MysqlHandshake doHandshake(ChannelHandlerContext ctx) {
MysqlHandshake handshake;SSConnection ssCon = ctx.channel().attr(ConnectionHandlerAdapter.SSCON_KEY).get();
handshake = ssCon.getHandshake();
return handshake;
}
protected MyMessage doAuthenticate(ChannelHandlerContext ctx, MSPAuthenticateV10MessageMessage authMessage) throws Throwable {
MyMessage mysqlResp;
byte clientCharsetId = authMessage.getCharsetID();
String username = authMessage.getUsername();
String password = authMessage.getPassword();
SSConnection ssCon = ctx.channel().attr(ConnectionHandlerAdapter.SSCON_KEY).get();
ssCon.setClientCapabilities(authMessage.getClientCapabilities());
UserCredentials userCred = new UserCredentials(username, password, false);
ssCon.startConnection(userCred);
String initialDB = authMessage.getInitialDatabase();
if (! "".equals(authMessage.getInitialDatabase()) ) {
final DBEmptyTextResultConsumer resultConsumer = new DBEmptyTextResultConsumer();
byte[] query = ("USE " + initialDB).getBytes(CharsetUtil.UTF_8);
ExecuteRequestExecutor.execute(ssCon, resultConsumer, query);
}
NativeCharSet cliendCharSet = MysqlNativeCharSetCatalog.DEFAULT_CATALOG.findCharSetByCollationId(clientCharsetId);
if (cliendCharSet != null) {
mysqlResp = new MyOKResponse();
ssCon.setClientCharSet(cliendCharSet);
} else {
mysqlResp = new MyErrorResponse(new PEException("Unsupported character set specified (id=" + clientCharsetId + ")"));
}
return mysqlResp;
}
}