From fd49464d7c375c71a257348457e449f710d21f08 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 17 Sep 2019 00:57:29 +0800 Subject: [PATCH] 1 --- server/gameserver/GCListener.cc | 34 +++++++++++++++++++++++++++++++++ server/gameserver/GCListener.h | 1 + server/gameserver/playermgr.cc | 2 ++ 3 files changed, 37 insertions(+) diff --git a/server/gameserver/GCListener.cc b/server/gameserver/GCListener.cc index 91548fb..df242c5 100644 --- a/server/gameserver/GCListener.cc +++ b/server/gameserver/GCListener.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include #include #include @@ -132,6 +134,19 @@ public: .SetParam1(1)); } + void SetKey(unsigned char* data, int len) + { + send_i_ = 0; + send_j_ = 0; + recv_i_ = 0; + recv_j_ = 0; + initialized_ = true; + key_.clear(); + for (int i = 0; i < len; ++i) { + key_.push_back(data[i]); + } + } + protected: virtual void SendBuff(const char* buff, unsigned int bufflen) override @@ -197,6 +212,25 @@ void GCListener::MarkClient(int sockhandle, bool is_active) tcp_listener_->MarkClient(sockhandle, is_active); } +void GCListener::SetKey(int sockhandle, const std::string& key) +{ + tcp_listener_->LockClients(); + GCClientSession* session = (GCClientSession*)tcp_listener_->GetClientSession(sockhandle); + if (session) { + bignum_st* bn = BN_new(); + BN_hex2bn(&bn, key.c_str()); + { + int length = BN_num_bytes(bn); + unsigned char* _array = new unsigned char[length]; + BN_bn2bin(bn, (unsigned char*)_array); + std::reverse(_array, _array + length); + session->SetKey(_array, 40); + } + BN_free(bn); + } + tcp_listener_->UnLockClients(); +} + void GCListener::InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg) { unsigned short packlen = 2 + CustomPbSerializeSize(&msg); diff --git a/server/gameserver/GCListener.h b/server/gameserver/GCListener.h index ac14209..9024705 100644 --- a/server/gameserver/GCListener.h +++ b/server/gameserver/GCListener.h @@ -44,6 +44,7 @@ class GCListener : public a8::Singleton void ForceCloseClient(int sockhandle); void MarkClient(int sockhandle, bool is_active); + void SetKey(int sockhandle, const std::string& key); private: void InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index cee76a3..61c64c2 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -24,6 +24,8 @@ void PlayerMgr::_CMAuthSession(f8::MsgHdr& hdr, const cs::CMAuthSession& msg) msg.account() }); assert(ret > 0); + GCListener::Instance()->SetKey(hdr.socket_handle, + DBEngine::Instance()->GetValue(2).GetString()); cs::SMAuthResponse respmsg; respmsg.set_errcode(AUTH_OK); GCListener::Instance()->SendMsg(hdr.socket_handle, respmsg);