From 41c27139a05f62304e1a9bd93f7e55ee3abbb29d Mon Sep 17 00:00:00 2001 From: dijunkun Date: Fri, 20 Jun 2025 17:50:04 +0800 Subject: [PATCH] [feat] password modification supported --- src/single_window/local_peer_window.cpp | 18 ++++++-- src/single_window/remote_peer_window.cpp | 4 +- src/single_window/render.cpp | 48 ++++++++++++++-------- src/single_window/render.h | 6 +-- src/single_window/render_callback_func.cpp | 16 +++++--- src/single_window/setting_window.cpp | 1 - thirdparty/minirtc | 2 +- 7 files changed, 62 insertions(+), 33 deletions(-) diff --git a/src/single_window/local_peer_window.cpp b/src/single_window/local_peer_window.cpp index 6d3c200..baca1b0 100644 --- a/src/single_window/local_peer_window.cpp +++ b/src/single_window/local_peer_window.cpp @@ -174,10 +174,8 @@ int Render::LocalWindow() { regenerate_password_ ? ICON_FA_SPINNER : ICON_FA_ARROWS_ROTATE, ImVec2(22, 38))) { regenerate_password_ = true; - password_inited_ = false; regenerate_password_start_time_ = ImGui::GetTime(); LeaveConnection(peer_, client_id_); - is_create_connection_ = false; } if (ImGui::GetTime() - regenerate_password_start_time_ > 0.3f) { regenerate_password_ = false; @@ -259,8 +257,22 @@ int Render::LocalWindow() { focus_on_input_widget_ = true; } else { show_reset_password_window_ = false; + memset(&password_saved_, 0, sizeof(password_saved_)); + strncpy(password_saved_, new_password_, + sizeof(password_saved_) - 1); + password_saved_[sizeof(password_saved_) - 1] = '\0'; + + std::string client_id_with_password = + std::string(client_id_) + "@" + password_saved_; + strncpy(client_id_with_password_, client_id_with_password.c_str(), + sizeof(client_id_with_password_) - 1); + client_id_with_password_[sizeof(client_id_with_password_) - 1] = + '\0'; + + SaveSettingsIntoCacheFile(); + LeaveConnection(peer_, client_id_); - is_create_connection_ = false; + DestroyPeer(&peer_); focus_on_input_widget_ = true; } } diff --git a/src/single_window/remote_peer_window.cpp b/src/single_window/remote_peer_window.cpp index 4fd3c95..472991f 100644 --- a/src/single_window/remote_peer_window.cpp +++ b/src/single_window/remote_peer_window.cpp @@ -165,7 +165,9 @@ int Render::ConnectTo(const std::string &remote_id, const char *password, sizeof(props->remote_password_) - 1); props->remote_password_[sizeof(props->remote_password_) - 1] = '\0'; } - ret = JoinConnection(props->peer_, remote_id.c_str(), password); + + std::string remote_id_with_pwd = remote_id + "@" + password; + ret = JoinConnection(props->peer_, remote_id_with_pwd.c_str()); if (0 == ret) { props->rejoin_ = false; } else { diff --git a/src/single_window/render.cpp b/src/single_window/render.cpp index cf0aca3..b6cead8 100644 --- a/src/single_window/render.cpp +++ b/src/single_window/render.cpp @@ -177,10 +177,10 @@ int Render::SaveSettingsIntoCacheFile() { return -1; } - memset(&cd_cache_.client_id, 0, sizeof(cd_cache_.client_id)); - memcpy(cd_cache_.client_id, client_id_, sizeof(client_id_)); - memset(&cd_cache_.password, 0, sizeof(cd_cache_.password)); - memcpy(cd_cache_.password, password_saved_, sizeof(password_saved_)); + memset(&cd_cache_.client_id_with_password, 0, + sizeof(cd_cache_.client_id_with_password)); + memcpy(cd_cache_.client_id_with_password, client_id_with_password_, + sizeof(client_id_with_password_)); memcpy(&cd_cache_.language, &language_button_value_, sizeof(language_button_value_)); memcpy(&cd_cache_.video_quality, &video_quality_button_value_, @@ -246,11 +246,28 @@ int Render::LoadSettingsFromCacheFile() { cd_cache_file.close(); cd_cache_mutex_.unlock(); - memset(&client_id_, 0, sizeof(client_id_)); - memcpy(client_id_, cd_cache_.client_id, sizeof(client_id_)); - memcpy(password_saved_, cd_cache_.password, sizeof(password_saved_)); - if (0 != strcmp(password_saved_, "") && 7 == sizeof(password_saved_)) { - password_inited_ = true; + memset(&client_id_with_password_, 0, sizeof(client_id_with_password_)); + memcpy(client_id_with_password_, cd_cache_.client_id_with_password, + sizeof(client_id_with_password_)); + + if (strchr(client_id_with_password_, '@') != nullptr) { + std::string id, password; + const char* at_pos = strchr(client_id_with_password_, '@'); + if (at_pos == nullptr) { + id = client_id_with_password_; + password.clear(); + } else { + id.assign(client_id_with_password_, at_pos - client_id_with_password_); + password = at_pos + 1; + } + + memset(&client_id_, 0, sizeof(client_id_)); + strncpy(client_id_, id.c_str(), sizeof(client_id_) - 1); + client_id_[sizeof(client_id_) - 1] = '\0'; + + memset(&password_saved_, 0, sizeof(password_saved_)); + strncpy(password_saved_, password.c_str(), sizeof(password_saved_) - 1); + password_saved_[sizeof(password_saved_) - 1] = '\0'; } memcpy(aes128_key_, cd_cache_.key, sizeof(cd_cache_.key)); @@ -461,7 +478,7 @@ int Render::CreateConnectionPeer() { params_.on_connection_status = OnConnectionStatusCb; params_.net_status_report = NetStatusReport; - params_.user_id = client_id_; + params_.user_id = client_id_with_password_; params_.user_data = this; peer_ = CreatePeer(¶ms_); @@ -937,6 +954,10 @@ void Render::InitializeMainWindow() { void Render::MainLoop() { while (!exit_) { + if (!peer_) { + CreateConnectionPeer(); + } + UpdateLabels(); ProcessSdlEvent(); HandleRecentConnections(); @@ -949,13 +970,6 @@ void Render::MainLoop() { UpdateInteractions(); - if (SignalStatus::SignalConnected == signal_status_ && - !is_create_connection_ && password_inited_) { - LOG_INFO("Connected with signal server, create p2p connection"); - is_create_connection_ = - CreateConnection(peer_, client_id_, password_saved_) ? false : true; - } - if (need_to_send_host_info_) { RemoteAction remote_action; remote_action.i.display_num = display_info_list_.size(); diff --git a/src/single_window/render.h b/src/single_window/render.h index 03a4493..304df7d 100644 --- a/src/single_window/render.h +++ b/src/single_window/render.h @@ -236,8 +236,7 @@ class Render { private: struct CDCache { - char client_id[10]; - char password[7]; + char client_id_with_password[17]; int language; int video_quality; int video_encode_format; @@ -364,11 +363,9 @@ class Render { bool password_validating_ = false; uint32_t password_validating_time_ = 0; bool show_settings_window_ = false; - bool is_create_connection_ = false; bool rejoin_ = false; bool local_id_copied_ = false; bool show_password_ = true; - bool password_inited_ = false; bool regenerate_password_ = false; bool show_about_window_ = false; bool show_connection_status_window_ = false; @@ -407,6 +404,7 @@ class Render { uint64_t last_frame_time_; char client_id_[10] = ""; char client_id_display_[12] = ""; + char client_id_with_password_[17] = ""; char password_saved_[7] = ""; int language_button_value_ = 0; int video_quality_button_value_ = 0; diff --git a/src/single_window/render_callback_func.cpp b/src/single_window/render_callback_func.cpp index 868672d..3d0c75f 100644 --- a/src/single_window/render_callback_func.cpp +++ b/src/single_window/render_callback_func.cpp @@ -474,7 +474,7 @@ void Render::NetStatusReport(const char *client_id, size_t client_id_size, return; } - if (strchr(client_id, '@') != nullptr) { + if (strchr(client_id, '@') != nullptr && strchr(user_id, '-') == nullptr) { std::string id, password; const char *at_pos = strchr(client_id, '@'); if (at_pos == nullptr) { @@ -485,8 +485,6 @@ void Render::NetStatusReport(const char *client_id, size_t client_id_size, password = at_pos + 1; } - LOG_ERROR("{}:{}", id, password); - memset(&render->client_id_, 0, sizeof(render->client_id_)); strncpy(render->client_id_, id.c_str(), sizeof(render->client_id_) - 1); render->client_id_[sizeof(render->client_id_) - 1] = '\0'; @@ -495,12 +493,18 @@ void Render::NetStatusReport(const char *client_id, size_t client_id_size, strncpy(render->password_saved_, password.c_str(), sizeof(render->password_saved_) - 1); render->password_saved_[sizeof(render->password_saved_) - 1] = '\0'; - LOG_INFO("Use client id [{}] and save id into cache file", client_id); + + memset(&render->client_id_with_password_, 0, + sizeof(render->client_id_with_password_)); + strncpy(render->client_id_with_password_, id.c_str(), + sizeof(render->client_id_with_password_) - 1); + render->client_id_with_password_[sizeof(render->client_id_with_password_) - + 1] = '\0'; + + LOG_INFO("Use client id [{}] and save id into cache file", id); render->SaveSettingsIntoCacheFile(); } - LOG_ERROR("{}", user_id); - std::string remote_id(user_id, user_id_size); if (render->client_properties_.find(remote_id) == render->client_properties_.end()) { diff --git a/src/single_window/setting_window.cpp b/src/single_window/setting_window.cpp index 42bb8d0..08dffde 100644 --- a/src/single_window/setting_window.cpp +++ b/src/single_window/setting_window.cpp @@ -237,7 +237,6 @@ int Render::SettingWindow() { if (!stream_window_inited_) { LOG_INFO("Recreate peer instance"); DestroyPeer(&peer_); - is_create_connection_ = false; CreateConnectionPeer(); } } diff --git a/thirdparty/minirtc b/thirdparty/minirtc index 4305587..3686dd0 160000 --- a/thirdparty/minirtc +++ b/thirdparty/minirtc @@ -1 +1 @@ -Subproject commit 43055872fa5c1b55096d607673693492df63c56f +Subproject commit 3686dd001983dc8c22cfa80eec74c01de3896e07