diff --git a/gui/include/host.h b/gui/include/host.h index 0e403ce..8ff292e 100644 --- a/gui/include/host.h +++ b/gui/include/host.h @@ -38,12 +38,13 @@ static bool operator<(const HostMAC &a, const HostMAC &b) { return a.GetValue() class RegisteredHost { private: + ChiakiTarget target; QString ap_ssid; QString ap_bssid; QString ap_key; QString ap_name; - HostMAC ps4_mac; - QString ps4_nickname; + HostMAC server_mac; + QString server_nickname; char rp_regist_key[CHIAKI_SESSION_AUTH_SIZE]; uint32_t rp_key_type; uint8_t rp_key[0x10]; @@ -54,8 +55,9 @@ class RegisteredHost RegisteredHost(const ChiakiRegisteredHost &chiaki_host); - const HostMAC &GetPS4MAC() const { return ps4_mac; } - const QString &GetPS4Nickname() const { return ps4_nickname; } + ChiakiTarget GetTarget() const { return target; } + const HostMAC &GetServerMAC() const { return server_mac; } + const QString &GetServerNickname() const { return server_nickname; } const QByteArray GetRPRegistKey() const { return QByteArray(rp_regist_key, sizeof(rp_regist_key)); } const QByteArray GetRPKey() const { return QByteArray((const char *)rp_key, sizeof(rp_key)); } @@ -81,7 +83,7 @@ class ManualHost bool GetRegistered() const { return registered; } HostMAC GetMAC() const { return registered_mac; } - void Register(const RegisteredHost ®istered_host) { this->registered = true; this->registered_mac = registered_host.GetPS4MAC(); } + void Register(const RegisteredHost ®istered_host) { this->registered = true; this->registered_mac = registered_host.GetServerMAC(); } void SaveToSettings(QSettings *settings) const; static ManualHost LoadFromSettings(QSettings *settings); diff --git a/gui/src/host.cpp b/gui/src/host.cpp index 8a5f8ce..c6f3e63 100644 --- a/gui/src/host.cpp +++ b/gui/src/host.cpp @@ -15,8 +15,8 @@ RegisteredHost::RegisteredHost(const RegisteredHost &o) ap_bssid(o.ap_bssid), ap_key(o.ap_key), ap_name(o.ap_name), - ps4_mac(o.ps4_mac), - ps4_nickname(o.ps4_nickname), + server_mac(o.server_mac), + server_nickname(o.server_nickname), rp_key_type(o.rp_key_type) { memcpy(rp_regist_key, o.rp_regist_key, sizeof(rp_regist_key)); @@ -24,13 +24,14 @@ RegisteredHost::RegisteredHost(const RegisteredHost &o) } RegisteredHost::RegisteredHost(const ChiakiRegisteredHost &chiaki_host) - : ps4_mac(chiaki_host.ps4_mac) + : server_mac(chiaki_host.server_mac) { + target = chiaki_host.target; ap_ssid = chiaki_host.ap_ssid; ap_bssid = chiaki_host.ap_bssid; ap_key = chiaki_host.ap_key; ap_name = chiaki_host.ap_name; - ps4_nickname = chiaki_host.ps4_nickname; + server_nickname = chiaki_host.server_nickname; memcpy(rp_regist_key, chiaki_host.rp_regist_key, sizeof(rp_regist_key)); rp_key_type = chiaki_host.rp_key_type; memcpy(rp_key, chiaki_host.rp_key, sizeof(rp_key)); @@ -38,12 +39,13 @@ RegisteredHost::RegisteredHost(const ChiakiRegisteredHost &chiaki_host) void RegisteredHost::SaveToSettings(QSettings *settings) const { + settings->setValue("target", (int)target); settings->setValue("ap_ssid", ap_ssid); settings->setValue("ap_bssid", ap_bssid); settings->setValue("ap_key", ap_key); settings->setValue("ap_name", ap_name); - settings->setValue("ps4_nickname", ps4_nickname); - settings->setValue("ps4_mac", QByteArray((const char *)ps4_mac.GetMAC(), 6)); + settings->setValue("server_nickname", server_nickname); + settings->setValue("server_mac", QByteArray((const char *)server_mac.GetMAC(), 6)); settings->setValue("rp_regist_key", QByteArray(rp_regist_key, sizeof(rp_regist_key))); settings->setValue("rp_key_type", rp_key_type); settings->setValue("rp_key", QByteArray((const char *)rp_key, sizeof(rp_key))); @@ -52,14 +54,15 @@ void RegisteredHost::SaveToSettings(QSettings *settings) const RegisteredHost RegisteredHost::LoadFromSettings(QSettings *settings) { RegisteredHost r; + r.target = (ChiakiTarget)settings->value("target").toInt(); r.ap_ssid = settings->value("ap_ssid").toString(); r.ap_bssid = settings->value("ap_bssid").toString(); r.ap_key = settings->value("ap_key").toString(); r.ap_name = settings->value("ap_name").toString(); - r.ps4_nickname = settings->value("ps4_nickname").toString(); - auto ps4_mac = settings->value("ps4_mac").toByteArray(); - if(ps4_mac.size() == 6) - r.ps4_mac = HostMAC((const uint8_t *)ps4_mac.constData()); + r.server_nickname = settings->value("server_nickname").toString(); + auto server_mac = settings->value("server_mac").toByteArray(); + if(server_mac.size() == 6) + r.server_mac = HostMAC((const uint8_t *)server_mac.constData()); auto rp_regist_key = settings->value("rp_regist_key").toByteArray(); if(rp_regist_key.size() == sizeof(r.rp_regist_key)) memcpy(r.rp_regist_key, rp_regist_key.constData(), sizeof(r.rp_regist_key)); diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 4ec7871..ac6e4ce 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -112,7 +112,7 @@ int real_main(int argc, char *argv[]) if(args[0] == "list") { for(const auto &host : settings.GetRegisteredHosts()) - printf("Host: %s \n", host.GetPS4Nickname().toLocal8Bit().constData()); + printf("Host: %s \n", host.GetServerNickname().toLocal8Bit().constData()); return 0; } if(args[0] == "stream") @@ -131,7 +131,7 @@ int real_main(int argc, char *argv[]) parser.showHelp(1); for(const auto &temphost : settings.GetRegisteredHosts()) { - if(temphost.GetPS4Nickname() == args[1]) + if(temphost.GetServerNickname() == args[1]) { morning = temphost.GetRPKey(); regist_key = temphost.GetRPRegistKey(); diff --git a/gui/src/manualhostdialog.cpp b/gui/src/manualhostdialog.cpp index 291bb32..d184d3a 100644 --- a/gui/src/manualhostdialog.cpp +++ b/gui/src/manualhostdialog.cpp @@ -38,7 +38,7 @@ ManualHostDialog::ManualHostDialog(Settings *settings, int id, QWidget *parent) registered_host_combo_box->addItem(tr("Register on first Connection")); auto registered_hosts = settings->GetRegisteredHosts(); for(const auto ®istered_host : registered_hosts) - registered_host_combo_box->addItem(QString("%1 (%2)").arg(registered_host.GetPS4MAC().ToString(), registered_host.GetPS4Nickname()), QVariant::fromValue(registered_host.GetPS4MAC())); + registered_host_combo_box->addItem(QString("%1 (%2)").arg(registered_host.GetServerMAC().ToString(), registered_host.GetServerNickname()), QVariant::fromValue(registered_host.GetServerMAC())); form_layout->addRow(tr("Registered Console:"), registered_host_combo_box); button_box = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard, this); @@ -74,4 +74,4 @@ void ManualHostDialog::accept() ManualHost host(host_id, host_edit->text().trimmed(), registered, registered_mac); settings->SetManualHost(host); QDialog::accept(); -} \ No newline at end of file +} diff --git a/gui/src/registdialog.cpp b/gui/src/registdialog.cpp index c101bf3..4829da1 100644 --- a/gui/src/registdialog.cpp +++ b/gui/src/registdialog.cpp @@ -205,14 +205,14 @@ void RegistExecuteDialog::Finished() void RegistExecuteDialog::Success(RegisteredHost host) { - CHIAKI_LOGI(&log, "Successfully registered %s", host.GetPS4Nickname().toLocal8Bit().constData()); + CHIAKI_LOGI(&log, "Successfully registered %s", host.GetServerNickname().toLocal8Bit().constData()); this->registered_host = host; - if(settings->GetRegisteredHostRegistered(host.GetPS4MAC())) + if(settings->GetRegisteredHostRegistered(host.GetServerMAC())) { int r = QMessageBox::question(this, tr("Console already registered"), - tr("The console with ID %1 has already been registered. Should the previous record be overwritten?").arg(host.GetPS4MAC().ToString())); + tr("The console with ID %1 has already been registered. Should the previous record be overwritten?").arg(host.GetServerMAC().ToString())); if(r == QMessageBox::No) { accept(); @@ -222,7 +222,7 @@ void RegistExecuteDialog::Success(RegisteredHost host) settings->AddRegisteredHost(host); - QMessageBox::information(this, tr("Console registered"), tr("The Console %1 with ID %2 has been successfully registered!").arg(host.GetPS4Nickname(), host.GetPS4MAC().ToString())); + QMessageBox::information(this, tr("Console registered"), tr("The Console %1 with ID %2 has been successfully registered!").arg(host.GetServerNickname(), host.GetServerMAC().ToString())); accept(); } diff --git a/gui/src/serveritemwidget.cpp b/gui/src/serveritemwidget.cpp index f82ae6a..ef7448e 100644 --- a/gui/src/serveritemwidget.cpp +++ b/gui/src/serveritemwidget.cpp @@ -76,7 +76,7 @@ void ServerItemWidget::Update(const DisplayServer &display_server) if(display_server.discovered || display_server.registered) { - top_text += (display_server.discovered ? display_server.discovery_host.host_name : display_server.registered_host.GetPS4Nickname()) + "\n"; + top_text += (display_server.discovered ? display_server.discovery_host.host_name : display_server.registered_host.GetServerNickname()) + "\n"; } top_text += tr("Address: %1").arg(display_server.GetHostAddr()); @@ -84,7 +84,7 @@ void ServerItemWidget::Update(const DisplayServer &display_server) if(display_server.discovered || display_server.registered) { top_text += "\n" + tr("ID: %1 (%2)").arg( - display_server.discovered ? display_server.discovery_host.GetHostMAC().ToString() : display_server.registered_host.GetPS4MAC().ToString(), + display_server.discovered ? display_server.discovery_host.GetHostMAC().ToString() : display_server.registered_host.GetServerMAC().ToString(), display_server.registered ? tr("registered") : tr("unregistered")); } diff --git a/gui/src/settings.cpp b/gui/src/settings.cpp index c6bcd7b..e08ec57 100644 --- a/gui/src/settings.cpp +++ b/gui/src/settings.cpp @@ -5,10 +5,67 @@ #include -#define SETTINGS_VERSION 1 +#define SETTINGS_VERSION 2 + +static void MigrateSettingsTo2(QSettings *settings) +{ + QList> hosts; + int count = settings->beginReadArray("registered_hosts"); + for(int i=0; isetArrayIndex(i); + QMap host; + for(QString k : settings->allKeys()) + host[k] = settings->value(k); + } + settings->endArray(); + settings->beginWriteArray("registered_hosts"); + int i=0; + for(const auto &host : hosts) + { + settings->setArrayIndex(i); + settings->setValue("target", (int)CHIAKI_TARGET_PS4_10); + for(auto it = host.constBegin(); it != host.constEnd(); it++) + { + QString k = it.key(); + if(k == "ps4_nickname") + k = "server_nickname"; + else if(k == "ps4_mac") + k = "server_mac"; + settings->setValue(k, it.value()); + } + i++; + } + settings->endArray(); +} + +static void MigrateSettings(QSettings *settings) +{ + int version_prev = settings->value("version", 0).toInt(); + if(version_prev < 1) + return; + if(version_prev > SETTINGS_VERSION) + { + CHIAKI_LOGE(NULL, "Settings version %d is higher than application one (%d)", version_prev, SETTINGS_VERSION); + return; + } + while(version_prev < 1) + { + version_prev++; + switch(version_prev) + { + case 2: + MigrateSettingsTo2(settings); + break; + default: + break; + } + } +} Settings::Settings(QObject *parent) : QObject(parent) { + MigrateSettings(&settings); manual_hosts_id_next = 0; settings.setValue("version", SETTINGS_VERSION); LoadRegisteredHosts(); @@ -183,7 +240,7 @@ void Settings::LoadRegisteredHosts() { settings.setArrayIndex(i); RegisteredHost host = RegisteredHost::LoadFromSettings(&settings); - registered_hosts[host.GetPS4MAC()] = host; + registered_hosts[host.GetServerMAC()] = host; } settings.endArray(); } @@ -203,7 +260,7 @@ void Settings::SaveRegisteredHosts() void Settings::AddRegisteredHost(const RegisteredHost &host) { - registered_hosts[host.GetPS4MAC()] = host; + registered_hosts[host.GetServerMAC()] = host; SaveRegisteredHosts(); emit RegisteredHostsUpdated(); } diff --git a/gui/src/settingsdialog.cpp b/gui/src/settingsdialog.cpp index 73dd350..4411343 100644 --- a/gui/src/settingsdialog.cpp +++ b/gui/src/settingsdialog.cpp @@ -348,8 +348,8 @@ void SettingsDialog::UpdateRegisteredHosts() auto hosts = settings->GetRegisteredHosts(); for(const auto &host : hosts) { - auto item = new QListWidgetItem(QString("%1 (%2)").arg(host.GetPS4MAC().ToString(), host.GetPS4Nickname())); - item->setData(Qt::UserRole, QVariant::fromValue(host.GetPS4MAC())); + auto item = new QListWidgetItem(QString("%1 (%2)").arg(host.GetServerMAC().ToString(), host.GetServerNickname())); + item->setData(Qt::UserRole, QVariant::fromValue(host.GetServerMAC())); registered_hosts_list_widget->addItem(item); } } diff --git a/lib/include/chiaki/regist.h b/lib/include/chiaki/regist.h index c12d57f..9ad1efc 100644 --- a/lib/include/chiaki/regist.h +++ b/lib/include/chiaki/regist.h @@ -37,12 +37,13 @@ typedef struct chiaki_regist_info_t typedef struct chiaki_registered_host_t { + ChiakiTarget target; char ap_ssid[0x30]; char ap_bssid[0x20]; char ap_key[0x50]; char ap_name[0x20]; - uint8_t ps4_mac[6]; - char ps4_nickname[0x20]; + uint8_t server_mac[6]; + char server_nickname[0x20]; char rp_regist_key[CHIAKI_SESSION_AUTH_SIZE]; // must be completely filled (pad with \0) uint32_t rp_key_type; uint8_t rp_key[0x10]; diff --git a/lib/src/regist.c b/lib/src/regist.c index b2cee08..47c6ab1 100644 --- a/lib/src/regist.c +++ b/lib/src/regist.c @@ -633,20 +633,22 @@ static ChiakiErrorCode regist_parse_response_payload(ChiakiRegist *regist, Chiak } memset(host, 0, sizeof(*host)); + host->target = regist->info.target; bool mac_found = false; bool regist_key_found = false; bool key_found = false; + bool ps5 = chiaki_target_is_ps5(regist->info.target); for(ChiakiHttpHeader *header=headers; header; header=header->next) { #define COPY_STRING(name, key_str) \ - if(strcmp(header->key, key_str) == 0) \ + if(strcmp(header->key, (key_str)) == 0) \ { \ size_t len = strlen(header->value); \ if(len >= sizeof(host->name)) \ { \ - CHIAKI_LOGE(regist->log, "Regist value for " key_str " in response is too long"); \ + CHIAKI_LOGE(regist->log, "Regist value for %s in response is too long", (key_str)); \ continue; \ } \ memcpy(host->name, header->value, len); \ @@ -657,10 +659,10 @@ static ChiakiErrorCode regist_parse_response_payload(ChiakiRegist *regist, Chiak COPY_STRING(ap_bssid, "AP-Bssid") COPY_STRING(ap_key, "AP-Key") COPY_STRING(ap_name, "AP-Name") - COPY_STRING(ps4_nickname, "PS4-Nickname") + COPY_STRING(server_nickname, ps5 ? "PS5-Nickname" : "PS4-Nickname") #undef COPY_STRING - if(strcmp(header->key, "PS4-RegistKey") == 0) + if(strcmp(header->key, ps5 ? "PS5-RegistKey" : "PS4-RegistKey") == 0) { memset(host->rp_regist_key, 0, sizeof(host->rp_regist_key)); size_t buf_size = sizeof(host->rp_regist_key); @@ -693,14 +695,14 @@ static ChiakiErrorCode regist_parse_response_payload(ChiakiRegist *regist, Chiak key_found = true; } } - else if(strcmp(header->key, "PS4-Mac") == 0) + else if(strcmp(header->key, ps5 ? "PS5-Mac" : "PS4-Mac") == 0) { - size_t buf_size = sizeof(host->ps4_mac); - err = parse_hex((uint8_t *)host->ps4_mac, &buf_size, header->value, strlen(header->value)); - if(err != CHIAKI_ERR_SUCCESS || buf_size != sizeof(host->ps4_mac)) + size_t buf_size = sizeof(host->server_mac); + err = parse_hex((uint8_t *)host->server_mac, &buf_size, header->value, strlen(header->value)); + if(err != CHIAKI_ERR_SUCCESS || buf_size != sizeof(host->server_mac)) { CHIAKI_LOGE(regist->log, "Regist received invalid MAC Address in response"); - memset(host->ps4_mac, 0, sizeof(host->ps4_mac)); + memset(host->server_mac, 0, sizeof(host->server_mac)); } else { diff --git a/lib/src/session.c b/lib/src/session.c index ab33d97..38c8950 100644 --- a/lib/src/session.c +++ b/lib/src/session.c @@ -31,7 +31,7 @@ #define SESSION_EXPECT_TIMEOUT_MS 5000 static void *session_thread_func(void *arg); -static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget *target_out); +static ChiakiErrorCode session_thread_request_session(ChiakiSession *session, ChiakiTarget *target_out); const char *chiaki_rp_application_reason_string(uint32_t reason) { @@ -369,20 +369,20 @@ static void *session_thread_func(void *arg) CHIAKI_LOGI(session->log, "Starting session request"); ChiakiTarget server_target = session->connect_info.ps5 ? CHIAKI_TARGET_PS5_UNKNOWN : CHIAKI_TARGET_PS4_UNKNOWN; - success = session_thread_request_session(session, &server_target); + success = session_thread_request_session(session, &server_target) == CHIAKI_ERR_SUCCESS; if(!success && chiaki_target_is_unknown(server_target)) { CHIAKI_LOGI(session->log, "Attempting to re-request session with Server's RP-Version"); session->target = server_target; - success = session_thread_request_session(session, &server_target); + success = session_thread_request_session(session, &server_target) == CHIAKI_ERR_SUCCESS; } if(!success && chiaki_target_is_unknown(server_target)) { CHIAKI_LOGI(session->log, "Attempting to re-request session even harder with Server's RP-Version!!!"); session->target = server_target; - success = session_thread_request_session(session, NULL); + success = session_thread_request_session(session, NULL) == CHIAKI_ERR_SUCCESS; } if(!success) @@ -569,7 +569,7 @@ static void parse_session_response(SessionResponse *response, ChiakiHttpResponse /** * @param target_out if NULL, version mismatch means to fail the entire session, otherwise report the target here */ -static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget *target_out) +static ChiakiErrorCode session_thread_request_session(ChiakiSession *session, ChiakiTarget *target_out) { chiaki_socket_t session_sock = CHIAKI_INVALID_SOCKET; for(struct addrinfo *ai=session->connect_info.host_addrinfos; ai; ai=ai->ai_next) @@ -690,6 +690,12 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget } const char *rp_version_str = chiaki_rp_version_string(session->target); + if(!rp_version_str) + { + CHIAKI_LOGE(session->log, "Failed to get version for target, probably invalid target value"); + session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; + return CHIAKI_ERR_INVALID_DATA; + } char buf[512]; int request_len = snprintf(buf, sizeof(buf), session_request_fmt, @@ -698,7 +704,7 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget { CHIAKI_SOCKET_CLOSE(session_sock); session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; - return false; + return CHIAKI_ERR_UNKNOWN; } CHIAKI_LOGI(session->log, "Sending session request"); @@ -710,7 +716,7 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget CHIAKI_LOGE(session->log, "Failed to send session request"); CHIAKI_SOCKET_CLOSE(session_sock); session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; - return false; + return CHIAKI_ERR_NETWORK; } size_t header_size; @@ -731,7 +737,7 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; } CHIAKI_SOCKET_CLOSE(session_sock); - return false; + return CHIAKI_ERR_NETWORK; } ChiakiHttpResponse http_response; @@ -743,7 +749,7 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget CHIAKI_LOGE(session->log, "Failed to parse session request response"); CHIAKI_SOCKET_CLOSE(session_sock); session->quit_reason = CHIAKI_QUIT_REASON_SESSION_REQUEST_UNKNOWN; - return false; + return CHIAKI_ERR_NETWORK; } SessionResponse response; @@ -802,7 +808,7 @@ static bool session_thread_request_session(ChiakiSession *session, ChiakiTarget chiaki_http_response_fini(&http_response); CHIAKI_SOCKET_CLOSE(session_sock); - return response.success; + return response.success ? CHIAKI_ERR_SUCCESS : CHIAKI_ERR_UNKNOWN; } CHIAKI_EXPORT ChiakiErrorCode chiaki_session_goto_bed(ChiakiSession *session)