Files
2022-10-26 12:25:11 +08:00

418 lines
14 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "Handler_AU_AUTH.h"
#include <PacketStruct_CG.h>
#include <ResultCode.h>
#include <ServerConst.h>
#include "../SolarShop/ShopDefine.h"
#include <AgentServer.h>
#include <ServerSessions/ServerSessionEx.h>
#include <UserSessions/UserManager.h>
#include <UserSessions/User.h>
#include <UserSessions/TempUser.h>
#include <TimeCheck/ConnectionTimeout.h>
#include <TimeCheck/ConnectionTimeoutFactory.h>
#include <TimeCheck/TimeKeeper.h>
#undef ADD_HANDLER_INFO_EOR
#undef ADD_HANDLER_INFO
#define ADD_HANDLER_INFO_EOR() { MAKEWORD(0, 0), PHASE_NOACTION, (PH_fnHandler)NULL }
#define ADD_HANDLER_INFO( c, p, accptablePHASE ) \
{ MAKEWORD(c, p), (ePHASE_SHIFT)(accptablePHASE), (PH_fnHandler)&Handler_AU_AUTH::On##p }
sPACKET_HANDLER_INFO* Handler_AU_AUTH::GetHandlerInfo()
{
static sPACKET_HANDLER_INFO s_pHandlerInfo[] =
{
ADD_HANDLER_INFO(CATEGORY_AUTH, AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO(CATEGORY_AUTH, AG_AUTH_ASK_PC_LOGOUT_SYN, PHASE_UNLIMITED),
ADD_HANDLER_INFO(CATEGORY_AUTH, AG_AUTH_BILLING_ALARM_SYN, PHASE_UNLIMITED), // 汇票到期通知
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
ADD_HANDLER_INFO(CATEGORY_AUTH, AU_AUTH_SERVER_SELECT_ACK, PHASE_UNLIMITED),
#endif
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
ADD_HANDLER_INFO(CATEGORY_AUTH, AU_AUTH_COMMON_QUERY_USER_ID_ACK, PHASE_UNLIMITED),
#endif
#ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED
ADD_HANDLER_INFO(CATEGORY_AUTH, AU_AUTH_BILLING_CHANGE_CONTROL_SYN, PHASE_UNLIMITED),
#endif
ADD_HANDLER_INFO_EOR(),
};
return s_pHandlerInfo;
};
VOID Handler_AU_AUTH::RegisterHandler_ALL( PACKET_HANDLER_DELEGATOR pInstance )
{
pInstance->RegisterHandler_<AUTH_AGENT_SERVER>( GetHandlerInfo() );
}
HANDLER_AU_IMPL(AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN)
{
__TOUCHED((pServerSession, wSize));
MSG_AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN* pRecvMsg = (MSG_AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN*)pMsg;
MSG_GA_AUTH_NEWCLIENT_TO_GAMEAGENT_ACK msg;
msg.m_dwAuthUserID = pRecvMsg->m_dwAuthUserID;
msg.m_byResult = 0;
CHECK_ID_LENGTH_BUFFER(msg.m_szID);
CHECK_ID_LENGTH_BUFFER(pRecvMsg->m_szID);
strncpy(msg.m_szID, pRecvMsg->m_szID, _countof(msg.m_szID));
msg.m_szID[_countof(msg.m_szID) - 1] = '\0';
ConnectionTimeout * pUserInfo = dynamic_cast<ConnectionTimeout*>( g_TimeKeeper.PeekTimer( pRecvMsg->m_dwAuthUserID ) );
if( pUserInfo )
{
pUserInfo->ForceEnd();
msg.m_byResult = 1;
pServerSession->Send( (BYTE*)&msg, sizeof(msg) );
SUNLOG( eCRITICAL_LOG, "[AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN] 连接超时用户已存在!dwAuthUserID" );
return;
}
else
{
ConnectionTimeout * pUserInfo = dynamic_cast<ConnectionTimeout*>( g_TimeKeeper.PeekTimerByUserGUID( pRecvMsg->m_dwUserGuid ) );
if( pUserInfo )
{
pUserInfo->ForceEnd();
msg.m_byResult = 1;
pServerSession->Send( (BYTE*)&msg, sizeof(msg) );
SUNLOG( eCRITICAL_LOG, "[AG_AUTH_NEWCLIENT_TO_GAMEAGENT_SYN] 连接超时用户已存在! m_dwUserGuid" );
return;
}
else
{
// 现在UserKey作为UserGUID使用,所以可以在G UserManager中找到!!!
User * pPreUser = UserManager::Instance()->GetUser( pRecvMsg->m_dwUserGuid );
if( pPreUser )
{
SUNLOG( eCRITICAL_LOG, "[OnAU_AUTH_S2S_ASK_NEWCLIENT] [U:%d]存在同一玩家", pPreUser->GetUserKey() );
// 断开连接的用户.
pPreUser->SetDisconnectCode( RC::RC_DISCONNECT_REMAIN_USER_CONNECTION );
pPreUser->DisconnectUser();
msg.m_byResult = 1;
pServerSession->Send( (BYTE*)&msg, sizeof(msg) );
return;
}
}
// (WAVERIX) (090526) (CHANGES)
//const DWORD USER_AUTH_EXPIRE_DELAY = 60*1000; // 必须在30秒内连接.
// 账户信息和
//客户端IP
//构建信息尚未记录!
ConnectionTimeout* pTimeout = g_ConnTimeoutFactory.AllocConnection();
pTimeout->SetUserGUID( pRecvMsg->m_dwUserGuid ); // DB中读取的GUID
pTimeout->SetAuthUserID( pRecvMsg->m_dwAuthUserID ); // AuthServer颁发的标识符
pTimeout->SetUserID( pRecvMsg->m_szID ); // 账号
pTimeout->SetClientIP( pRecvMsg->m_szClientIP ); // 客户端Ipi
pTimeout->SetBillingType(pRecvMsg->m_BillingType);
pTimeout->SetBillingInfo(pRecvMsg->m_szBillingInfo);
pTimeout->SetReservedValue(pRecvMsg->m_dwReservedValue);
pTimeout->SetAuthUserType(pRecvMsg->m_AuthUserType);
pTimeout->SetSerialKey(pRecvMsg->m_serialKey);
pTimeout->SetSts(pRecvMsg->m_userCode[0]);
pTimeout->SetPCRoomSts(pRecvMsg->m_userCode[1]);
pTimeout->SetLastSSNKey( pRecvMsg->m_MD5Key );
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
pTimeout->SetAge( pRecvMsg->m_byAge );
pTimeout->SetRealNameAuth( pRecvMsg->m_byRealNameAuth );
SUNLOG( eDEV_LOG, "[Handler_AU_AUTH::OnAU_AUTH_S2S_ASK_NEWCLIENT] UserGuid = %d, Age = %d, RealNameAuth = %d", pRecvMsg->m_dwUserGuid, pRecvMsg->m_byAge, pRecvMsg->m_byRealNameAuth );
#endif //__CN_OO0510__FATIGUE_MATCHING_UPDATE
#ifdef _JP_0_20100723_GAMECHU_AUTHFLOW_
pTimeout->SetGameChuUSN(pRecvMsg->gamechu_usn_);
#endif
#ifdef _NA_20100307_BETAKEY_SYSTEM
pTimeout->SetBetaKey(pRecvMsg->betakey_);
#endif
pTimeout->Start(TempUser::GetConnectionTimeout());
g_TimeKeeper.PushTimer( pTimeout->GetAuthUserID(), pTimeout );
// OK
msg.m_byResult = 0;
pServerSession->Send( (BYTE*)&msg, sizeof(msg) );
}
}
HANDLER_AU_IMPL(AG_AUTH_ASK_PC_LOGOUT_SYN)
{
__TOUCHED((pServerSession, wSize));
#if USING_DUMMY_CLIENT
return;
#endif
// 从游戏服务器请求解除玩家连接分组
MSG_AG_AUTH_ASK_PC_LOGOUT_SYN * pRecvMsg = (MSG_AG_AUTH_ASK_PC_LOGOUT_SYN*)pMsg;
User * pUser = UserManager::Instance()->GetUserByAuthID( pRecvMsg->m_dwAuthUserID );
if( pUser != NULL )
{
SUNLOG( eFULL_LOG, "[Handler_AU_AUTH::OnAU_AUTH_S2S_ASK_PC_LOGOUT] 因为认证服务器主动断开连接[ID:%dAuthID:%dszID:%s]", pUser->GetUserKey(), pUser->GetAuthID(), pRecvMsg->m_szID );
#ifdef _AUTH_USERDISCONN_CODE
switch( pRecvMsg->m_dwLogoutCode )
{
case eDRC_OVERLAPPEDCONN:
{
pUser->SetDisconnectCode( RC::RC_DISCONNECT_OVERLAPPED_CONN_FROM_AUTH );
}break;
case eDRC_NOTAUTHUSER:
{
pUser->SetDisconnectCode( RC::RC_DISCONNECT_INVALID_AUTH_FROM_AUTH );
}break;
case eDRC_WOPS_GM:
{
pUser->SetDisconnectCode( RC::RC_DISCONNECT_FROM_GM );
}break;
case eDRC_BILLING_EXPIRE:
{
pUser->SetDisconnectCode( RC::RC_DISCONNECT_BILLING_EXPIRED );
}break;
default:
{
pUser->SetDisconnectCode( RC::RC_DISCONNECT_REQ_AUTH );
}break;
}
pUser->DisconnectUser();
#else
pUser->SetDisconnectCode( RC::RC_DISCONNECT_REQ_AUTH );
pUser->DisconnectUser();
#endif
MSG_GA_AUTH_ASK_PC_LOGOUT_ACK msg;
msg.m_dwAuthUserID = pRecvMsg->m_dwAuthUserID;
msg.m_byResult = 1;
#ifdef _NA000000_091005_EXTENDED_LOG_
// 根据情况(CharSelect scene)将不存在要做的内容.
const char* char_name = pUser->GetCharName();
if(char_name) {
strncpy(msg.m_CharName, char_name, _countof(msg.m_CharName));
msg.m_CharName[_countof(msg.m_CharName) - 1] = '\0';
msg.m_CharClass = pUser->GetSelectedCharClass();
msg.m_CharLevel = pUser->GetSelectedCharLV();
}
else {
msg.m_CharName[0] = '\0';
msg.m_CharClass = 0;
msg.m_CharLevel = 0;
}
#endif
pServerSession->Send( (BYTE*)&msg, (WORD)sizeof(msg) );
}
else
{
ConnectionTimeout * pUserInfo = dynamic_cast<ConnectionTimeout*>( g_TimeKeeper.PeekTimer( pRecvMsg->m_dwAuthUserID ) );
if( !pUserInfo )
{
pUserInfo = dynamic_cast<ConnectionTimeout*>( g_TimeKeeper.PeekTimerByUserGUID( pRecvMsg->m_dwUserGUID ) );
}
BYTE byLogOutType = AUTH_LOGOUT_AUTH_REQUEST;
if( pUserInfo )
{
byLogOutType = AUTH_LOGOUT_AUTH_REQUEST;
pUserInfo->ForceEnd();
}
else
{
SUNLOG( eFULL_LOG, "[Handler_AU_AUTH::OnAU_AUTH_S2S_ASK_PC_LOGOUT] 试图让没有认证服务器的用户Logout.[ToAuthID:%d, ID=%s]", pRecvMsg->m_dwAuthUserID, pRecvMsg->m_szID );
byLogOutType = AUTH_LOGOUT_USER_NOT_FOUND;
}
MSG_GA_AUTH_ASK_PC_LOGOUT_ACK msg;
msg.m_dwAuthUserID = pRecvMsg->m_dwAuthUserID;
msg.m_byResult = 0;
#ifdef _NA000000_091005_EXTENDED_LOG_
ZeroMemory(msg.m_CharName, sizeof(msg.m_CharName));
msg.m_CharClass = 0;
msg.m_CharLevel = 0;
#endif
pServerSession->Send( (BYTE*)&msg, (WORD)sizeof(msg) );
}
}
HANDLER_AU_IMPL(AG_AUTH_BILLING_ALARM_SYN)
{
__TOUCHED((pServerSession, wSize));
MSG_AG_AUTH_BILLING_ALARM_SYN* pRecvMsg = (MSG_AG_AUTH_BILLING_ALARM_SYN*)pMsg;
User * pUser = UserManager::Instance()->GetUserByAuthID( pRecvMsg->m_dwAuthUserID );
//AgentServer* pAgentServer = AgentServer::GetInstance();
if( !pUser )
{
SUNLOG( eFULL_LOG, "[OnAU_AUTH_S2S_BILLING_ALARM] 没有用户发送警报.[ToAuthID:%d]", pRecvMsg->m_dwAuthUserID );
MSG_GA_AUTH_BILLING_ALARM_ACK nakMsg;
nakMsg.m_dwAuthUserID = pRecvMsg->m_dwAuthUserID;
nakMsg.m_byResult = 0;
pServerSession->Send( (BYTE*)&nakMsg, sizeof(nakMsg) );
return;
}
MSG_CG_CONNECTION_BILLING_ALARM_BRD sendMsg;
sendMsg.dwRestTerm = pRecvMsg->m_dwRestTerm;
pUser->SendPacket( &sendMsg, sizeof(sendMsg) );
MSG_GA_AUTH_BILLING_ALARM_ACK ansMsg;
ansMsg.m_dwAuthUserID = pRecvMsg->m_dwAuthUserID;
ansMsg.m_byResult = 1;
pServerSession->Send( (BYTE*)&ansMsg, sizeof(ansMsg) );
SUNLOG( eFULL_LOG, "[OnAU_AUTH_S2S_BILLING_ALARM] 发送报警信息[ToUser:%s]", pUser->GetCharName() );
}
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
HANDLER_AU_IMPL(AU_AUTH_SERVER_SELECT_ACK)
{
__TOUCHED((pServerSession, wSize));
const MSG_AU_AUTH_SERVER_SELECT_ACK* pRecvMsg =
static_cast<const MSG_AU_AUTH_SERVER_SELECT_ACK*>(pMsg);
User* pUser = UserManager::Instance()->GetUserByAuthID(pRecvMsg->m_AuthUserID);
if(pUser == 0)
return;
MSG_CG_CONNECTION_SERVER_SELECT_REQUEST_ACK msgACK;
BOOLEAN bValidState = TRUE;
if(bValidState && pUser->IsBeginTransaction() == 0)
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_INVALID_PLAYER_STATE;
if(bValidState && pUser->GetTransactionState() != TR_QUERY_SERVER_SELECT_TRANSACTION)
bValidState = FALSE, msgACK.m_Result = RC::RC_ROOM_ALREADY_DOING_TRANSACTION;
if(bValidState == 0)
{
pUser->SendPacket(&msgACK, msgACK.GetSize());
return;
}
typedef nsPacket::ReAuthInfo Enum;
pUser->OnServerSelectQueryResult(Enum::eReAuthSlot_AuthServerSide, Enum::eReAuthStep_Accepted,
&pRecvMsg->m_ReAuthToken);
}
#endif
HANDLER_AU_IMPL(AU_AUTH_COMMON_QUERY_USER_ID_ACK)
{
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
__TOUCHED((pServerSession, wSize));
#if !defined(__NA000000_SHOP_USERID_50_PASSING_PROC__)
ASSERT(!"Function "__FUNCTION__" not supported in this version");
#endif
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
MSG_AU_AUTH_COMMON_QUERY_USER_ID_ACK* pRecvMsg =
static_cast<MSG_AU_AUTH_COMMON_QUERY_USER_ID_ACK*>(pMsg);
User* pUser = UserManager::Instance()->GetUser(pRecvMsg->user_info_.requester_user_key_);
if(pUser == 0)
return;
BOOLEAN success = true;
BYTE error_code = RC::RC_SHOP_SUCCESS;
ShopUserQuerySlot& query_slot = pUser->GetShopUserQuerySlot();
if(success && pRecvMsg->result_ == 0)
{ success = false, error_code = RC::RC_SHOP_USERISNOTFOUND; }
if(success && query_slot.IsTransaction() == 0)
{ success = false, error_code = RC::RC_SHOP_FAILED; }
if(success && pUser->IsBeginTransaction() != 0) // by long-term transaction...
{ success = false, error_code = RC::RC_SHOP_FAILED; }
if(success) {
const MSG_CG_SHOP_SEND_GIFT_SYN* requested_msg = query_slot.GetMessage();
assert(requested_msg);
if(!FlowControl::FCAssert(_strnicmp(requested_msg->m_tszCharName,
pRecvMsg->user_info_.char_name_,
_countof(requested_msg->m_tszCharName)) == 0))
{
success = false, error_code = RC::RC_SHOP_FAILED;
// (WAVERIX) (WARNING) 验证ShopUserQuerySlot数据设置部分.
//SUNLOG(eCRITICAL_LOG, "Check ShopUserQuerySlot argument input point '%s' != '%s'",
// requested_msg->m_tszCharName, pRecvMsg->user_info_.char_name_);
}
}
// latest result process
if(success) {
const MSG_CG_SHOP_SEND_GIFT_SYN* requested_msg = query_slot.GetMessage();
MSG_CG_SHOP_SEND_GIFT_RELAY_SYN msgSYN;
msgSYN.item_type_ = requested_msg->m_ItemType;
msgSYN.price_guid_ = requested_msg->m_PriceGuid;
msgSYN.purchase_type_ = requested_msg->m_PurchaseType;
strncpy(msgSYN.gift_message_, requested_msg->m_tszGiftMessage,
_countof(msgSYN.gift_message_));
msgSYN.gift_message_[_countof(msgSYN.gift_message_) - 1] = '\0';
msgSYN.user_info_ = pRecvMsg->user_info_;
pUser->SendToLinkedServer(&msgSYN, msgSYN.GetSize());
} else {
MSG_CG_SHOP_SEND_GIFT_NAK msgNAK;
msgNAK.m_byErrorCode = error_code;
pUser->SendPacket(&msgNAK, sizeof(msgNAK));
}
// release resource
query_slot.QueryEnd();
#endif //__NA000000_SHOP_USERID_50_PASSING_PROC__
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
}
HANDLER_AU_IMPL(AU_AUTH_BILLING_CHANGE_CONTROL_SYN)
{
__TOUCHED((pServerSession, wSize));
#if !defined(_PCBANG_POLICY_CHANGE_POST_EXPIRED)
ASSERT(!"Function "__FUNCTION__" not supported in this version");
#endif
#ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED
MSG_AU_AUTH_BILLING_CHANGE_CONTROL_SYN* pRecvMsg =
static_cast<MSG_AU_AUTH_BILLING_CHANGE_CONTROL_SYN*>(pMsg);
BOOLEAN success = true;
//MSG_AU_AUTH_BILLING_CHANGE_CONTROL_ACK msgACK;
//MSG_AU_AUTH_BILLING_CHANGE_CONTROL_ACK::eResult result = msgACK.eResult_Success;
UserManager* pUserManager = UserManager::Instance();
User* pUser = pUserManager->GetUser(pRecvMsg->user_key_);
if(pUser != 0)
{
pUser->SetBillingType(pRecvMsg->status_);
pUser->SetReservedValue(pRecvMsg->pc_room_id_);
pUser->NotifyPcBangBillingStatus(true, true);
}
else
{
ConnectionTimeout* pUserInfo =
dynamic_cast<ConnectionTimeout*>(g_TimeKeeper.PeekTimer(pRecvMsg->auth_user_key_));
if(pUserInfo == 0) {
pUserInfo = dynamic_cast<ConnectionTimeout*>(
g_TimeKeeper.PeekTimerByUserGUID(pRecvMsg->user_key_));
}
if(pUserInfo == 0) {
SUNLOG(eCRITICAL_LOG, "找不到改变网吧状态的玩家. %u\n",
pRecvMsg->user_key_);
success = false;
}
if(success) {
pUserInfo->SetBillingType(pRecvMsg->status_);
pUserInfo->SetReservedValue(pRecvMsg->pc_room_id_);
}
}
#endif
}