refactor windows specific session, file transfer and waiting for image (#7184)

* refactor windows specific session, file transfer and waiting for image

1. File transfer doesn't show directory until correct session id is ensured
2. Fix file transfer, caused by `pi.username = self.lc.read().unwrap().get_username(&pi);` in `handle_peer_info` override empty username and `get_active_username` doesn't return currect session username
* Fix home directory not change when session changed, or wrong home directory
* Fix show empty remote directory rather than error messagbox when current session is in login screen
3. Show `Connected, waiting for image` after user choose the same
   session id

Signed-off-by: 21pages <pages21@163.com>

* update translations

Signed-off-by: 21pages <pages21@163.com>

* Update connection.rs

---------

Signed-off-by: 21pages <pages21@163.com>
Co-authored-by: RustDesk <71636191+rustdesk@users.noreply.github.com>
This commit is contained in:
21pages 2024-02-19 10:32:13 +08:00 committed by GitHub
parent 0f44de7dc3
commit bf5abdb520
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 553 additions and 121 deletions

View File

@ -494,9 +494,9 @@ class FfiModel with ChangeNotifier {
Map<String, dynamic> evt, SessionID sessionId, String peerId) {
if (parent.target == null) return;
final dialogManager = parent.target!.dialogManager;
final sessions = evt['user_sessions'];
final title = translate('Multiple active user sessions found');
final text = translate('Please select the user you want to connect to');
final sessions = evt['windows_sessions'];
final title = translate('Multiple Windows sessions found');
final text = translate('Please select the session you want to connect to');
final type = "";
showWindowsSessionsDialog(

View File

@ -1150,6 +1150,7 @@ pub struct LoginConfigHandler {
pub adapter_luid: Option<i64>,
pub mark_unsupported: Vec<CodecFormat>,
pub selected_windows_session_id: Option<u32>,
pub peer_info: Option<PeerInfo>,
}
impl Deref for LoginConfigHandler {
@ -1518,6 +1519,7 @@ impl LoginConfigHandler {
}
let mut n = 0;
let mut msg = OptionMessage::new();
// Version 1.2.5 can remove this, and OptionMessage is not needed for file transfer
msg.support_windows_specific_session = BoolOption::Yes.into();
n += 1;

View File

@ -838,7 +838,7 @@ impl InvokeUiSession for FlutterHandler {
self.push_event(
"set_multiple_windows_session",
vec![(
"user_sessions",
"windows_sessions",
&serde_json::ser::to_string(&msg_vec).unwrap_or("".to_owned()),
)],
);

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -1,67 +1,254 @@
lazy_static::lazy_static! {
pub static ref T: std::collections::HashMap<&'static str, &'static str> =
[
("Status", ""),
("Your Desktop", ""),
("desk_tip", "Вашият работен плот може да бъде достъпен с този идентификационен код и парола."),
("Password", ""),
("Ready", ""),
("Established", ""),
("connecting_status", "Свързване с RustDesk мрежата..."),
("Enable service", ""),
("Start service", ""),
("Service is running", ""),
("Service is not running", ""),
("not_ready_status", "Не е в готовност. Моля проверете мрежова връзка"),
("Control Remote Desktop", ""),
("Transfer file", ""),
("Connect", ""),
("Recent sessions", ""),
("Address book", ""),
("Confirmation", ""),
("TCP tunneling", ""),
("Remove", ""),
("Refresh random password", ""),
("Set your own password", ""),
("Enable keyboard/mouse", ""),
("Enable clipboard", ""),
("Enable file transfer", ""),
("Enable TCP tunneling", ""),
("IP Whitelisting", ""),
("ID/Relay Server", "ID/Релейн сървър"),
("Import server config", ""),
("Export Server Config", ""),
("Import server configuration successfully", ""),
("Export server configuration successfully", ""),
("Invalid server configuration", ""),
("Clipboard is empty", ""),
("Stop service", ""),
("Change ID", ""),
("Your new ID", ""),
("length %min% to %max%", ""),
("starts with a letter", ""),
("allowed characters", ""),
("id_change_tip", "Само a-z, A-Z, 0-9 и _ (долна черта) символи са позволени. Първата буква трябва да е a-z, A-Z. С дължина мержу 6 и 16."),
("Website", ""),
("About", ""),
("Slogan_tip", "Направено от сърце в този хаотичен свят!"),
("Privacy Statement", ""),
("Mute", ""),
("Build Date", "Дата на изграждане"),
("Version", ""),
("Home", ""),
("Audio Input", "Аудио вход"),
("Enhancements", ""),
("Hardware Codec", "Хардуерен кодек"),
("Adaptive bitrate", ""),
("ID Server", "ID сървър"),
("Relay Server", "Релейн сървър"),
("API Server", "API сървър"),
("invalid_http", "трябва да започва с http:// или https://"),
("Invalid IP", ""),
("Invalid format", ""),
("server_not_support", "Все още не се поддържа от сървъра"),
("Not available", ""),
("Too frequent", ""),
("Cancel", ""),
("Skip", ""),
("Close", ""),
("Retry", ""),
("OK", ""),
("Password Required", "Изисква се парола"),
("Please enter your password", ""),
("Remember password", ""),
("Wrong Password", "Грешна парола"),
("Do you want to enter again?", ""),
("Connection Error", "Грешка при свързване"),
("Error", ""),
("Reset by the peer", ""),
("Connecting...", ""),
("Connection in progress. Please wait.", ""),
("Please try 1 minute later", ""),
("Login Error", "Грешка при вписване"),
("Successful", ""),
("Connected, waiting for image...", ""),
("Name", ""),
("Type", ""),
("Modified", ""),
("Size", ""),
("Show Hidden Files", "Показване на скрити файлове"),
("Receive", ""),
("Send", ""),
("Refresh File", "Опресняване на файла"),
("Local", ""),
("Remote", ""),
("Remote Computer", "Отдалечен компютър"),
("Local Computer", "Локален компютър"),
("Confirm Delete", "Потвърдете изтриването"),
("Delete", ""),
("Properties", ""),
("Multi Select", "Множествен избор"),
("Select All", "Избери всички"),
("Unselect All", "Деселектирай всички"),
("Empty Directory", "Празна директория"),
("Not an empty directory", ""),
("Are you sure you want to delete this file?", ""),
("Are you sure you want to delete this empty directory?", ""),
("Are you sure you want to delete the file of this directory?", ""),
("Do this for all conflicts", ""),
("This is irreversible!", ""),
("Deleting", ""),
("files", ""),
("Waiting", ""),
("Finished", ""),
("Speed", ""),
("Custom Image Quality", "Персонализирано качество на изображението"),
("Privacy mode", ""),
("Block user input", ""),
("Unblock user input", ""),
("Adjust Window", "Регулирай прозореца"),
("Original", ""),
("Shrink", ""),
("Stretch", ""),
("Scrollbar", ""),
("ScrollAuto", ""),
("Good image quality", ""),
("Balanced", ""),
("Optimize reaction time", ""),
("Custom", ""),
("Show remote cursor", ""),
("Show quality monitor", ""),
("Disable clipboard", ""),
("Lock after session end", ""),
("Insert", ""),
("Insert Lock", "Поставете ключ"),
("Refresh", ""),
("ID does not exist", ""),
("Failed to connect to rendezvous server", ""),
("Please try later", ""),
("Remote desktop is offline", ""),
("Key mismatch", ""),
("Timeout", ""),
("Failed to connect to relay server", ""),
("Failed to connect via rendezvous server", ""),
("Failed to connect via relay server", ""),
("Failed to make direct connection to remote desktop", ""),
("Set Password", "Задайте парола"),
("OS Password", "Парола на Операционната система"),
("install_tip", "Поради UAC, RustDesk в някои случай не може да работи правилно като отдалечена достъп. За да заобиколите UAC, моля, щракнете върху бутона по-долу, за да инсталирате RustDesk в системата."),
("Click to upgrade", ""),
("Click to download", ""),
("Click to update", ""),
("Configure", ""),
("config_acc", "За да управлявате вашия работен плот дистанционно, трябва да предоставите на RustDesk разрешения \"Достъпност\"."),
("config_screen", "In order to access your Desktop remotely, you need to grant RustDesk \"Screen Recording\" permissions."),
("Installing ...", ""),
("Install", ""),
("Installation", ""),
("Installation Path", "Инсталационен път"),
("Create start menu shortcuts", ""),
("Create desktop icon", ""),
("agreement_tip", "Стартирайки инсталацията, вие приемате лицензионното споразумение."),
("Accept and Install", "Приемете и инсталирайте"),
("End-user license agreement", ""),
("Generating ...", ""),
("Your installation is lower version.", ""),
("not_close_tcp_tip", "Не затваряйте този прозорец, докато използвате тунела"),
("Listening ...", ""),
("Remote Host", "Отдалечен хост"),
("Remote Port", "Отдалечен порт"),
("Action", ""),
("Add", ""),
("Local Port", "Локален порт"),
("Local Address", "Локален адрес"),
("Change Local Port", "Промяна на локалният порт"),
("setup_server_tip", "За по-бърза връзка, моля направете свой собствен сървър"),
("Too short, at least 6 characters.", ""),
("The confirmation is not identical.", ""),
("Permissions", ""),
("Accept", ""),
("Dismiss", ""),
("Disconnect", ""),
("Enable file copy and paste", ""),
("Connected", ""),
("Direct and encrypted connection", ""),
("Relayed and encrypted connection", ""),
("Direct and unencrypted connection", ""),
("Relayed and unencrypted connection", ""),
("Enter Remote ID", "Въведете дистанционно ID"),
("Enter your password", ""),
("Logging in...", ""),
("Enable RDP session sharing", ""),
("Auto Login", "Автоматично вписване (Валидно само ако зададете \"Заключване след края на сесията\")"),
("Enable direct IP access", ""),
("Rename", ""),
("Space", ""),
("Create desktop shortcut", ""),
("Change Path", "Промяна на пътя"),
("Create Folder", "Създай папка"),
("Please enter the folder name", ""),
("Fix it", ""),
("Warning", ""),
("Login screen using Wayland is not supported", ""),
("Reboot required", ""),
("Unsupported display server", ""),
("x11 expected", ""),
("Port", ""),
("Settings", ""),
("Username", ""),
("Invalid port", ""),
("Closed manually by the peer", ""),
("Enable remote configuration modification", ""),
("Run without install", ""),
("Connect via relay", ""),
("Always connect via relay", ""),
("whitelist_tip", "Само IP от белия списък има достъп до мен"),
("Login", ""),
("Verify", ""),
("Remember me", ""),
("Trust this device", ""),
("Verification code", ""),
("verification_tip", "На регистрирания имейл адрес е изпратен код за потвърждение, въведете кода за потвърждение, за да продължите да влизате."),
("Logout", ""),
("Tags", ""),
("Search ID", ""),
("whitelist_sep", "Разделени със запетая, точка и запетая, интервали или нов ред"),
("Add ID", ""),
("Add Tag", "Добавяне на етикет"),
("Unselect all tags", ""),
("Network error", ""),
("Username missed", ""),
("Password missed", ""),
("Wrong credentials", "Wrong username or password"),
("The verification code is incorrect or has expired", ""),
("Edit Tag", "Edit tag"),
("Forget Password", "Забравена парола"),
("Favorites", ""),
("Add to Favorites", "Добави към любими"),
("Remove from Favorites", "Премахване от любими"),
("Empty", ""),
("Invalid folder name", ""),
("Socks5 Proxy", "Socks5 прокси"),
("Hostname", ""),
("Discovered", ""),
("install_daemon_tip", "За стартиране с компютъра трябва да инсталирате системна услуга."),
("Remote ID", ""),
("Paste", ""),
("Paste here?", ""),
("Are you sure to close the connection?", "Сигурни ли сте, че искате да затворите връзката?"),
("Download new version", ""),
("Touch mode", ""),
("Mouse mode", ""),
("One-Finger Tap", "Докосване с един пръст"),
("Left Mouse", "Ляв бутон на мишката"),
("One-Long Tap", "Едно дълго докосване"),
@ -76,13 +263,23 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Canvas Move", "Преместване на платното"),
("Pinch to Zoom", "Щипнете, за да увеличите"),
("Canvas Zoom", "Увеличение на платното"),
("Reset canvas", ""),
("No permission of file transfer", ""),
("Note", ""),
("Connection", ""),
("Share Screen", "Сподели екран"),
("Chat", ""),
("Total", ""),
("items", ""),
("Selected", ""),
("Screen Capture", "Заснемане на екрана"),
("Input Control", "Контрол на въвеждане"),
("Audio Capture", "Аудио записване"),
("File Connection", "Файлова връзка"),
("Screen Connection", "Свързване на екрана"),
("Do you accept?", ""),
("Open System Setting", "Отворете системната настройка"),
("How to get Android input permission?", ""),
("android_input_permission_tip1", "За да може отдалечено устройство да управлява вашето Android устройство чрез мишка или докосване, трябва да разрешите на RustDesk да използва услугата \"Достъпност\"."),
("android_input_permission_tip2", "Моля, отидете на следващата страница с системни настройки, намерете и въведете [Installed Services], включете услугата [RustDesk Input]."),
("android_new_connection_tip", "Получена е нова заявка за контрол, която иска да контролира вашето текущо устройство."),
@ -91,15 +288,46 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("android_version_audio_tip", "Текущата версия на Android не поддържа аудио заснемане, моля, актуализирайте устройството с Android 10 или по-нова версия."),
("android_start_service_tip", "Докоснете [Start service] или активирайте разрешение [Screen Capture], за да стартирате услугата за споделяне на екрана."),
("android_permission_may_not_change_tip", "Разрешенията за установени връзки може да не се променят незабавно, докато не се свържете отново."),
("doc_mac_permission", "https://rustdesk.com/docs/en/manual/mac/#enable-permissions"),
("Account", ""),
("Overwrite", ""),
("This file exists, skip or overwrite this file?", ""),
("Quit", ""),
("Help", ""),
("Failed", ""),
("Succeeded", ""),
("Someone turns on privacy mode, exit", ""),
("Unsupported", ""),
("Peer denied", ""),
("Please install plugins", ""),
("Peer exit", ""),
("Failed to turn off", ""),
("Turned off", ""),
("Language", ""),
("Keep RustDesk background service", ""),
("Ignore Battery Optimizations", "Игнорирай оптимизациите на батерията"),
("android_open_battery_optimizations_tip", "Ако искате да деактивирате тази функция, моля, отидете на следващата страница с настройки на приложението RustDesk, намерете и въведете [Battery], премахнете отметката от [Unrestricted]"),
("Start on boot", ""),
("Start the screen sharing service on boot, requires special permissions", ""),
("Connection not allowed", ""),
("Legacy mode", ""),
("Map mode", ""),
("Translate mode", ""),
("Use permanent password", ""),
("Use both passwords", ""),
("Set permanent password", ""),
("Enable remote restart", ""),
("Restart remote device", ""),
("Are you sure you want to restart", ""),
("Restarting remote device", ""),
("remote_restarting_tip", "Отдалеченото устройство се рестартира, моля, затворете това съобщение и се свържете отново с постоянна парола след известно време"),
("Copied", ""),
("Exit Fullscreen", "Изход от цял екран"),
("Fullscreen", ""),
("Mobile Actions", "Мобилни действия"),
("Select Monitor", "Изберете монитор"),
("Control Actions", "Контролни действия"),
("Display Settings", "Настройки на дисплея"),
("Ratio", ""),
("Image Quality", "Качество на изображението"),
("Scroll Style", "Стил на превъртане"),
("Show Toolbar", "Показване на лентата с инструменти"),
@ -108,51 +336,138 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Relay Connection", "Релейна връзка"),
("Secure Connection", "Защитена връзка"),
("Insecure Connection", "Незащитена връзка"),
("Scale original", ""),
("Scale adaptive", ""),
("General", ""),
("Security", ""),
("Theme", ""),
("Dark Theme", "Тъмна тема"),
("Light Theme", "Светла тема"),
("Dark", ""),
("Light", ""),
("Follow System", "Следвай системата"),
("Enable hardware codec", ""),
("Unlock Security Settings", "Отключи настройките за сигурност"),
("Enable audio", ""),
("Unlock Network Settings", "Отключи мрежовите настройки"),
("Server", ""),
("Direct IP Access", "Директен IP достъп"),
("Proxy", ""),
("Apply", ""),
("Disconnect all devices?", ""),
("Clear", ""),
("Audio Input Device", "Аудио входно устройство"),
("Use IP Whitelisting", "Използвайте бял списък с IP адреси"),
("Network", ""),
("Pin Toolbar", "Фиксиране на лентата с инструменти"),
("Unpin Toolbar", "Откачване на лентата с инструменти"),
("Recording", ""),
("Directory", ""),
("Automatically record incoming sessions", ""),
("Change", ""),
("Start session recording", ""),
("Stop session recording", ""),
("Enable recording session", ""),
("Enable LAN discovery", ""),
("Deny LAN discovery", ""),
("Write a message", ""),
("Prompt", ""),
("Please wait for confirmation of UAC...", ""),
("elevated_foreground_window_tip", "Текущият прозорец на отдалечения работен плот изисква по-високи привилегии за работа, така че временно не може да използва мишката и клавиатурата. Можете да поискате от отдалечения потребител да минимизира текущия прозорец или да щракнете върху бутона за повдигане в прозореца за управление на връзката. За да избегнете този проблем, се препоръчва да инсталирате софтуера на отдалеченото устройство."),
("Disconnected", ""),
("Other", ""),
("Confirm before closing multiple tabs", ""),
("Keyboard Settings", "Настройки на клавиатурата"),
("Full Access", "Пълен достъп"),
("Screen Share", "Споделяне на екрана"),
("Wayland requires Ubuntu 21.04 or higher version.", ""),
("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", ""),
("JumpLink", "Преглед"),
("Please Select the screen to be shared(Operate on the peer side).", "Моля, изберете екрана, който да бъде споделен (Работете от страна на партньора)."),
("Show RustDesk", ""),
("This PC", ""),
("or", ""),
("Continue with", ""),
("Elevate", ""),
("Zoom cursor", ""),
("Accept sessions via password", ""),
("Accept sessions via click", ""),
("Accept sessions via both", ""),
("Please wait for the remote side to accept your session request...", ""),
("One-time Password", "Еднократна парола"),
("Use one-time password", ""),
("One-time password length", ""),
("Request access to your device", ""),
("Hide connection management window", ""),
("hide_cm_tip", "Разрешете скриването само ако приемате сесии чрез парола и използвате постоянна парола"),
("wayland_experiment_tip", "Wayland support is in experimental stage, please use X11 if you require unattended access."),
("Right click to select tabs", ""),
("Skipped", ""),
("Add to address book", ""),
("Group", ""),
("Search", ""),
("Closed manually by web console", ""),
("Local keyboard type", ""),
("Select local keyboard type", ""),
("software_render_tip", "Ако използвате графична карта Nvidia под Linux и отдалеченият прозорец се затваря веднага след свързване, превключването към драйвера Nouveau с отворен код и изборът да използвате софтуерно изобразяване може да помогне. Изисква се рестартиране на софтуера."),
("Always use software rendering", ""),
("config_input", "За да контролирате отдалечен работен плот с клавиатура, трябва да предоставите на RustDesk разрешения \"Input Monitoring\"."),
("config_microphone", "За да говорите дистанционно, трябва да предоставите на RustDesk разрешения \"Запис на звук\"."),
("request_elevation_tip", "Можете също така да поискате повишаване на привилегии, ако има някой от отдалечената страна."),
("Wait", ""),
("Elevation Error", "Грешка при повишаване на привилегии"),
("Ask the remote user for authentication", ""),
("Choose this if the remote account is administrator", ""),
("Transmit the username and password of administrator", ""),
("still_click_uac_tip", "Все още изисква отдалеченият потребител да щракне върху OK в прозореца на UAC при стартиранят RustDesk."),
("Request Elevation", "Поискайте повишаване на привилегии"),
("wait_accept_uac_tip", "Моля, изчакайте отдалеченият потребител да приеме диалоговия прозорец на UAC."),
("Elevate successfully", ""),
("uppercase", ""),
("lowercase", ""),
("digit", ""),
("special character", ""),
("length>=8", ""),
("Weak", ""),
("Medium", ""),
("Strong", ""),
("Switch Sides", "Сменете страните"),
("Please confirm if you want to share your desktop?", ""),
("Display", ""),
("Default View Style", "Стил на изглед по подразбиране"),
("Default Scroll Style", "Стил на превъртане по подразбиране"),
("Default Image Quality", "Качество на изображението по подразбиране"),
("Default Codec", "Кодек по подразбиране"),
("Bitrate", ""),
("FPS", ""),
("Auto", ""),
("Other Default Options", "Други опции по подразбиране"),
("Voice call", ""),
("Text chat", ""),
("Stop voice call", ""),
("relay_hint_tip", "Може да не е възможно да се свържете директно; можете да опитате да се свържете чрез реле. Освен това, ако искате да използвате реле при първия си опит, добавете наставка \"/r\" към идентификатора или да изберете опцията \"Винаги свързване чрез реле\" в картата на последните сесии, ако съществува."),
("Reconnect", ""),
("Codec", ""),
("Resolution", ""),
("No transfers in progress", ""),
("Set one-time password length", ""),
("install_cert_tip", "Инсталирайте сертификат на RustDesk"),
("confirm_install_cert_tip", "Това е сертификат за тестване на RustDesk, на който може да се вярва. Сертификатът ще се използва за доверие и инсталиране на драйвери на RustDesk, когато е необходимо."),
("RDP Settings", "RDP настройки"),
("Sort by", ""),
("New Connection", "Ново свързване"),
("Restore", ""),
("Minimize", ""),
("Maximize", ""),
("Your Device", "Вашето устройство"),
("empty_recent_tip", "Ами сега, няма скорошни сесии!\nВреме е да планирате нова."),
("empty_favorite_tip", "Все още нямате любими връстници?\nНека намерим някой, с когото да се свържете, и да го добавим към вашите любими!"),
("empty_lan_tip", "О, не, изглежда, че все още не сме открили връстници."),
("empty_address_book_tip", "Изглежда, че в момента няма изброени връстници във вашата адресна книга."),
("eg: admin", ""),
("Empty Username", "Празно потребителско име"),
("Empty Password", "Празна парола"),
("Me", ""),
("identical_file_tip", "Този файл е идентичен с този на партньора."),
("show_monitors_tip", "Показване на мониторите в лентата с инструменти"),
("View Mode", "Режим на преглед"),
@ -167,21 +482,49 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("xorg_not_found_text_tip", "Моля, инсталирайте Xorg"),
("no_desktop_title_tip", "Няма наличен работен плот"),
("no_desktop_text_tip", "Моля, инсталирайте работен плот GNOME"),
("No need to elevate", ""),
("System Sound", "Системен звук"),
("Default", ""),
("New RDP", ""),
("Fingerprint", ""),
("Copy Fingerprint", "Копиране на пръстов отпечатък"),
("no fingerprints", "Няма пръстови отпечатъци"),
("Select a peer", ""),
("Select peers", ""),
("Plugins", ""),
("Uninstall", ""),
("Update", ""),
("Enable", ""),
("Disable", ""),
("Options", ""),
("resolution_original_tip", "Оригинална резолюция"),
("resolution_fit_local_tip", "Напасване към локална разделителна способност"),
("resolution_custom_tip", "Персонализирана разделителна способност"),
("Collapse toolbar", ""),
("Accept and Elevate", "Приемете и повишаване на привилегии"),
("accept_and_elevate_btn_tooltip", "Приемете връзката и повишете UAC разрешенията."),
("clipboard_wait_response_timeout_tip", "Времето за изчакване на отговор за копиране изтече."),
("Incoming connection", ""),
("Outgoing connection", ""),
("Exit", ""),
("Open", ""),
("logout_tip", "Сигурни ли сте, че искате да излезете?"),
("Service", ""),
("Start", ""),
("Stop", ""),
("exceed_max_devices", "Достигнахте максималния брой управлявани устройства."),
("Sync with recent sessions", ""),
("Sort tags", ""),
("Open connection in new tab", ""),
("Move tab to new window", ""),
("Can not be empty", ""),
("Already exists", ""),
("Change Password", "Промяна на паролата"),
("Refresh Password", "Обнови паролата"),
("ID", ""),
("Grid View", "Мрежов изглед"),
("List View", "Списъчен изглед"),
("Select", ""),
("Toggle Tags", "Превключване на етикети"),
("pull_ab_failed_tip", "Неуспешно опресняване на адресната книга"),
("push_ab_failed_tip", "Неуспешно синхронизиране на адресната книга със сървъра"),
@ -190,30 +533,60 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Primary Color", "Основен цвят"),
("HSV Color", "HSV цвят"),
("Installation Successful!", "Успешна инсталация!"),
("Installation failed!", ""),
("Reverse mouse wheel", ""),
("{} sessions", ""),
("scam_title", "Възможно е да сте ИЗМАМЕНИ!"),
("scam_text1", "Ако разговаряте по телефона с някой, когото НЕ ПОЗНАВАТЕ и НЯМАТЕ ДОВЕРИЕ, който ви е помолил да използвате RustDesk и да стартирате услугата, не продължавайте и затворете незабавно."),
("scam_text2", "Те вероятно са измамник, който се опитва да открадне вашите пари или друга лична информация."),
("Don't show again", ""),
("I Agree", ""),
("Decline", ""),
("Timeout in minutes", ""),
("auto_disconnect_option_tip", "Автоматично затваряне на входящите сесии при неактивност на потребителя"),
("Connection failed due to inactivity", "Автоматично прекъсване на връзката поради неактивност"),
("Check for software update on startup", ""),
("upgrade_rustdesk_server_pro_to_{}_tip", "Моля обновете RustDesk Server Pro на версия {} или по-нова!"),
("pull_group_failed_tip", "Неуспешно опресняване на групата"),
("doc_fix_wayland", "https://rustdesk.com/docs/en/manual/linux/#x11-required"),
("Filter by intersection", ""),
("Remove wallpaper during incoming sessions", ""),
("Test", ""),
("display_is_plugged_out_msg", "Дисплеят е изключен, превключете на първия монитор."),
("No displays", ""),
("elevated_switch_display_msg", "Превключете към основния монитор, защото множество монитори не се поддържат в потребителски режим с повишени права."),
("Open in new window", ""),
("Show displays as individual windows", ""),
("Use all my displays for the remote session", ""),
("selinux_tip", "SELinux е активиран на вашето устройство, което може да попречи на RustDesk да работи правилно като контролирана страна."),
("Change view", ""),
("Big tiles", ""),
("Small tiles", ""),
("List", ""),
("Virtual display", ""),
("Plug out all", ""),
("True color (4:4:4)", ""),
("Enable blocking user input", ""),
("id_input_tip", "Можете да въведете ID, директен IP адрес или домейн с порт (<domain>:<port>).\nАко искате да получите достъп до устройство на друг сървър, моля, добавете адреса на сървъра (<id>@<server_address >?key=<key_value>), например\n9123456234@192.168.16.1:21117?key=5Qbwsde3unUcJBtrx9ZkvUmwFNoExHzpryHuPUdqlWM=.\nАко искате да получите достъп до устройство на обществен сървър, моля, въведете \"<id>@public\" , ключът не е необходим за публичен сървър"),
("privacy_mode_impl_mag_tip", "Режим 1"),
("privacy_mode_impl_virtual_display_tip", "Режим 2"),
("Enter privacy mode", ""),
("Exit privacy mode", ""),
("idd_not_support_under_win10_2004_tip", "Индиректен драйвер за дисплей не се поддържа. Изисква се Windows 10, версия 2004 или по-нова."),
("switch_display_elevated_connections_tip", "Превключването към неосновен дисплей не се поддържа в режим на потребител с повишени права, когато има множество връзки. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."),
("input_source_1_tip", "Входен източник 1"),
("input_source_2_tip", "Входен източник 2"),
("capture_display_elevated_connections_tip", "Заснемането на множество дисплеи не се поддържа в потребителския режим с повишени права. Моля, опитайте отново след инсталация, ако искате да контролирате няколко дисплея."),
("Swap control-command key", ""),
("swap-left-right-mouse", "Разменете левия и десния бутон на мишката"),
("2FA code", "Код за Двуфакторна удостоверяване"),
("More", ""),
("enable-2fa-title", "Активиране на двуфакторно удостоверяване"),
("enable-2fa-desc", "Моля, настройте вашия удостоверител сега. Можете да използвате приложение за удостоверяване като Authy, Microsoft или Google Authenticator на вашия телефон или настолен компютър.\n\nСканирайте QR кода с вашето приложение и въведете кода, който приложението ви показва, за да активирате двуфакторно удостоверяване."),
("wrong-2fa-code", "е може да се потвърди кодът. Проверете дали настройките за код и локалното време са правилни"),
("enter-2fa-title", "Двуфакторно удостоверяване"),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "双重认证"),
("Email verification code must be 6 characters.", "Email 验证码必须是 6 个字符。"),
("2FA code must be 6 digits.", "双重认证代码必须是 6 位数字。"),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", "发现多个 Windows 会话"),
("Please select the session you want to connect to", "请选择您要连接的会话"),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Dvoufaktorová autentizace"),
("Email verification code must be 6 characters.", "E-mailový ověřovací kód musí mít 6 znaků."),
("2FA code must be 6 digits.", "Kód 2FA musí mít 6 číslic."),
("Multiple active user sessions found", "Bylo nalezeno několik aktivních uživatelských relací"),
("Please select the user you want to connect to", "Vyberte prosím uživatele, ke kterému se chcete připojit"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Zwei-Faktor-Authentifizierung"),
("Email verification code must be 6 characters.", "Der E-Mail-Verifizierungscode muss aus 6 Zeichen bestehen."),
("2FA code must be 6 digits.", "Der 2FA-Code muss 6 Ziffern haben."),
("Multiple active user sessions found", "Mehrere aktive Benutzersitzungen gefunden"),
("Please select the user you want to connect to", "Bitte wählen Sie den Benutzer, mit dem Sie sich verbinden möchten"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Autenticación en dos pasos"),
("Email verification code must be 6 characters.", "El código de verificación por mail debe tener 6 caracteres"),
("2FA code must be 6 digits.", "El cóidigo 2FA debe tener 6 dígitos"),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "احراز هویت دو مرحله ای"),
("Email verification code must be 6 characters.", "کد تأیید ایمیل باید 6 کاراکتر باشد"),
("2FA code must be 6 digits.", "کد احراز هویت دو مرحله ای باید 6 رقم باشد"),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Autenticazione a due fattori"),
("Email verification code must be 6 characters.", "Il codice di verifica email deve contenere 6 caratteri."),
("2FA code must be 6 digits.", "Il codice 2FA deve essere composto da 6 cifre."),
("Multiple active user sessions found", "Rilevate sessioni utente attive multiple"),
("Please select the user you want to connect to", "Seleziona l'utente a cui connetterti"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Divu faktoru autentifikācija"),
("Email verification code must be 6 characters.", "E-pasta verifikācijas kodam jābūt ar 6 rakstzīmēm."),
("2FA code must be 6 digits.", "2FA kodam ir jābūt ar 6 cipariem."),
("Multiple active user sessions found", "Atrastas vairākas aktīvas lietotāju sesijas"),
("Please select the user you want to connect to", "Lūdzu, atlasiet lietotāju, ar kuru vēlaties izveidot savienojumu"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -292,6 +292,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("Overwrite", "Overschrijven"),
("This file exists, skip or overwrite this file?", "Dit bestand bestaat reeds, overslaan of overschrijven?"),
("Quit", "Afsluiten"),
("Help", ""),
("Failed", "Mislukt"),
("Succeeded", "Geslaagd"),
("Someone turns on privacy mode, exit", "Iemand schakelt privacymodus in, afsluiten"),
@ -585,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "geef-2fa-titel in"),
("Email verification code must be 6 characters.", "E-mailverificatiecode moet 6 tekens lang zijn."),
("2FA code must be 6 digits.", "2FA-code moet 6 cijfers lang zijn."),
("Multiple active user sessions found", "Meerdere actieve gebruikerssessies gevonden"),
("Please select the user you want to connect to", "Selecteer de gebruiker waarmee je verbinding wilt maken"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Autoryzacja dwuskładnikowa"),
("Email verification code must be 6 characters.", "Kod weryfikacyjny wysłany e-mailem musi mieć 6 znaków."),
("2FA code must be 6 digits.", "Kod 2FA musi zawierać 6 cyfr."),
("Multiple active user sessions found", "Znaleziono wiele aktywnych sesji użytkownika"),
("Please select the user you want to connect to", "Wybierz użytkownika, z którym chcesz się połączyć"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Двухфакторная аутентификация"),
("Email verification code must be 6 characters.", "Код подтверждения электронной почты должен состоять из 6 символов."),
("2FA code must be 6 digits.", "Код двухфакторной аутентификации должен состоять из 6 цифр."),
("Multiple active user sessions found", "Обнаружено несколько активных пользовательских сеансов"),
("Please select the user you want to connect to", "Выберите пользователя, к которому хотите подключиться"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "Dvojfaktorové overenie"),
("Email verification code must be 6 characters.", "Overovací kód e-mailu musí mať 6 znakov."),
("2FA code must be 6 digits.", "Kód 2FA musí obsahovať 6 číslic."),
("Multiple active user sessions found", "Našlo sa viacero aktívnych používateľských relácií"),
("Please select the user you want to connect to", "Vyberte používateľa ku ktorému sa chcete pripojiť"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", "二步驟驗證"),
("Email verification code must be 6 characters.", "Email 驗證碼必須是 6 個字元。"),
("2FA code must be 6 digits.", "二步驟驗證碼必須是 6 位數字。"),
("Multiple active user sessions found", "發現多個使用者工作階段"),
("Please select the user you want to connect to", "請選擇您想要連接的使用者"),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -586,7 +586,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("enter-2fa-title", ""),
("Email verification code must be 6 characters.", ""),
("2FA code must be 6 digits.", ""),
("Multiple active user sessions found", ""),
("Please select the user you want to connect to", ""),
("Multiple Windows sessions found", ""),
("Please select the session you want to connect to", ""),
].iter().cloned().collect();
}

View File

@ -746,6 +746,10 @@ pub fn get_current_process_session_id() -> Option<u32> {
}
pub fn get_active_username() -> String {
// get_active_user will give console username higher priority
if let Some(name) = get_current_session_username() {
return name;
}
if !is_root() {
return crate::username();
}
@ -767,6 +771,14 @@ pub fn get_active_username() -> String {
.to_owned()
}
fn get_current_session_username() -> Option<String> {
let Some(sid) = get_current_process_session_id() else {
log::error!("get_current_process_session_id failed");
return None;
};
Some(get_session_username(sid))
}
fn get_session_username(session_id: u32) -> String {
extern "C" {
fn get_session_user_info(path: *mut u16, n: u32, rdp: bool, session_id: u32) -> u32;
@ -799,22 +811,24 @@ pub fn get_available_sessions(name: bool) -> Vec<WindowsSession> {
};
let mut v: Vec<WindowsSession> = vec![];
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-wtsgetactiveconsolesessionid
let physical_console_session_id = unsafe { get_current_session(FALSE) };
let physical_console_username = get_session_username(physical_console_session_id);
let physical_console_name = if name {
if physical_console_username.is_empty() {
"Console".to_owned()
let physical_console_sid = unsafe { get_current_session(FALSE) };
if physical_console_sid != u32::MAX {
let physical_console_name = if name {
let physical_console_username = get_session_username(physical_console_sid);
if physical_console_username.is_empty() {
"Console".to_owned()
} else {
format!("Console:{physical_console_username}")
}
} else {
format!("Console:{physical_console_username}")
}
} else {
"".to_owned()
};
v.push(WindowsSession {
sid: physical_console_session_id,
name: physical_console_name,
..Default::default()
});
"".to_owned()
};
v.push(WindowsSession {
sid: physical_console_sid,
name: physical_console_name,
..Default::default()
});
}
// https://learn.microsoft.com/en-us/previous-versions//cc722458(v=technet.10)?redirectedfrom=MSDN
for type_session_id in station_session_id_array.split(",") {
let split: Vec<_> = type_session_id.split(":").collect();
@ -867,11 +881,9 @@ pub fn get_active_user_home() -> Option<PathBuf> {
}
pub fn is_prelogin() -> bool {
let Some(sid) = get_current_process_session_id() else {
log::error!("get_current_process_session_id failed");
let Some(username) = get_current_session_username() else {
return false;
};
let username = get_session_username(sid);
username.is_empty() || username == "SYSTEM"
}
@ -2565,6 +2577,9 @@ impl WallPaperRemover {
// https://superuser.com/questions/1218413/write-to-current-users-registry-through-a-different-admin-account
let (hkcu, sid) = if is_root() {
let username = get_active_username();
if username.is_empty() {
bail!("failed to get username");
}
let sid = get_sid_of_user(&username)?;
log::info!("username: {username}, sid: {sid}");
(RegKey::predef(HKEY_USERS), format!("{}\\", sid))

View File

@ -237,8 +237,8 @@ pub struct Connection {
file_remove_log_control: FileRemoveLogControl,
#[cfg(feature = "gpucodec")]
supported_encoding_flag: (bool, Option<bool>),
need_sub_remote_service: bool,
remote_service_subed: bool,
services_subed: bool,
delayed_read_dir: Option<(String, bool)>,
}
impl ConnInner {
@ -386,8 +386,8 @@ impl Connection {
file_remove_log_control: FileRemoveLogControl::new(id),
#[cfg(feature = "gpucodec")]
supported_encoding_flag: (false, None),
need_sub_remote_service: false,
remote_service_subed: false,
services_subed: false,
delayed_read_dir: None,
};
let addr = hbb_common::try_into_v4(addr);
if !conn.on_open(addr).await {
@ -1194,9 +1194,9 @@ impl Connection {
.into();
let mut sub_service = false;
let mut delay_sub_service = false;
let mut wait_session_id_confirm = false;
#[cfg(windows)]
self.handle_windows_specific_session(&mut pi, &mut delay_sub_service);
self.handle_windows_specific_session(&mut pi, &mut wait_session_id_confirm);
if self.file_transfer.is_some() {
res.set_peer_info(pi);
} else {
@ -1256,18 +1256,22 @@ impl Connection {
} else {
""
};
self.read_dir(dir, show_hidden);
if !wait_session_id_confirm {
self.read_dir(dir, show_hidden);
} else {
self.delayed_read_dir = Some((dir.to_owned(), show_hidden));
}
} else if sub_service {
self.need_sub_remote_service = true;
if !delay_sub_service {
self.check_sub_remote_services();
if !wait_session_id_confirm {
self.try_sub_services();
}
}
}
fn check_sub_remote_services(&mut self) {
if self.need_sub_remote_service && !self.remote_service_subed {
self.remote_service_subed = true;
fn try_sub_services(&mut self) {
let is_remote = self.file_transfer.is_none() && self.port_forward_socket.is_none();
if is_remote && !self.services_subed {
self.services_subed = true;
if let Some(s) = self.server.upgrade() {
let mut noperms = Vec::new();
if !self.peer_keyboard_enabled() && !self.show_remote_cursor {
@ -1293,7 +1297,11 @@ impl Connection {
}
#[cfg(windows)]
fn handle_windows_specific_session(&mut self, pi: &mut PeerInfo, delay_sub_service: &mut bool) {
fn handle_windows_specific_session(
&mut self,
pi: &mut PeerInfo,
wait_session_id_confirm: &mut bool,
) {
let sessions = crate::platform::get_available_sessions(true);
let current_sid = crate::platform::get_current_process_session_id().unwrap_or_default();
if crate::platform::is_installed()
@ -1301,7 +1309,8 @@ impl Connection {
&& raii::AuthedConnID::remote_and_file_conn_count() == 1
&& sessions.len() > 1
&& current_sid != 0
&& self.lr.option.support_windows_specific_session == BoolOption::Yes.into()
&& (get_version_number(&self.lr.version) > get_version_number("1.2.4")
|| self.lr.option.support_windows_specific_session == BoolOption::Yes.into())
{
pi.windows_sessions = Some(WindowsSessions {
sessions,
@ -1309,7 +1318,7 @@ impl Connection {
..Default::default()
})
.into();
*delay_sub_service = true;
*wait_session_id_confirm = true;
}
}
@ -1976,6 +1985,12 @@ impl Connection {
}
Some(message::Union::FileAction(fa)) => {
if self.file_transfer.is_some() {
if self.delayed_read_dir.is_some() {
if let Some(file_action::Union::ReadDir(rd)) = fa.union {
self.delayed_read_dir = Some((rd.path, rd.include_hidden));
}
return true;
}
match fa.union {
Some(file_action::Union::ReadDir(rd)) => {
self.read_dir(&rd.path, rd.include_hidden);
@ -2284,7 +2299,13 @@ impl Connection {
});
return false;
}
self.check_sub_remote_services();
if self.file_transfer.is_some() {
if let Some((dir, show_hidden)) = self.delayed_read_dir.take() {
self.read_dir(&dir, show_hidden);
}
} else {
self.try_sub_services();
}
}
_ => {}
},

View File

@ -460,7 +460,7 @@ function awake() {
class MultipleSessionComponent extends Reactor.Component {
this var sessions = [];
this var messageText = translate("Please select the user you want to connect to");
this var messageText = translate("Please select the session you want to connect to");
function this(params) {
if (params && params.sessions) {

View File

@ -530,7 +530,7 @@ handler.updateDisplays = function(v) {
handler.setMultipleWindowsSession = function(sessions) {
// It will be covered by other message box if the timer is not used,
self.timer(1000ms, function() {
msgbox("multiple-sessions-nocancel", translate("Multiple active user sessions found"), <MultipleSessionComponent sessions={sessions} />, "", function(res) {
msgbox("multiple-sessions-nocancel", translate("Multiple Windows sessions found"), <MultipleSessionComponent sessions={sessions} />, "", function(res) {
if (res && res.sid) {
handler.set_selected_windows_session_id("" + res.sid);
}

View File

@ -1023,6 +1023,7 @@ impl<T: InvokeUiSession> Session<T> {
if true == force_relay {
self.lc.write().unwrap().force_relay = true;
}
self.lc.write().unwrap().peer_info = None;
let mut lock = self.thread.lock().unwrap();
// No need to join the previous thread, because it will exit automatically.
// And the previous thread will not change important states.
@ -1260,6 +1261,25 @@ impl<T: InvokeUiSession> Session<T> {
let mut msg = Message::new();
msg.set_misc(misc);
self.send(Data::Message(msg));
let pi = self.lc.read().unwrap().peer_info.clone();
if let Some(pi) = pi {
if pi.windows_sessions.current_sid == sid {
if self.is_file_transfer() {
if pi.username.is_empty() {
self.on_error(
"No active console user logged on, please connect and logon first.",
);
}
} else {
self.msgbox(
"success",
"Successful",
"Connected, waiting for image...",
"",
);
}
}
}
} else {
log::error!("selected invalid sid: {}", sid);
}
@ -1371,7 +1391,7 @@ impl<T: InvokeUiSession> Interface for Session<T> {
fn handle_peer_info(&self, mut pi: PeerInfo) {
log::debug!("handle_peer_info :{:?}", pi);
pi.username = self.lc.read().unwrap().get_username(&pi);
self.lc.write().unwrap().peer_info = Some(pi.clone());
if pi.current_display as usize >= pi.displays.len() {
pi.current_display = 0;
}
@ -1379,7 +1399,7 @@ impl<T: InvokeUiSession> Interface for Session<T> {
self.set_permission("restart", false);
}
if self.is_file_transfer() {
if pi.username.is_empty() {
if pi.username.is_empty() && pi.windows_sessions.sessions.is_empty() {
self.on_error("No active console user logged on, please connect and logon first.");
return;
}