diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 97cee8c76..20f50d218 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -172,6 +172,7 @@ const String kOptionAllowRemoveWallpaper = "allow-remove-wallpaper"; const String kOptionStopService = "stop-service"; const String kOptionDirectxCapture = "enable-directx-capture"; const String kOptionAllowRemoteCmModification = "allow-remote-cm-modification"; +const String kOptionEnableTcpPunch = "enable-tcp-punch"; const String kOptionEnableUdpPunch = "enable-udp-punch"; const String kOptionEnableIpv6Punch = "enable-ipv6-punch"; const String kOptionAllowSyncClipboardBetweenSessions = diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index ce7499cdc..3d71091e2 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -572,6 +572,12 @@ class _GeneralState extends State<_General> { kOptionDirectxCapture, ), if (!isWeb && !incomingOnly) ...[ + _OptionCheckBox( + context, + 'Enable TCP hole punching', + kOptionEnableTcpPunch, + isServer: false, + ), _OptionCheckBox( context, 'Enable UDP hole punching', diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index f9b4ed2a0..198613a1b 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -97,6 +97,7 @@ class _SettingsState extends State with WidgetsBindingObserver { var _hideNetwork = false; var _hideWebSocket = false; var _enableTrustedDevices = false; + var _enableTcpPunch = false; var _enableUdpPunch = false; var _allowInsecureTlsFallback = false; var _disableUdp = false; @@ -142,6 +143,7 @@ class _SettingsState extends State with WidgetsBindingObserver { bind.mainGetBuildinOption(key: kOptionHideWebSocketSetting) == 'Y' || isWeb; _enableTrustedDevices = mainGetBoolOptionSync(kOptionEnableTrustedDevices); + _enableTcpPunch = mainGetLocalBoolOptionSync(kOptionEnableTcpPunch); _enableUdpPunch = mainGetLocalBoolOptionSync(kOptionEnableUdpPunch); _enableIpv6Punch = mainGetLocalBoolOptionSync(kOptionEnableIpv6Punch); _enableWebrtc = mainGetLocalBoolOptionSync(kOptionEnableWebrtc); @@ -817,43 +819,65 @@ class _SettingsState extends State with WidgetsBindingObserver { }); }, ), + if (!incomingOnly) + SettingsTile.switchTile( + title: Text(translate('Enable TCP hole punching')), + initialValue: _enableTcpPunch, + onToggle: isOptionFixed(kOptionEnableTcpPunch) + ? null + : (v) async { + await mainSetLocalBoolOption(kOptionEnableTcpPunch, v); + final newValue = + mainGetLocalBoolOptionSync(kOptionEnableTcpPunch); + setState(() { + _enableTcpPunch = newValue; + }); + }, + ), if (!incomingOnly) SettingsTile.switchTile( title: Text(translate('Enable UDP hole punching')), initialValue: _enableUdpPunch, - onToggle: (v) async { - await mainSetLocalBoolOption(kOptionEnableUdpPunch, v); - final newValue = - mainGetLocalBoolOptionSync(kOptionEnableUdpPunch); - setState(() { - _enableUdpPunch = newValue; - }); - }, + onToggle: isOptionFixed(kOptionEnableUdpPunch) + ? null + : (v) async { + await mainSetLocalBoolOption(kOptionEnableUdpPunch, v); + final newValue = + mainGetLocalBoolOptionSync(kOptionEnableUdpPunch); + setState(() { + _enableUdpPunch = newValue; + }); + }, ), if (!incomingOnly) SettingsTile.switchTile( title: Text(translate('Enable IPv6 P2P connection')), initialValue: _enableIpv6Punch, - onToggle: (v) async { - await mainSetLocalBoolOption(kOptionEnableIpv6Punch, v); - final newValue = - mainGetLocalBoolOptionSync(kOptionEnableIpv6Punch); - setState(() { - _enableIpv6Punch = newValue; - }); - }, + onToggle: isOptionFixed(kOptionEnableIpv6Punch) + ? null + : (v) async { + await mainSetLocalBoolOption(kOptionEnableIpv6Punch, v); + final newValue = + mainGetLocalBoolOptionSync(kOptionEnableIpv6Punch); + setState(() { + _enableIpv6Punch = newValue; + }); + }, ), if (!incomingOnly) SettingsTile.switchTile( title: Text(translate('Enable WebRTC P2P connection')), initialValue: _enableWebrtc, - onToggle: (v) async { - await mainSetLocalBoolOption(kOptionEnableWebrtc, v); - final newValue = mainGetLocalBoolOptionSync(kOptionEnableWebrtc); - setState(() { - _enableWebrtc = newValue; - }); - }, + onToggle: isOptionFixed(kOptionEnableWebrtc) + ? null + : (v) async { + await mainSetLocalBoolOption(kOptionEnableWebrtc, v); + final newValue = + mainGetLocalBoolOptionSync(kOptionEnableWebrtc); + setState(() { + _enableWebrtc = newValue; + }); + }, ), SettingsTile( title: Text(translate('Language')), diff --git a/src/client.rs b/src/client.rs index efc43c052..2d760cf14 100644 --- a/src/client.rs +++ b/src/client.rs @@ -334,6 +334,18 @@ fn request_allows_tcp_punch(webrtc_sdp_offer: &str) -> bool { webrtc_sdp_offer.is_empty() } +/// TCP punch is a user option like the other direct transports, but it is also the backstop: +/// with every direct transport switched off there would be nothing left to punch with, so it +/// runs regardless. Only the switches decide that — a transport that is enabled but fails to +/// materialize (no public v6 address, offerer setup error) leaves this alone, because the +/// relay fallback already covers a round that ends up with no usable direct transport. +fn tcp_punch_allowed() -> bool { + crate::get_tcp_punch_enabled() + || !(crate::get_udp_punch_enabled() + || crate::get_ipv6_punch_enabled() + || crate::get_webrtc_enabled()) +} + impl Client { const CLIENT_CLIPBOARD_NAME: &'static str = "client-clipboard"; @@ -521,7 +533,13 @@ impl Client { servers.clone(), contained, ); - if interface.is_force_relay() || (udp.0.is_none() && !has_webrtc_offerer) { + // The fallback request exists only to carry a TCP punch, so it is pointless once TCP + // punch is off — it would reach `connect()` with nothing to try and just open a second + // relay. + if interface.is_force_relay() + || (udp.0.is_none() && !has_webrtc_offerer) + || !tcp_punch_allowed() + { return fut.await; } let preferred_fut = fut.boxed(); @@ -849,7 +867,7 @@ impl Client { } else { String::new() }; - let allow_tcp_punch = request_allows_tcp_punch(&webrtc_sdp_offer); + let allow_tcp_punch = tcp_punch_allowed() && request_allows_tcp_punch(&webrtc_sdp_offer); let punch_type = if udp_nat_port > 0 { "UDP" } else if allow_tcp_punch { diff --git a/src/common.rs b/src/common.rs index 3b8e9c8da..9eaaacb2c 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1153,6 +1153,13 @@ pub fn is_public(url: &str) -> bool { host == "rustdesk.com" || host.ends_with(".rustdesk.com") } +pub fn get_tcp_punch_enabled() -> bool { + config::option2bool( + keys::OPTION_ENABLE_TCP_PUNCH, + &get_local_option(keys::OPTION_ENABLE_TCP_PUNCH), + ) +} + pub fn get_udp_punch_enabled() -> bool { config::option2bool( keys::OPTION_ENABLE_UDP_PUNCH, diff --git a/src/lang/ar.rs b/src/lang/ar.rs index da287fb92..5f7ee012b 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "إعادة استخدام اتصال واحد لإعادة توجيه المنافذ"), ("port-forward-mux-tip", "تمرير جميع اتصالات إعادة توجيه المنافذ عبر اتصال واحد بالجهاز الآخر، بدلاً من الاتصال وتسجيل الدخول من جديد لكل اتصال."), ("Enable WebRTC P2P connection", "تمكين اتصال نظير إلى نظير عبر WebRTC"), + ("Enable TCP hole punching", "تمكين تقنية حفر الثغرات عبر TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/be.rs b/src/lang/be.rs index 214cfcfa2..5b079a640 100644 --- a/src/lang/be.rs +++ b/src/lang/be.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Выкарыстоўваць адно злучэнне для перанакіравання партоў"), ("port-forward-mux-tip", "Перадаваць усе злучэнні аднаго перанакіравання партоў праз адно злучэнне з аддаленай прыладай замест паўторнага падлучэння і ўваходу для кожнага з іх."), ("Enable WebRTC P2P connection", "Выкарыстоўваць падключэнне WebRTC P2P"), + ("Enable TCP hole punching", "Выкарыстоўваць TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/bg.rs b/src/lang/bg.rs index 5c2a5e95a..609a2de49 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Използване на една връзка за пренасочване на портове"), ("port-forward-mux-tip", "Всички връзки на едно пренасочване на портове минават през една връзка към отсрещния компютър, вместо да се свързвате и влизате отново за всяка от тях."), ("Enable WebRTC P2P connection", "Позволяване на WebRTC P2P връзка"), + ("Enable TCP hole punching", "Позволяване на TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 6ec9c81e4..efdebf934 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reutilitza una connexió per a la redirecció de ports"), ("port-forward-mux-tip", "Fa passar totes les connexions d'una redirecció de ports per una única connexió amb l'altre equip, en lloc de connectar i iniciar la sessió de nou per a cadascuna."), ("Enable WebRTC P2P connection", "Habilita la connexió WebRTC P2P"), + ("Enable TCP hole punching", "Activa la perforació TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index 250afb4a8..b5f7da9d6 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "端口转发复用同一条连接"), ("port-forward-mux-tip", "同一条端口转发规则上的所有连接共用一条到对方的连接,而不是每条连接都重新连接并登录一次。"), ("Enable WebRTC P2P connection", "启用 WebRTC P2P 连接"), + ("Enable TCP hole punching", "启用 TCP 打洞"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index a89e50acb..4db35ebfa 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Znovu použít jedno připojení pro přesměrování portů"), ("port-forward-mux-tip", "Vede všechna připojení jednoho přesměrování portů přes jediné připojení k protějšku místo opakovaného připojování a přihlašování pro každé z nich."), ("Enable WebRTC P2P connection", "Povolit připojení WebRTC P2P"), + ("Enable TCP hole punching", "Povolit TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 6b6574a67..d8223253e 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Genbrug én forbindelse til portvideresendelse"), ("port-forward-mux-tip", "Fører alle forbindelser i en portvideresendelse gennem én enkelt forbindelse til modparten i stedet for at forbinde og logge ind igen for hver enkelt."), ("Enable WebRTC P2P connection", "Aktivér WebRTC P2P-forbindelse"), + ("Enable TCP hole punching", "Aktivér TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 160b51c71..b2973f440 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Eine Verbindung für die Portweiterleitung wiederverwenden"), ("port-forward-mux-tip", "Alle Verbindungen einer Portweiterleitung über eine einzige Verbindung zur Gegenstelle führen, statt sich für jede einzelne neu zu verbinden und anzumelden."), ("Enable WebRTC P2P connection", "WebRTC-P2P-Verbindung aktivieren"), + ("Enable TCP hole punching", "TCP-Hole-Punching aktivieren"), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 68d95a4d1..3afe9430c 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Επαναχρησιμοποίηση μίας σύνδεσης για την προώθηση θυρών"), ("port-forward-mux-tip", "Όλες οι συνδέσεις μιας προώθησης θυρών περνούν από μία μόνο σύνδεση προς τον απομακρυσμένο υπολογιστή, αντί να πραγματοποιείται νέα σύνδεση και ταυτοποίηση για κάθε μία."), ("Enable WebRTC P2P connection", "Ενεργοποίηση σύνδεσης WebRTC P2P"), + ("Enable TCP hole punching", "Ενεργοποίηση διάτρησης οπών TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 1a1976f9f..055e3926c 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reuzi unu konekton por pordo-plusendado"), ("port-forward-mux-tip", "Ĉiuj konektoj de unu pordo-plusendado iras tra unu sola konekto al la alia komputilo, anstataŭ konekti kaj ensaluti denove por ĉiu el ili."), ("Enable WebRTC P2P connection", "Ebligi WebRTC P2P-konekton"), + ("Enable TCP hole punching", "Ebligi TCP-trapikadon"), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 53dc750a4..10bcd9907 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reutilizar una conexión para la redirección de puertos"), ("port-forward-mux-tip", "Llevar todas las conexiones de una redirección de puertos por una única conexión con el otro equipo, en lugar de conectar e iniciar sesión de nuevo para cada una."), ("Enable WebRTC P2P connection", "Habilitar conexión WebRTC P2P"), + ("Enable TCP hole punching", "Habilitar perforación de agujero TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index 3f4ad7716..874ea6c32 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Kasuta pordi suunamiseks üht ühendust"), ("port-forward-mux-tip", "Juhib ühe pordisuunamise kõik ühendused ühe teise arvutiga loodud ühenduse kaudu, selle asemel et iga ühenduse jaoks uuesti ühenduda ja sisse logida."), ("Enable WebRTC P2P connection", "Luba WebRTC P2P-ühendus"), + ("Enable TCP hole punching", "Luba TCP-augustamine"), ].iter().cloned().collect(); } diff --git a/src/lang/eu.rs b/src/lang/eu.rs index 3cb557e1a..c4cbafe1d 100644 --- a/src/lang/eu.rs +++ b/src/lang/eu.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Berrerabili konexio bakarra portuen birbideratzerako"), ("port-forward-mux-tip", "Portu-birbideratze baten konexio guztiak beste ordenagailurako konexio bakar batetik eramaten ditu, bakoitzerako berriro konektatu eta saioa hasi beharrean."), ("Enable WebRTC P2P connection", "Gaitu WebRTC P2P konexioa"), + ("Enable TCP hole punching", "Gaitu TCP zulo-egitea"), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index bf14f090d..07fc68d20 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "استفاده مجدد از یک اتصال برای هدایت پورت"), ("port-forward-mux-tip", "همه اتصال‌های یک هدایت پورت از یک اتصال واحد به دستگاه مقابل عبور می‌کنند، به‌جای اتصال و ورود دوباره برای هر کدام."), ("Enable WebRTC P2P connection", "فعال‌سازی اتصال همتا‌به‌همتای WebRTC"), + ("Enable TCP hole punching", "فعال‌سازی تکنیک TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/fi.rs b/src/lang/fi.rs index 0dcafa431..5f330e991 100644 --- a/src/lang/fi.rs +++ b/src/lang/fi.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Käytä yhtä yhteyttä portin edelleenohjaukseen"), ("port-forward-mux-tip", "Välittää kaikki yhden portin edelleenohjauksen yhteydet yhden vastapuoleen avatun yhteyden kautta sen sijaan, että jokaista varten muodostettaisiin yhteys ja kirjauduttaisiin uudelleen."), ("Enable WebRTC P2P connection", "Ota WebRTC P2P yhteys käyttöön"), + ("Enable TCP hole punching", "Ota käyttöön TCP hole punching tekniikka"), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index b5e27871f..e0e42b49d 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Réutiliser une seule connexion pour la redirection de ports"), ("port-forward-mux-tip", "Faire passer toutes les connexions d'une redirection de ports par une seule connexion vers le pair, au lieu de se connecter et de s'authentifier à nouveau pour chacune."), ("Enable WebRTC P2P connection", "Activer la connexion P2P WebRTC"), + ("Enable TCP hole punching", "Activer le « hole punching » TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/ge.rs b/src/lang/ge.rs index 41b17b5cc..0de75f954 100644 --- a/src/lang/ge.rs +++ b/src/lang/ge.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "პორტის გადამისამართებისთვის ერთი კავშირის ხელახლა გამოყენება"), ("port-forward-mux-tip", "ერთი პორტის გადამისამართების ყველა კავშირი გადის მეორე კომპიუტერთან დამყარებული ერთი კავშირით, ნაცვლად იმისა, რომ თითოეულისთვის თავიდან დაუკავშირდეს და შევიდეს სისტემაში."), ("Enable WebRTC P2P connection", "WebRTC P2P კავშირის ჩართვა"), + ("Enable TCP hole punching", "TCP hole punching-ის ჩართვა"), ].iter().cloned().collect(); } diff --git a/src/lang/gu.rs b/src/lang/gu.rs index dfef2e997..74f292e86 100644 --- a/src/lang/gu.rs +++ b/src/lang/gu.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "પોર્ટ ફોરવર્ડિંગ માટે એક જ કનેક્શન ફરી વાપરો"), ("port-forward-mux-tip", "એક પોર્ટ ફોરવર્ડિંગનાં બધાં કનેક્શન સામેના કમ્પ્યુટર સાથેના એક જ કનેક્શન મારફતે જાય છે, દરેક માટે ફરીથી કનેક્ટ અને લોગિન કરવાને બદલે."), ("Enable WebRTC P2P connection", "WebRTC P2P કનેક્શન સક્ષમ કરો"), + ("Enable TCP hole punching", "TCP હોલ પંચિંગ સક્ષમ કરો"), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index 9b0c242a4..e7ad5cf4f 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "שימוש חוזר בחיבור אחד להעברת פורטים"), ("port-forward-mux-tip", "כל החיבורים של העברת פורטים אחת עוברים דרך חיבור יחיד למחשב המרוחק, במקום ליצור חיבור חדש ולהיכנס מחדש עבור כל אחד מהם."), ("Enable WebRTC P2P connection", "אפשר חיבור WebRTC P2P"), + ("Enable TCP hole punching", "אפשר TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/hi.rs b/src/lang/hi.rs index 32a3d836c..60c9288a4 100644 --- a/src/lang/hi.rs +++ b/src/lang/hi.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "पोर्ट फ़ॉरवर्डिंग के लिए एक ही कनेक्शन दोबारा उपयोग करें"), ("port-forward-mux-tip", "एक पोर्ट फ़ॉरवर्डिंग के सभी कनेक्शन दूसरे कंप्यूटर से बने एक ही कनेक्शन से होकर जाते हैं, हर एक के लिए दोबारा कनेक्ट और लॉगिन करने के बजाय।"), ("Enable WebRTC P2P connection", "WebRTC P2P कनेक्शन सक्षम करें"), + ("Enable TCP hole punching", "TCP होल पंचिंग सक्षम करें"), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index a27410774..19a959c60 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Ponovno koristi jednu vezu za prosljeđivanje portova"), ("port-forward-mux-tip", "Sve veze jednog prosljeđivanja portova idu kroz jednu vezu prema drugoj strani, umjesto ponovnog povezivanja i prijave za svaku od njih."), ("Enable WebRTC P2P connection", "Omogući WebRTC P2P vezu"), + ("Enable TCP hole punching", "Omogući TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index f3b002891..4337f3368 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Egyetlen kapcsolat újrafelhasználása a portátirányításhoz"), ("port-forward-mux-tip", "Egy portátirányítás összes kapcsolatát egyetlen, a másik géppel létesített kapcsolaton vezeti át, ahelyett hogy mindegyikhez újra csatlakozna és bejelentkezne."), ("Enable WebRTC P2P connection", "WebRTC P2P kapcsolat engedélyezése"), + ("Enable TCP hole punching", "TCP résszűrés engedélyezése"), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index fdd976797..d4993327c 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Gunakan ulang satu koneksi untuk penerusan port"), ("port-forward-mux-tip", "Menyalurkan semua koneksi dari satu penerusan port melalui satu koneksi ke perangkat lain, alih-alih menyambung dan masuk lagi untuk setiap koneksi."), ("Enable WebRTC P2P connection", "Aktifkan koneksi P2P WebRTC"), + ("Enable TCP hole punching", "Aktifkan TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index cce424d3c..3e8d79be6 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Riutilizza una sola connessione per l'inoltro delle porte"), ("port-forward-mux-tip", "Fa passare tutte le connessioni di un inoltro di porte su un'unica connessione verso il dispositivo remoto, invece di connettersi e autenticarsi di nuovo per ognuna."), ("Enable WebRTC P2P connection", "Abilita connessione P2P WebRTC"), + ("Enable TCP hole punching", "Abilita hole punching TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 93834bccf..f970f7751 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "ポート転送で 1 つの接続を再利用する"), ("port-forward-mux-tip", "1 つのポート転送のすべての接続を、相手への 1 本の接続にまとめます。接続ごとに接続とログインをやり直しません。"), ("Enable WebRTC P2P connection", "WebRTC P2P 接続を有効化する"), + ("Enable TCP hole punching", "TCP ホールパンチを有効化する"), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 35ae48e9e..49b3b7d83 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "포트 포워딩에 연결 하나를 재사용"), ("port-forward-mux-tip", "포트 포워딩 하나의 모든 연결을 상대방과의 단일 연결로 전달합니다. 연결마다 다시 접속하고 로그인하지 않습니다."), ("Enable WebRTC P2P connection", "WebRTC P2P 연결 사용"), + ("Enable TCP hole punching", "TCP 홀 펀칭 사용"), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index b33d3b740..486c40073 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Порт бағыттау үшін бір қосылымды қайта пайдалану"), ("port-forward-mux-tip", "Бір порт бағыттаудың барлық қосылымдары әрқайсысы үшін қайта қосылып кірудің орнына қарсы құрылғымен орнатылған бір қосылым арқылы өтеді."), ("Enable WebRTC P2P connection", "WebRTC P2P қосылымын іске қосу"), + ("Enable TCP hole punching", "TCP hole punching'ті іске қосу"), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 73c8e69c2..fb022ceea 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Prievadų peradresavimui naudoti vieną ryšį"), ("port-forward-mux-tip", "Visi vieno prievadų peradresavimo ryšiai eina per vieną ryšį su kitu kompiuteriu, užuot kiekvienam iš jų jungiantis ir prisijungiant iš naujo."), ("Enable WebRTC P2P connection", "Įgalinti WebRTC P2P ryšį"), + ("Enable TCP hole punching", "Įgalinti TCP gręžimą (hole punching)"), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index 50bb6db4d..4d8cff70d 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Atkārtoti izmantot vienu savienojumu portu pārsūtīšanai"), ("port-forward-mux-tip", "Visi viena portu pārsūtījuma savienojumi tiek novadīti pa vienu savienojumu ar otru datoru, nevis katram no tiem izveidojot jaunu savienojumu un pieteikšanos."), ("Enable WebRTC P2P connection", "Iespējot WebRTC P2P savienojumu"), + ("Enable TCP hole punching", "Iespējot TCP caurumu veidošanu"), ].iter().cloned().collect(); } diff --git a/src/lang/ml.rs b/src/lang/ml.rs index a1bfbd634..57b2c2ad1 100644 --- a/src/lang/ml.rs +++ b/src/lang/ml.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "പോർട്ട് ഫോർവേഡിംഗിന് ഒരേ കണക്ഷൻ വീണ്ടും ഉപയോഗിക്കുക"), ("port-forward-mux-tip", "ഒരു പോർട്ട് ഫോർവേഡിംഗിന്റെ എല്ലാ കണക്ഷനുകളും മറ്റേ കമ്പ്യൂട്ടറിലേക്കുള്ള ഒരൊറ്റ കണക്ഷനിലൂടെ കടന്നുപോകുന്നു, ഓരോന്നിനും വീണ്ടും കണക്റ്റ് ചെയ്ത് ലോഗിൻ ചെയ്യുന്നതിനു പകരം."), ("Enable WebRTC P2P connection", "WebRTC P2P കണക്ഷൻ അനുവദിക്കുക"), + ("Enable TCP hole punching", "TCP ഹോൾ പഞ്ചിംഗ് അനുവദിക്കുക"), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index 77e2718b7..d5c9544f4 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Gjenbruk én tilkobling for portvideresending"), ("port-forward-mux-tip", "Fører alle tilkoblinger i en portvideresending gjennom én enkelt tilkobling til motparten i stedet for å koble til og logge inn på nytt for hver enkelt."), ("Enable WebRTC P2P connection", "Aktiver WebRTC P2P-tilkobling"), + ("Enable TCP hole punching", "Aktiver TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 52b9ba424..5b108bbdd 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Eén verbinding hergebruiken voor poortdoorschakeling"), ("port-forward-mux-tip", "Alle verbindingen van een poortdoorschakeling via één enkele verbinding met de andere computer laten lopen, in plaats van voor elke verbinding opnieuw verbinding te maken en in te loggen."), ("Enable WebRTC P2P connection", "WebRTC P2P-verbinding inschakelen"), + ("Enable TCP hole punching", "TCP-hole punching inschakelen"), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index efe48083a..50ce862bc 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Użyj ponownie jednego połączenia do przekierowania portów"), ("port-forward-mux-tip", "Przekazuj wszystkie połączenia jednego przekierowania portów przez jedno połączenie ze zdalnym komputerem, zamiast łączyć się i logować od nowa dla każdego z nich."), ("Enable WebRTC P2P connection", "Włącz połączenie P2P WebRTC"), + ("Enable TCP hole punching", "Włącz tworzenie tunelu TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index a0d4993cd..955ce35f9 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reutilizar uma ligação para o reencaminhamento de portas"), ("port-forward-mux-tip", "Encaminhar todas as ligações de um reencaminhamento de portas por uma única ligação ao outro computador, em vez de ligar e iniciar sessão novamente para cada uma."), ("Enable WebRTC P2P connection", "Ativar ligação P2P por WebRTC"), + ("Enable TCP hole punching", "Ativar TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 0d70c06ce..03e9104aa 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reutilizar uma conexão para encaminhamento de portas"), ("port-forward-mux-tip", "Levar todas as conexões de um encaminhamento de portas por uma única conexão com o outro computador, em vez de conectar e fazer login novamente para cada uma."), ("Enable WebRTC P2P connection", "Habilitar conexão WebRTC P2P"), + ("Enable TCP hole punching", "Habilitar TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index b8b9290a1..255377f56 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Reutilizează o singură conexiune pentru redirecționarea porturilor"), ("port-forward-mux-tip", "Trece toate conexiunile unei redirecționări de porturi printr-o singură conexiune către celălalt calculator, în loc să se conecteze și să se autentifice din nou pentru fiecare."), ("Enable WebRTC P2P connection", "Activează conexiunea P2P prin WebRTC"), + ("Enable TCP hole punching", "Activează traversarea TCP (hole punching)"), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index b66c0c2ab..25c922063 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Использовать одно подключение для перенаправления портов"), ("port-forward-mux-tip", "Передавать все соединения одного перенаправления портов через одно подключение к удалённому устройству вместо повторного подключения и входа для каждого из них."), ("Enable WebRTC P2P connection", "Использовать подключение WebRTC P2P"), + ("Enable TCP hole punching", "Использовать TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/sc.rs b/src/lang/sc.rs index abe559130..54f7cc081 100644 --- a/src/lang/sc.rs +++ b/src/lang/sc.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Torra a impreare una connessione pro s'imbiu de is portas"), ("port-forward-mux-tip", "Totu is connessiones de un'imbiu de portas passant in una connessione ebbia a s'àteru computadore, in logu de si connètere e intrare torra pro dontzi una."), ("Enable WebRTC P2P connection", "Abìlita connessione P2P WebRTC"), + ("Enable TCP hole punching", "Abìlita s'istampadura TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 702c4a091..db3918327 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Znovu použiť jedno pripojenie na presmerovanie portov"), ("port-forward-mux-tip", "Vedie všetky pripojenia jedného presmerovania portov cez jediné pripojenie k druhej strane namiesto opakovaného pripájania a prihlasovania pre každé z nich."), ("Enable WebRTC P2P connection", "Povoliť pripojenie WebRTC P2P"), + ("Enable TCP hole punching", "Povoliť TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 08ab41fd6..e3adad22d 100644 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Ponovno uporabi eno povezavo za posredovanje vrat"), ("port-forward-mux-tip", "Vse povezave enega posredovanja vrat potekajo prek ene same povezave do druge strani, namesto ponovnega povezovanja in prijave za vsako od njih."), ("Enable WebRTC P2P connection", "Omogoči povezavo WebRTC P2P"), + ("Enable TCP hole punching", "Omogoči preboj lukenj TCP"), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 419cc7c16..ca7e6e1d3 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Ripërdor një lidhje për përcjelljen e porteve"), ("port-forward-mux-tip", "Të gjitha lidhjet e një përcjelljeje portesh kalojnë përmes një lidhjeje të vetme me kompjuterin tjetër, në vend që të lidhet dhe të hyjë sërish për secilën prej tyre."), ("Enable WebRTC P2P connection", "Aktivizo lidhjen WebRTC P2P"), + ("Enable TCP hole punching", "Aktivizo TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 7e4055c43..8ecff5cf5 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Ponovo koristi jednu vezu za prosleđivanje portova"), ("port-forward-mux-tip", "Sve veze jednog prosleđivanja portova idu kroz jednu vezu ka drugoj strani, umesto povezivanja i prijavljivanja iznova za svaku od njih."), ("Enable WebRTC P2P connection", "Omogući WebRTC P2P konekciju"), + ("Enable TCP hole punching", "Omogući TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 84a49c3b9..d9f5b6121 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Återanvänd en anslutning för portvidarebefordran"), ("port-forward-mux-tip", "Låt alla anslutningar i en portvidarebefordran gå via en enda anslutning till motparten, i stället för att ansluta och logga in på nytt för varje anslutning."), ("Enable WebRTC P2P connection", "Aktivera WebRTC P2P anslutning"), + ("Enable TCP hole punching", "Aktivera TCP hålslagning"), ].iter().cloned().collect(); } diff --git a/src/lang/ta.rs b/src/lang/ta.rs index 359105b5a..246d01ae4 100644 --- a/src/lang/ta.rs +++ b/src/lang/ta.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "போர்ட் ஃபார்வேர்டிங்கிற்கு ஒரே இணைப்பை மீண்டும் பயன்படுத்து"), ("port-forward-mux-tip", "ஒரு போர்ட் ஃபார்வேர்டிங்கின் அனைத்து இணைப்புகளும் மறுமுனைக்கான ஒரே இணைப்பின் வழியாகச் செல்லும், ஒவ்வொன்றுக்கும் மீண்டும் இணைந்து உள்நுழைவதற்குப் பதிலாக."), ("Enable WebRTC P2P connection", "WebRTC P2P இணைப்பு இயக்கு"), + ("Enable TCP hole punching", "TCP hole punching இயக்கு"), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 95bb70e44..d60321b93 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", ""), ("port-forward-mux-tip", ""), ("Enable WebRTC P2P connection", ""), + ("Enable TCP hole punching", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index e6d17f9fe..4605c2787 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "ใช้การเชื่อมต่อเดียวร่วมกันสำหรับการส่งต่อพอร์ต"), ("port-forward-mux-tip", "ส่งการเชื่อมต่อทั้งหมดของการส่งต่อพอร์ตหนึ่งรายการผ่านการเชื่อมต่อเดียวไปยังอีกฝ่าย แทนการเชื่อมต่อและเข้าสู่ระบบใหม่ทุกครั้ง"), ("Enable WebRTC P2P connection", "เปิดใช้งานการเชื่อมต่อ P2P แบบ WebRTC"), + ("Enable TCP hole punching", "เปิดใช้งาน TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 5f3da40d2..6087e4b16 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Port yönlendirme için tek bağlantıyı yeniden kullan"), ("port-forward-mux-tip", "Bir port yönlendirmesindeki tüm bağlantıları, her biri için yeniden bağlanıp oturum açmak yerine karşı tarafa açılan tek bir bağlantı üzerinden taşır."), ("Enable WebRTC P2P connection", "WebRTC P2P bağlantısını etkinleştir"), + ("Enable TCP hole punching", "TCP delik açmayı etkinleştir"), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index 8f3a1d6a4..c29424aa9 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "連接埠轉送重複使用同一條連線"), ("port-forward-mux-tip", "同一條連接埠轉送規則上的所有連線共用一條到對方的連線,而不是每條連線都重新連線並登入一次。"), ("Enable WebRTC P2P connection", "啟用 WebRTC P2P 連線"), + ("Enable TCP hole punching", "啟用 TCP 打洞"), ].iter().cloned().collect(); } diff --git a/src/lang/uk.rs b/src/lang/uk.rs index 0b4d19c7e..359dd5a5a 100644 --- a/src/lang/uk.rs +++ b/src/lang/uk.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Використовувати одне з'єднання для перенаправлення портів"), ("port-forward-mux-tip", "Передавати всі з'єднання одного перенаправлення портів через одне з'єднання з віддаленим пристроєм замість повторного під'єднання та входу для кожного з них."), ("Enable WebRTC P2P connection", "Увімкнути P2P-підключення через WebRTC"), + ("Enable TCP hole punching", "Увімкнути TCP hole punching"), ].iter().cloned().collect(); } diff --git a/src/lang/vi.rs b/src/lang/vi.rs index 8d4cf7f12..f3b073a84 100644 --- a/src/lang/vi.rs +++ b/src/lang/vi.rs @@ -769,5 +769,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Reuse one connection for port forwarding", "Dùng chung một kết nối cho chuyển tiếp cổng"), ("port-forward-mux-tip", "Chuyển toàn bộ kết nối của một quy tắc chuyển tiếp cổng qua một kết nối duy nhất tới máy đối phương, thay vì kết nối và đăng nhập lại cho từng kết nối."), ("Enable WebRTC P2P connection", "Cho phép kết nối WebRTC P2P"), + ("Enable TCP hole punching", "Bật TCP Hole Punching"), ].iter().cloned().collect(); }