diff --git a/loginserver/loginserver_webserver.cpp b/loginserver/loginserver_webserver.cpp index 732ce4ff7..ca8d00404 100644 --- a/loginserver/loginserver_webserver.cpp +++ b/loginserver/loginserver_webserver.cpp @@ -64,9 +64,9 @@ namespace LoginserverWebserver { api.Post( "/account/create", [](const httplib::Request &request, httplib::Response &res) { LoginserverWebserver::TokenManager::AuthCanWrite(request, res); - Json::Value request_body = LoginserverWebserver::ParseRequestBody(request); - std::string username = request_body.get("username", "").asString(); - std::string password = request_body.get("password", "").asString(); + Json::Value request_body = LoginserverWebserver::ParseRequestBody(request); + std::string username = request_body.get("username", "").asString(); + std::string password = request_body.get("password", "").asString(); Json::Value response; if (username.empty() || password.empty()) { @@ -137,7 +137,7 @@ namespace LoginserverWebserver { user_token = LoginserverWebserver::TokenManager::CheckApiAuthorizationHeaders(request); if (!user_token.can_read) { - Json::Value response; + Json::Value response; std::stringstream response_payload; response["message"] = "Authorization token is either invalid or cannot read!"; response_payload << response; @@ -165,7 +165,7 @@ namespace LoginserverWebserver { user_token = LoginserverWebserver::TokenManager::CheckApiAuthorizationHeaders(request); if (!user_token.can_write) { - Json::Value response; + Json::Value response; std::stringstream response_payload; response["message"] = "Authorization token is either invalid or cannot write!"; response_payload << response; diff --git a/world/login_server.cpp b/world/login_server.cpp index dc7d3d5d9..235fbc746 100644 --- a/world/login_server.cpp +++ b/world/login_server.cpp @@ -70,7 +70,7 @@ void LoginServer::ProcessUsertoWorldReqLeg(uint16_t opcode, EQ::Net::Packet &p) ServerPacket outpack; outpack.opcode = ServerOP_UsertoWorldResp; - outpack.size = sizeof(UsertoWorldResponse_Struct); + outpack.size = sizeof(UsertoWorldResponseLegacy_Struct); outpack.pBuffer = new uchar[outpack.size]; memset(outpack.pBuffer, 0, outpack.size); @@ -132,46 +132,59 @@ void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) uint32 id = database.GetAccountIDFromLSID(utwr->login, utwr->lsaccountid); int16 status = database.CheckStatus(id); - auto outpack = new ServerPacket; - outpack->opcode = ServerOP_UsertoWorldResp; - outpack->size = sizeof(UsertoWorldResponse_Struct); - outpack->pBuffer = new uchar[outpack->size]; - memset(outpack->pBuffer, 0, outpack->size); + ServerPacket outpack; + outpack.opcode = ServerOP_UsertoWorldResp; + outpack.size = sizeof(UsertoWorldResponse_Struct); + outpack.pBuffer = new uchar[outpack.size]; + memset(outpack.pBuffer, 0, outpack.size); - UsertoWorldResponse_Struct *utwrs = (UsertoWorldResponse_Struct *) outpack->pBuffer; + UsertoWorldResponse_Struct *utwrs = (UsertoWorldResponse_Struct *) outpack.pBuffer; utwrs->lsaccountid = utwr->lsaccountid; utwrs->ToID = utwr->FromID; strn0cpy(utwrs->login, utwr->login, 64); - utwrs->worldid = utwr->worldid; - utwrs->response = UserToWorldStatusSuccess; + utwrs->worldid = utwr->worldid; + utwrs->response = UserToWorldStatusSuccess; if (Config->Locked == true) { - if ((status == 0 || status < 100) && (status != -2 || status != -1)) { - utwrs->response = 0; + if (status < 100) { + utwrs->response = UserToWorldStatusWorldUnavail; + SendPacket(&outpack); + return; } - if (status >= 100) { - utwrs->response = 1; - } - } - else { - utwrs->response = 1; } int32 x = Config->MaxClients; if ((int32) numplayers >= x && x != -1 && x != 255 && status < 80) { - utwrs->response = -3; + utwrs->response = UserToWorldStatusWorldAtCapacity; + SendPacket(&outpack); + return; } if (status == -1) { - utwrs->response = -1; - } - if (status == -2) { - utwrs->response = -2; + utwrs->response = UserToWorldStatusSuspended; + SendPacket(&outpack); + return; } - utwrs->worldid = utwr->worldid; - SendPacket(outpack); - delete outpack; + if (status == -2) { + utwrs->response = UserToWorldStatusBanned; + SendPacket(&outpack); + return; + } + + if (RuleB(World, DisallowDuplicateAccountLogins)) { + auto cle = client_list.FindCLEByLSID(utwr->lsaccountid); + if (cle != nullptr) { + auto status = cle->GetOnline(); + if (CLE_Status_Never != status && CLE_Status_Offline != status) { + utwrs->response = UserToWorldStatusAlreadyOnline; + SendPacket(&outpack); + return; + } + } + } + + SendPacket(&outpack); } void LoginServer::ProcessLSClientAuthLegacy(uint16_t opcode, EQ::Net::Packet &p) diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 5c750f03a..493864fea 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -560,9 +560,8 @@ bool Client::Process() { OnDisconnect(true); Log(Logs::General, Logs::Zone_Server, "Client linkdead: %s", name); - if (GetGM()) { - if (GetMerc()) - { + if (Admin() > 100) { + if (GetMerc()) { GetMerc()->Save(); GetMerc()->Depop(); }