1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 10:42:36 +01:00

Fix rpcn create/login not returning proper error

This commit is contained in:
RipleyTom 2021-10-12 01:17:28 +02:00 committed by Megamouse
parent d58df667b9
commit df39bd39b0
2 changed files with 47 additions and 28 deletions

View File

@ -732,10 +732,11 @@ error_code sceNpBasicSetPresence(vm::cptr<u8> data, u64 size)
return SCE_NP_BASIC_ERROR_NOT_REGISTERED;
}
if (!data || !data[0])
{
return SCE_NP_BASIC_ERROR_INVALID_ARGUMENT;
}
// TODO: Correct but causes issues atm(breaks bomberman ultra)
// if (!data || !data[0])
// {
// return SCE_NP_BASIC_ERROR_INVALID_ARGUMENT;
// }
if (size > SCE_NP_BASIC_MAX_PRESENCE_SIZE)
{
@ -979,7 +980,7 @@ error_code sceNpBasicSendMessageAttachment(vm::cptr<SceNpId> to, vm::cptr<char>
// TODO: SCE_NP_BASIC_ERROR_NOT_SUPPORTED, might be in between argument checks
if (strlen(subject.get_ptr()) > SCE_NP_BASIC_BODY_CHARACTER_MAX || strlen(body.get_ptr()) > SCE_NP_BASIC_BODY_CHARACTER_MAX)
if (strlen(subject.get_ptr()) > SCE_NP_BASIC_SUBJECT_CHARACTER_MAX || strlen(body.get_ptr()) > SCE_NP_BASIC_BODY_CHARACTER_MAX)
{
return SCE_NP_BASIC_ERROR_EXCEEDS_MAX;
}

View File

@ -195,6 +195,7 @@ namespace rpcn
if (!result_login)
{
rpcn_log.notice("MT: login attempt failed");
break;
}
continue;
@ -503,12 +504,6 @@ namespace rpcn
if (!get_reply(packet_id, reply_data))
return false;
if (is_error(static_cast<ErrorType>(reply_data[0])))
{
// disconnect();
return false;
}
return true;
}
@ -554,13 +549,13 @@ namespace rpcn
bool rpcn_client::connect(const std::string& host)
{
rpcn_log.warning("Attempting to connect to RPCN!");
rpcn_log.warning("connect: Attempting to connect");
state = rpcn_state::failure_no_failure;
if (host.empty())
{
rpcn_log.error("RPCN host is empty!");
rpcn_log.error("connect: RPCN host is empty!");
state = rpcn_state::failure_input;
return false;
}
@ -568,7 +563,7 @@ namespace rpcn
auto splithost = fmt::split(host, {":"});
if (splithost.size() != 1 && splithost.size() != 2)
{
rpcn_log.error("RPCN host is invalid!");
rpcn_log.error("connect: RPCN host is invalid!");
state = rpcn_state::failure_input;
return false;
}
@ -580,7 +575,7 @@ namespace rpcn
port = std::stoul(splithost[1]);
if (port == 0)
{
rpcn_log.error("RPCN port is invalid!");
rpcn_log.error("connect: RPCN port is invalid!");
state = rpcn_state::failure_input;
return false;
}
@ -595,14 +590,14 @@ namespace rpcn
if (wolfSSL_Init() != WOLFSSL_SUCCESS)
{
rpcn_log.error("Failed to initialize wolfssl");
rpcn_log.error("connect: Failed to initialize wolfssl");
state = rpcn_state::failure_wolfssl;
return false;
}
if ((wssl_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == nullptr)
{
rpcn_log.error("Failed to create wolfssl context");
rpcn_log.error("connect: Failed to create wolfssl context");
state = rpcn_state::failure_wolfssl;
return false;
}
@ -611,7 +606,7 @@ namespace rpcn
if ((read_wssl = wolfSSL_new(wssl_ctx)) == nullptr)
{
rpcn_log.error("Failed to create wolfssl object");
rpcn_log.error("connect: Failed to create wolfssl object");
state = rpcn_state::failure_wolfssl;
return false;
}
@ -624,7 +619,7 @@ namespace rpcn
hostent* host_addr = gethostbyname(splithost[0].c_str());
if (!host_addr)
{
rpcn_log.error("Failed to resolve %s", host);
rpcn_log.error("connect: Failed to resolve %s", host);
state = rpcn_state::failure_resolve;
return false;
}
@ -646,21 +641,23 @@ namespace rpcn
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&timeout), sizeof(timeout)) < 0)
{
rpcn_log.error("Failed to setsockopt!");
rpcn_log.error("connect: Failed to setsockopt!");
state = rpcn_state::failure_other;
return false;
}
if (::connect(sockfd, reinterpret_cast<struct sockaddr*>(&addr_rpcn), sizeof(addr_rpcn)) != 0)
{
rpcn_log.error("Failed to connect to RPCN server!");
rpcn_log.error("connect: Failed to connect to RPCN server!");
state = rpcn_state::failure_connect;
return false;
}
rpcn_log.notice("connect: Connection successful");
if (wolfSSL_set_fd(read_wssl, sockfd) != WOLFSSL_SUCCESS)
{
rpcn_log.error("Failed to associate wolfssl to the socket");
rpcn_log.error("connect: Failed to associate wolfssl to the socket");
state = rpcn_state::failure_wolfssl;
return false;
}
@ -672,13 +669,15 @@ namespace rpcn
continue;
state = rpcn_state::failure_wolfssl;
rpcn_log.error("Handshake failed with RPCN Server: %s", get_wolfssl_error(read_wssl, ret_connect));
rpcn_log.error("connect: Handshake failed with RPCN Server: %s", get_wolfssl_error(read_wssl, ret_connect));
return false;
}
rpcn_log.notice("connect: Handshake successful");
if ((write_wssl = wolfSSL_write_dup(read_wssl)) == NULL)
{
rpcn_log.error("Failed to create write dup for SSL");
rpcn_log.error("connect: Failed to create write dup for SSL");
state = rpcn_state::failure_wolfssl;
return false;
}
@ -689,6 +688,8 @@ namespace rpcn
sem_reader.release();
sem_writer.release();
rpcn_log.notice("connect: Waiting for protocol version");
while (!server_info_received && connected && !terminate)
{
std::this_thread::sleep_for(5ms);
@ -707,6 +708,8 @@ namespace rpcn
return false;
}
rpcn_log.notice("connect: Protocol version matches");
last_ping_time = steady_clock::now() - 5s;
last_pong_time = last_ping_time;
@ -720,6 +723,8 @@ namespace rpcn
return false;
}
rpcn_log.notice("Attempting to login!");
std::vector<u8> data;
std::copy(npid.begin(), npid.end(), std::back_inserter(data));
data.push_back(0);
@ -731,8 +736,10 @@ namespace rpcn
u64 req_id = rpcn_request_counter.fetch_add(1);
std::vector<u8> packet_data;
if (!forge_send_reply(CommandType::Login, req_id, data, packet_data))
{
state = rpcn_state::failure_other;
return false;
}
@ -812,6 +819,7 @@ namespace rpcn
std::vector<u8> packet_data;
if (!forge_send_reply(CommandType::Create, req_id, data, packet_data))
{
state = rpcn_state::failure_other;
return ErrorType::CreationError;
}
@ -952,10 +960,20 @@ namespace rpcn
memcpy(data.data(), communication_id.data, COMMUNICATION_ID_SIZE);
if (!forge_send_reply(CommandType::GetServerList, req_id, data, reply_data))
{
return false;
}
vec_stream reply(reply_data);
auto error = static_cast<ErrorType>(reply.get<u8>());
if (is_error(error))
{
return false;
}
vec_stream reply(reply_data, 1);
u16 num_servs = reply.get<u16>();
server_list.clear();
for (u16 i = 0; i < num_servs; i++)
{
@ -1570,9 +1588,9 @@ namespace rpcn
case LoginInvalidPassword: rpcn_log.error("Login error: invalid password!"); break;
case LoginInvalidToken: rpcn_log.error("Login error: invalid token!"); break;
case CreationError: rpcn_log.error("Error creating an account!"); break;
case CreationExistingUsername: rpcn_log.error("Error creating an account: existing username!");
case CreationBannedEmailProvider: rpcn_log.error("Error creating an account: banned email provider!");
case CreationExistingEmail: rpcn_log.error("Error creating an account: an account with that email already exist!");
case CreationExistingUsername: rpcn_log.error("Error creating an account: existing username!"); break;
case CreationBannedEmailProvider: rpcn_log.error("Error creating an account: banned email provider!"); break;
case CreationExistingEmail: rpcn_log.error("Error creating an account: an account with that email already exist!"); break;
case AlreadyJoined: rpcn_log.error("User has already joined!"); break;
case DbFail: rpcn_log.error("A db query failed on the server!"); break;
case EmailFail: rpcn_log.error("An email action failed on the server!"); break;