linux headless feature, tmp commit
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
parent
571c1df5c4
commit
73358502e9
@ -30,6 +30,7 @@ flutter = ["flutter_rust_bridge"]
|
||||
default = ["use_dasp"]
|
||||
hwcodec = ["scrap/hwcodec"]
|
||||
mediacodec = ["scrap/mediacodec"]
|
||||
linux_headless = ["pam", "users"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
@ -122,8 +123,8 @@ mouce = { git="https://github.com/fufesou/mouce.git" }
|
||||
evdev = { git="https://github.com/fufesou/evdev" }
|
||||
dbus = "0.9"
|
||||
dbus-crossroads = "0.5"
|
||||
pam = { git="https://github.com/fufesou/pam" }
|
||||
users = "0.11.0"
|
||||
pam = { git="https://github.com/fufesou/pam", optional = true }
|
||||
users = { version = "0.11.0", optional = true }
|
||||
|
||||
[target.'cfg(target_os = "android")'.dependencies]
|
||||
android_logger = "0.11"
|
||||
|
@ -64,11 +64,15 @@ lazy_static::lazy_static! {
|
||||
pub static ref APP_HOME_DIR: Arc<RwLock<String>> = Default::default();
|
||||
}
|
||||
|
||||
// #[cfg(any(target_os = "android", target_os = "ios"))]
|
||||
pub const LINK_DOCS_HOME: &str = "https://rustdesk.com/docs/en/";
|
||||
pub const LINK_DOCS_X11_REQUIRED: &str = "https://rustdesk.com/docs/en/manual/linux/#x11-required";
|
||||
pub const LINK_HEADLESS_LINUX_SUPPORT: &str =
|
||||
"https://github.com/rustdesk/rustdesk/wiki/Headless-Linux-Support";
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref HELPER_URL: HashMap<&'static str, &'static str> = HashMap::from([
|
||||
("rustdesk docs home", "https://rustdesk.com/docs/en/"),
|
||||
("rustdesk docs x11-required", "https://rustdesk.com/docs/en/manual/linux/#x11-required"),
|
||||
("rustdesk docs home", LINK_DOCS_HOME),
|
||||
("rustdesk docs x11-required", LINK_DOCS_X11_REQUIRED),
|
||||
("rustdesk x11 headless", LINK_HEADLESS_LINUX_SUPPORT),
|
||||
]);
|
||||
}
|
||||
|
||||
@ -917,7 +921,8 @@ impl PeerConfig {
|
||||
store = store || store2;
|
||||
for opt in ["rdp_password", "os-username", "os-password"] {
|
||||
if let Some(v) = config.options.get_mut(opt) {
|
||||
let (encrypted, _, store2) = decrypt_str_or_original(v, PASSWORD_ENC_VERSION);
|
||||
let (encrypted, _, store2) =
|
||||
decrypt_str_or_original(v, PASSWORD_ENC_VERSION);
|
||||
*v = encrypted;
|
||||
store = store || store2;
|
||||
}
|
||||
|
119
src/client.rs
119
src/client.rs
@ -1912,6 +1912,71 @@ fn _input_os_password(p: String, activate: bool, interface: impl Interface) {
|
||||
interface.send(Data::Message(msg_out));
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
struct LoginErrorMsgBox {
|
||||
msgtype: &'static str,
|
||||
title: &'static str,
|
||||
text: &'static str,
|
||||
link: &'static str,
|
||||
try_again: bool,
|
||||
}
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
static ref LOGIN_ERROR_MAP: Arc<HashMap<&'static str, LoginErrorMsgBox>> = {
|
||||
use hbb_common::config::LINK_HEADLESS_LINUX_SUPPORT;
|
||||
let map = HashMap::from([(crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY, LoginErrorMsgBox{
|
||||
msgtype: "session-login",
|
||||
title: "session_not_ready_title_tip",
|
||||
text: "session_not_ready_text_tip",
|
||||
link: "",
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_XSESSION_FAILED, LoginErrorMsgBox{
|
||||
msgtype: "session-re-login",
|
||||
title: "xsession_failed_title_tip",
|
||||
text: "xsession_failed_text_tip",
|
||||
link: "",
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_SESSION_ANOTHER_USER, LoginErrorMsgBox{
|
||||
msgtype: "info",
|
||||
title: "another_user_login_title_tip",
|
||||
text: "another_user_login_text_tip",
|
||||
link: "",
|
||||
try_again: false,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_XORG_NOT_FOUND, LoginErrorMsgBox{
|
||||
msgtype: "session-re-login",
|
||||
title: "xorg_not_found_title_tip",
|
||||
text: "xorg_not_found_text_tip",
|
||||
link: LINK_HEADLESS_LINUX_SUPPORT,
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_NO_DESKTOP, LoginErrorMsgBox{
|
||||
msgtype: "session-re-login",
|
||||
title: "no_desktop_title_tip",
|
||||
text: "no_desktop_text_tip",
|
||||
link: LINK_HEADLESS_LINUX_SUPPORT,
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_EMPTY, LoginErrorMsgBox{
|
||||
msgtype: "session-login-password",
|
||||
title: "session_unready_no_password_title_tip",
|
||||
text: "session_unready_no_password_text_tip",
|
||||
link: "",
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_WRONG, LoginErrorMsgBox{
|
||||
msgtype: "session-login-re-password",
|
||||
title: "session_unready_wrong_password_title_tip",
|
||||
text: "session_unready_wrong_password_text_tip",
|
||||
link: "",
|
||||
try_again: true,
|
||||
}), (crate::server::LOGIN_MSG_NO_PASSWORD_ACCESS, LoginErrorMsgBox{
|
||||
msgtype: "wait-remote-accept-nook",
|
||||
title: "Prompt",
|
||||
text: "no_password_access_text_tip",
|
||||
link: "",
|
||||
try_again: true,
|
||||
})]);
|
||||
Arc::new(map)
|
||||
};
|
||||
}
|
||||
|
||||
/// Handle login error.
|
||||
/// Return true if the password is wrong, return false if there's an actual error.
|
||||
pub fn handle_login_error(
|
||||
@ -1927,47 +1992,19 @@ pub fn handle_login_error(
|
||||
lc.write().unwrap().password = Default::default();
|
||||
interface.msgbox("re-input-password", err, "Do you want to enter again?", "");
|
||||
true
|
||||
} else if err == crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY {
|
||||
interface.msgbox(
|
||||
"session-login",
|
||||
"session is unready",
|
||||
"Input linux user/password",
|
||||
"",
|
||||
);
|
||||
true
|
||||
} else if err == crate::server::LOGIN_MSG_DESKTOP_XSESSION_FAILED {
|
||||
interface.msgbox(
|
||||
"session-re-login",
|
||||
"xsession username/password is wrong",
|
||||
"Do you want to enter again?",
|
||||
"",
|
||||
);
|
||||
true
|
||||
} else if err == crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_EMPTY {
|
||||
interface.msgbox(
|
||||
"session-login-password",
|
||||
"session is unready",
|
||||
"Input connection password and linux user/password",
|
||||
"",
|
||||
);
|
||||
true
|
||||
} else if err == crate::server::LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_WRONG {
|
||||
interface.msgbox(
|
||||
"session-login-re-password",
|
||||
"session is unready and password is wrong",
|
||||
"Do you want to enter again?",
|
||||
"",
|
||||
);
|
||||
true
|
||||
} else if err == "No Password Access" {
|
||||
lc.write().unwrap().password = Default::default();
|
||||
interface.msgbox(
|
||||
"wait-remote-accept-nook",
|
||||
"Prompt",
|
||||
"Please wait for the remote side to accept your session request...",
|
||||
"",
|
||||
);
|
||||
true
|
||||
} else if LOGIN_ERROR_MAP.contains_key(err) {
|
||||
if let Some(msgbox_info) = LOGIN_ERROR_MAP.get(err) {
|
||||
interface.msgbox(
|
||||
msgbox_info.msgtype,
|
||||
msgbox_info.title,
|
||||
msgbox_info.text,
|
||||
msgbox_info.link,
|
||||
);
|
||||
msgbox_info.try_again
|
||||
} else {
|
||||
// unreachable!
|
||||
false
|
||||
}
|
||||
} else {
|
||||
if err.contains(SCRAP_X11_REQUIRED) {
|
||||
interface.msgbox("error", "Login Error", err, SCRAP_X11_REF_URL);
|
||||
|
@ -1256,6 +1256,7 @@ impl<T: InvokeUiSession> Remote<T> {
|
||||
},
|
||||
Some(message::Union::MessageBox(msgbox)) => {
|
||||
let mut link = msgbox.link;
|
||||
// Links from remote side must be verified.
|
||||
if !link.starts_with("rustdesk://") {
|
||||
if let Some(v) = hbb_common::config::HELPER_URL.get(&link as &str) {
|
||||
link = v.to_string();
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "一次性密码长度"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", "记住此账户"),
|
||||
("os_account_desk_tip", "在无显示器的环境下,此账户用于登录被控系统,并启用桌面"),
|
||||
("OS Account", "系统账户"),
|
||||
("session_not_ready_title_tip", "桌面 session 未准备好"),
|
||||
("session_not_ready_text_tip", "请输入用户名密码"),
|
||||
("xsession_failed_title_tip", "用户名密码错误"),
|
||||
("xsession_failed_text_tip", "是否重试"),
|
||||
("another_user_login_title_tip", "其他用户已登录"),
|
||||
("another_user_login_text_tip", "断开"),
|
||||
("xorg_not_found_title_tip", "Xorg 未安装"),
|
||||
("xorg_not_found_text_tip", "请安装 Xorg"),
|
||||
("no_desktop_title_tip", "desktop 未安装"),
|
||||
("no_desktop_text_tip", "请安装 desktop"),
|
||||
("session_unready_no_password_title_tip", "桌面 session 未准备好"),
|
||||
("session_unready_no_password_text_tip", "请输入用户名密码和连接密码"),
|
||||
("session_unready_wrong_password_title_tip", "密码错误"),
|
||||
("session_unready_wrong_password_text_tip", "是否重试"),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Acceptér sessioner via adgangskode"),
|
||||
("Accept sessions via click", "Acceptér sessioner via klik"),
|
||||
("Accept sessions via both", "Acceptér sessioner via begge"),
|
||||
("Please wait for the remote side to accept your session request...", "Vent venligst på at fjernklienten accepterer din sessionsforespørgsel..."),
|
||||
("One-time Password", "Engangskode"),
|
||||
("Use one-time password", "Brug engangskode"),
|
||||
("One-time password length", "Engangskode længde"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Sitzung mit Passwort bestätigen"),
|
||||
("Accept sessions via click", "Sitzung mit einem Klick bestätigen"),
|
||||
("Accept sessions via both", "Sitzung mit Klick und Passwort bestätigen"),
|
||||
("Please wait for the remote side to accept your session request...", "Bitte warten Sie, bis die Gegenseite Ihre Sitzungsanfrage akzeptiert hat …"),
|
||||
("One-time Password", "Einmalpasswort"),
|
||||
("Use one-time password", "Einmalpasswort verwenden"),
|
||||
("One-time password length", "Länge des Einmalpassworts"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "Μήκος κωδικού πρόσβασης μίας χρήσης"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -60,5 +60,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("verify_rustdesk_password_tip", "Veryfy RustDesk password"),
|
||||
("remember_account_tip", "Remember this account"),
|
||||
("os_account_desk_tip", "This account is used to login the remote OS and enable the desktop session in headless"),
|
||||
("session_not_ready_title_tip", "Session is unready"),
|
||||
("session_not_ready_text_tip", "Input linux user/password"),
|
||||
("xsession_failed_title_tip", "Xsession username/password is wrong"),
|
||||
("xsession_failed_text_tip", "Do you want to enter again"),
|
||||
("another_user_login_title_tip", "Another user already login"),
|
||||
("another_user_login_text_tip", "Disconnect"),
|
||||
("xorg_not_found_title_tip", "Xorg not found"),
|
||||
("xorg_not_found_text_tip", "Please install Xorg"),
|
||||
("no_desktop_title_tip", "No desktop is avaliable"),
|
||||
("no_desktop_text_tip", "Please install GNOME desktop"),
|
||||
("session_unready_no_password_title_tip", "Session is unready"),
|
||||
("session_unready_no_password_text_tip", "Input connection password and linux user/password"),
|
||||
("session_unready_wrong_password_title_tip", "Password is wrong"),
|
||||
("session_unready_wrong_password_text_tip", "Do you want to enter again"),
|
||||
("no_password_access_text_tip", "Please wait for the remote side to accept your session request..."),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Aceptar sesiones a través de contraseña"),
|
||||
("Accept sessions via click", "Aceptar sesiones a través de clic"),
|
||||
("Accept sessions via both", "Aceptar sesiones a través de ambos"),
|
||||
("Please wait for the remote side to accept your session request...", "Por favor, espere a que el lado remoto acepte su solicitud de sesión"),
|
||||
("One-time Password", "Constaseña de un solo uso"),
|
||||
("Use one-time password", "Usar contraseña de un solo uso"),
|
||||
("One-time password length", "Longitud de la contraseña de un solo uso"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "طول رمز عبور یکبار مصرف"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Accepter les sessions via mot de passe"),
|
||||
("Accept sessions via click", "Accepter les sessions via clique de confirmation"),
|
||||
("Accept sessions via both", "Accepter les sessions via mot de passe ou clique de confirmation"),
|
||||
("Please wait for the remote side to accept your session request...", "Veuillez attendre que votre demande de session distante soit accepter ..."),
|
||||
("One-time Password", "Mot de passe unique"),
|
||||
("Use one-time password", "Utiliser un mot de passe unique"),
|
||||
("One-time password length", "Longueur du mot de passe unique"),
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Izinkan sesi dengan kata sandi"),
|
||||
("Accept sessions via click", "Izinkan sesi dengan klik"),
|
||||
("Accept sessions via both", "Izinkan sesi dengan keduanya"),
|
||||
("Please wait for the remote side to accept your session request...", "Harap tunggu sisi jarak jauh untuk menerima permintaan sesi Anda..."),
|
||||
("One-time Password", "Kata sandi satu kali"),
|
||||
("Use one-time password", "Gunakan kata sandi satu kali"),
|
||||
("One-time password length", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Accetta sessioni via password"),
|
||||
("Accept sessions via click", "Accetta sessioni via click"),
|
||||
("Accept sessions via both", "Accetta sessioni con entrambi"),
|
||||
("Please wait for the remote side to accept your session request...", "Attendere che il lato remoto accetti la richiesta di sessione..."),
|
||||
("One-time Password", "Password monouso"),
|
||||
("Use one-time password", "Usa password monouso"),
|
||||
("One-time password length", "Lunghezza password monouso"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Sessies accepteren via wachtwoord"),
|
||||
("Accept sessions via click", "Sessies accepteren via klik"),
|
||||
("Accept sessions via both", "Accepteer sessies via beide"),
|
||||
("Please wait for the remote side to accept your session request...", "Wacht tot de andere kant uw sessieverzoek accepteert..."),
|
||||
("One-time Password", "Eenmalig Wachtwoord"),
|
||||
("Use one-time password", "Gebruik een eenmalig Wachtwoord"),
|
||||
("One-time password length", "Eenmalig Wachtwoord lengre"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Uwierzytelnij sesję używając hasła"),
|
||||
("Accept sessions via click", "Uwierzytelnij sesję poprzez kliknięcie"),
|
||||
("Accept sessions via both", "Uwierzytelnij sesję za pomocą obu sposobów"),
|
||||
("Please wait for the remote side to accept your session request...", "Oczekiwanie, na zatwierdzenie sesji przez host zdalny..."),
|
||||
("One-time Password", "Hasło jednorazowe"),
|
||||
("Use one-time password", "Użyj hasła jednorazowego"),
|
||||
("One-time password length", "Długość hasła jednorazowego"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Aceitar sessões via senha"),
|
||||
("Accept sessions via click", "Aceitar sessões via clique"),
|
||||
("Accept sessions via both", "Aceitar sessões de ambos os modos"),
|
||||
("Please wait for the remote side to accept your session request...", "Por favor aguarde enquanto o cliente remoto aceita seu pedido de sessão..."),
|
||||
("One-time Password", "Senha de uso único"),
|
||||
("Use one-time password", "Usar senha de uso único"),
|
||||
("One-time password length", "Comprimento da senha de uso único"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Acceptă sesiunile folosind parola"),
|
||||
("Accept sessions via click", "Acceptă sesiunile cu un clic de confirmare"),
|
||||
("Accept sessions via both", "Acceptă sesiunile folosind ambele moduri"),
|
||||
("Please wait for the remote side to accept your session request...", "Așteaptă ca solicitarea ta de conectare la distanță să fie acceptată..."),
|
||||
("One-time Password", "Parolă unică"),
|
||||
("Use one-time password", "Folosește parola unică"),
|
||||
("One-time password length", "Lungimea parolei unice"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "Длина одноразового пароля"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Sprejmi seje z geslom"),
|
||||
("Accept sessions via click", "Sprejmi seje s potrditvijo"),
|
||||
("Accept sessions via both", "Sprejmi seje z geslom ali potrditvijo"),
|
||||
("Please wait for the remote side to accept your session request...", "Počakajte, da oddaljeni računalnik sprejme povezavo..."),
|
||||
("One-time Password", "Enkratno geslo"),
|
||||
("Use one-time password", "Uporabi enkratno geslo"),
|
||||
("One-time password length", "Dolžina enkratnega gesla"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Prano sesionin nëpërmjet fjalëkalimit"),
|
||||
("Accept sessions via click", "Prano sesionet nëpërmjet klikimit"),
|
||||
("Accept sessions via both", "Prano sesionet nëpërmjet të dyjave"),
|
||||
("Please wait for the remote side to accept your session request...", "Ju lutem prisni që ana në distancë të pranoj kërkësen tuaj"),
|
||||
("One-time Password", "Fjalëkalim Një-herë"),
|
||||
("Use one-time password", "Përdorni fjalëkalim Një-herë"),
|
||||
("One-time password length", "Gjatësia e fjalëkalimit një herë"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Prihvati sesije preko lozinke"),
|
||||
("Accept sessions via click", "Prihvati sesije preko klika"),
|
||||
("Accept sessions via both", "Prihvati sesije preko oboje"),
|
||||
("Please wait for the remote side to accept your session request...", "Molimo sačekajte da udaljena strana prihvati vaš zahtev za sesijom..."),
|
||||
("One-time Password", "Jednokratna lozinka"),
|
||||
("Use one-time password", "Koristi jednokratnu lozinku"),
|
||||
("One-time password length", "Dužina jednokratne lozinke"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Acceptera sessioner via lösenord"),
|
||||
("Accept sessions via click", "Acceptera sessioner via klick"),
|
||||
("Accept sessions via both", "Acceptera sessioner via båda"),
|
||||
("Please wait for the remote side to accept your session request...", "Var god vänta på att klienten accepterar din förfrågan..."),
|
||||
("One-time Password", "En-gångs lösenord"),
|
||||
("Use one-time password", "Använd en-gångs lösenord"),
|
||||
("One-time password length", "Längd på en-gångs lösenord"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "ความยาวรหัสผ่านครั้งเดียว"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("Accept sessions via password", "Oturumları parola ile kabul etme"),
|
||||
("Accept sessions via click", "Tıklama yoluyla oturumları kabul edin"),
|
||||
("Accept sessions via both", "Her ikisi aracılığıyla oturumları kabul edin"),
|
||||
("Please wait for the remote side to accept your session request...", "Lütfen uzak tarafın oturum isteğinizi kabul etmesini bekleyin..."),
|
||||
("One-time Password", "Tek Kullanımlık Şifre"),
|
||||
("Use one-time password", "Tek seferlik parola kullanın"),
|
||||
("One-time password length", "Tek seferlik şifre uzunluğu"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "一次性密碼長度"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", "Довжина одноразового пароля"),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -402,7 +402,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("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", ""),
|
||||
@ -485,5 +484,20 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
||||
("remember_account_tip", ""),
|
||||
("os_account_desk_tip", ""),
|
||||
("OS Account", ""),
|
||||
("session_not_ready_title_tip", ""),
|
||||
("session_not_ready_text_tip", ""),
|
||||
("xsession_failed_title_tip", ""),
|
||||
("xsession_failed_text_tip", ""),
|
||||
("another_user_login_title_tip", ""),
|
||||
("another_user_login_text_tip", ""),
|
||||
("xorg_not_found_title_tip", ""),
|
||||
("xorg_not_found_text_tip", ""),
|
||||
("no_desktop_title_tip", ""),
|
||||
("no_desktop_text_tip", ""),
|
||||
("session_unready_no_password_title_tip", ""),
|
||||
("session_unready_no_password_text_tip", ""),
|
||||
("session_unready_wrong_password_title_tip", ""),
|
||||
("session_unready_wrong_password_text_tip", ""),
|
||||
("no_password_access_text_tip", ""),
|
||||
].iter().cloned().collect();
|
||||
}
|
||||
|
@ -1,4 +1,9 @@
|
||||
use super::{linux::*, ResultType};
|
||||
use crate::server::{
|
||||
LOGIN_MSG_DESKTOP_NO_DESKTOP, LOGIN_MSG_DESKTOP_SESSION_ANOTHER_USER,
|
||||
LOGIN_MSG_DESKTOP_SESSION_NOT_READY, LOGIN_MSG_DESKTOP_XORG_NOT_FOUND,
|
||||
LOGIN_MSG_DESKTOP_XSESSION_FAILED,
|
||||
};
|
||||
use hbb_common::{allow_err, bail, log, rand::prelude::*, tokio::time};
|
||||
use pam;
|
||||
use std::{
|
||||
@ -59,7 +64,65 @@ pub fn stop_xdesktop() {
|
||||
*DESKTOP_MANAGER.lock().unwrap() = None;
|
||||
}
|
||||
|
||||
pub fn try_start_x_session(username: &str, password: &str) -> ResultType<(String, bool)> {
|
||||
pub fn try_start_desktop(_username: &str, _passsword: &str) -> String {
|
||||
if _username.is_empty() {
|
||||
let username = get_username();
|
||||
if username.is_empty() {
|
||||
LOGIN_MSG_DESKTOP_SESSION_NOT_READY
|
||||
} else {
|
||||
""
|
||||
}
|
||||
.to_owned()
|
||||
} else {
|
||||
let username = get_username();
|
||||
if username == _username {
|
||||
// No need to verify password here.
|
||||
return "".to_owned();
|
||||
}
|
||||
|
||||
match run_cmds(&format!("which {}", DesktopManager::get_xorg())) {
|
||||
Ok(output) => {
|
||||
if output.trim().is_empty() {
|
||||
return LOGIN_MSG_DESKTOP_XORG_NOT_FOUND.to_owned();
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
return LOGIN_MSG_DESKTOP_XORG_NOT_FOUND.to_owned();
|
||||
}
|
||||
}
|
||||
|
||||
match run_cmds("ls /usr/share/xsessions/") {
|
||||
Ok(output) => {
|
||||
if output.trim().is_empty() {
|
||||
return LOGIN_MSG_DESKTOP_NO_DESKTOP.to_owned();
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
return LOGIN_MSG_DESKTOP_NO_DESKTOP.to_owned();
|
||||
}
|
||||
}
|
||||
|
||||
match try_start_x_session(_username, _passsword) {
|
||||
Ok((username, x11_ready)) => {
|
||||
if x11_ready {
|
||||
if _username != username {
|
||||
LOGIN_MSG_DESKTOP_SESSION_ANOTHER_USER.to_owned()
|
||||
} else {
|
||||
"".to_owned()
|
||||
}
|
||||
} else {
|
||||
LOGIN_MSG_DESKTOP_SESSION_NOT_READY.to_owned()
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Failed to start xsession {}", e);
|
||||
LOGIN_MSG_DESKTOP_XSESSION_FAILED.to_owned()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn try_start_x_session(username: &str, password: &str) -> ResultType<(String, bool)> {
|
||||
let mut desktop_manager = DESKTOP_MANAGER.lock().unwrap();
|
||||
if let Some(desktop_manager) = &mut (*desktop_manager) {
|
||||
if let Some(seat0_username) = desktop_manager.get_supported_display_seat0_username() {
|
||||
@ -547,36 +610,36 @@ impl DesktopManager {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_xorg() -> ResultType<&'static str> {
|
||||
fn get_xorg() -> &'static str {
|
||||
// Fedora 26 or later
|
||||
let xorg = "/usr/libexec/Xorg";
|
||||
if Path::new(xorg).is_file() {
|
||||
return Ok(xorg);
|
||||
return xorg;
|
||||
}
|
||||
// Debian 9 or later
|
||||
let xorg = "/usr/lib/xorg/Xorg";
|
||||
if Path::new(xorg).is_file() {
|
||||
return Ok(xorg);
|
||||
return xorg;
|
||||
}
|
||||
// Ubuntu 16.04 or later
|
||||
let xorg = "/usr/lib/xorg/Xorg";
|
||||
if Path::new(xorg).is_file() {
|
||||
return Ok(xorg);
|
||||
return xorg;
|
||||
}
|
||||
// Arch Linux
|
||||
let xorg = "/usr/lib/xorg-server/Xorg";
|
||||
if Path::new(xorg).is_file() {
|
||||
return Ok(xorg);
|
||||
return xorg;
|
||||
}
|
||||
// Arch Linux
|
||||
let xorg = "/usr/lib/Xorg";
|
||||
if Path::new(xorg).is_file() {
|
||||
return Ok(xorg);
|
||||
return xorg;
|
||||
}
|
||||
// CentOS 7 /usr/bin/Xorg or param=Xorg
|
||||
|
||||
log::warn!("Failed to find xorg, use default Xorg.\n Please add \"allowed_users=anybody\" to \"/etc/X11/Xwrapper.config\".");
|
||||
Ok("Xorg")
|
||||
"Xorg"
|
||||
}
|
||||
|
||||
fn start_x_server(
|
||||
@ -586,7 +649,7 @@ impl DesktopManager {
|
||||
gid: u32,
|
||||
envs: &HashMap<&str, String>,
|
||||
) -> ResultType<Child> {
|
||||
let xorg = Self::get_xorg()?;
|
||||
let xorg = Self::get_xorg();
|
||||
log::info!("Use xorg: {}", &xorg);
|
||||
match Command::new(xorg)
|
||||
.envs(envs)
|
||||
|
@ -17,7 +17,7 @@ pub mod delegate;
|
||||
#[cfg(target_os = "linux")]
|
||||
pub mod linux;
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
pub mod linux_desktop_manager;
|
||||
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
|
@ -72,7 +72,7 @@ impl RendezvousMediator {
|
||||
allow_err!(super::lan::start_listening());
|
||||
});
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
crate::platform::linux_desktop_manager::start_xdesktop();
|
||||
SHOULD_EXIT.store(false, Ordering::SeqCst);
|
||||
while !SHOULD_EXIT.load(Ordering::SeqCst) {
|
||||
@ -99,7 +99,7 @@ impl RendezvousMediator {
|
||||
}
|
||||
sleep(1.).await;
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
crate::platform::linux_desktop_manager::stop_xdesktop();
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ use super::{input_service::*, *};
|
||||
use crate::clipboard_file::*;
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use crate::common::update_clipboard;
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
use crate::platform::linux_desktop_manager;
|
||||
#[cfg(windows)]
|
||||
use crate::portable_service::client as portable_client;
|
||||
@ -18,7 +18,7 @@ use crate::{
|
||||
use crate::{common::DEVICE_NAME, flutter::connection_manager::start_channel};
|
||||
use crate::{ipc, VERSION};
|
||||
use cidr_utils::cidr::IpCidr;
|
||||
#[cfg(all(target_os = "linux", feature = "flutter"))]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
use hbb_common::platform::linux::run_cmds;
|
||||
use hbb_common::{
|
||||
config::Config,
|
||||
@ -65,12 +65,16 @@ pub const LOGIN_MSG_DESKTOP_NOT_INITED: &str = "Desktop env is not inited";
|
||||
pub const LOGIN_MSG_DESKTOP_SESSION_NOT_READY: &str = "Desktop session unready";
|
||||
pub const LOGIN_MSG_DESKTOP_XSESSION_FAILED: &str = "Desktop xsession failed";
|
||||
pub const LOGIN_MSG_DESKTOP_SESSION_ANOTHER_USER: &str = "Desktop session another user login";
|
||||
pub const LOGIN_MSG_DESKTOP_XORG_NOT_FOUND: &str = "Desktop xorg not found";
|
||||
// ls /usr/share/xsessions/
|
||||
pub const LOGIN_MSG_DESKTOP_NO_DESKTOP: &str = "Desktop none";
|
||||
pub const LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_EMPTY: &str =
|
||||
"Desktop session unready, password empty";
|
||||
pub const LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_WRONG: &str =
|
||||
"Desktop session unready, password wrong";
|
||||
pub const LOGIN_MSG_PASSWORD_EMPTY: &str = "Empty Password";
|
||||
pub const LOGIN_MSG_PASSWORD_WRONG: &str = "Wrong Password";
|
||||
pub const LOGIN_MSG_NO_PASSWORD_ACCESS: &str = "No Password Access";
|
||||
pub const LOGIN_MSG_OFFLINE: &str = "Offline";
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
@ -150,9 +154,9 @@ pub struct Connection {
|
||||
audio_input_device_before_voice_call: Option<String>,
|
||||
options_in_login: Option<OptionMessage>,
|
||||
pressed_modifiers: HashSet<rdev::Key>,
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
rx_cm_stream_ready: mpsc::Receiver<()>,
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
tx_desktop_ready: mpsc::Sender<()>,
|
||||
}
|
||||
|
||||
@ -270,9 +274,9 @@ impl Connection {
|
||||
audio_input_device_before_voice_call: None,
|
||||
options_in_login: None,
|
||||
pressed_modifiers: Default::default(),
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
rx_cm_stream_ready: _rx_cm_stream_ready,
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
tx_desktop_ready: _tx_desktop_ready,
|
||||
};
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
@ -886,6 +890,7 @@ impl Connection {
|
||||
if crate::platform::current_is_wayland() {
|
||||
platform_additions.insert("is_wayland".into(), json!(true));
|
||||
}
|
||||
#[cfg(feature = "linux_headless")]
|
||||
if linux_desktop_manager::is_headless() {
|
||||
platform_additions.insert("headless".into(), json!(true));
|
||||
}
|
||||
@ -1096,45 +1101,6 @@ impl Connection {
|
||||
self.tx_input.send(MessageInput::Key((msg, press))).ok();
|
||||
}
|
||||
|
||||
fn try_start_desktop(_username: &str, _passsword: &str) -> String {
|
||||
#[cfg(target_os = "linux")]
|
||||
if _username.is_empty() {
|
||||
let username = linux_desktop_manager::get_username();
|
||||
if username.is_empty() {
|
||||
LOGIN_MSG_DESKTOP_SESSION_NOT_READY
|
||||
} else {
|
||||
""
|
||||
}
|
||||
.to_owned()
|
||||
} else {
|
||||
let username = linux_desktop_manager::get_username();
|
||||
if username == _username {
|
||||
// No need to verify password here.
|
||||
return "".to_owned();
|
||||
}
|
||||
|
||||
match linux_desktop_manager::try_start_x_session(_username, _passsword) {
|
||||
Ok((username, x11_ready)) => {
|
||||
if x11_ready {
|
||||
if _username != username {
|
||||
LOGIN_MSG_DESKTOP_SESSION_ANOTHER_USER.to_owned()
|
||||
} else {
|
||||
"".to_owned()
|
||||
}
|
||||
} else {
|
||||
LOGIN_MSG_DESKTOP_SESSION_NOT_READY.to_owned()
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Failed to start xsession {}", e);
|
||||
LOGIN_MSG_DESKTOP_XSESSION_FAILED.to_owned()
|
||||
}
|
||||
}
|
||||
}
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
"".to_owned()
|
||||
}
|
||||
|
||||
fn validate_one_password(&self, password: String) -> bool {
|
||||
if password.len() == 0 {
|
||||
return false;
|
||||
@ -1300,16 +1266,20 @@ impl Connection {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
let desktop_err = match lr.os_login.as_ref() {
|
||||
Some(os_login) => Self::try_start_desktop(&os_login.username, &os_login.password),
|
||||
None => Self::try_start_desktop("", ""),
|
||||
Some(os_login) => {
|
||||
linux_desktop_manager::try_start_desktop(&os_login.username, &os_login.password)
|
||||
}
|
||||
None => linux_desktop_manager::try_start_desktop("", ""),
|
||||
};
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
let is_headless = linux_desktop_manager::is_headless();
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
let wait_ipc_timeout = 10_000;
|
||||
|
||||
// If err is LOGIN_MSG_DESKTOP_SESSION_NOT_READY, just keep this msg and go on checking password.
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if !desktop_err.is_empty() && desktop_err != LOGIN_MSG_DESKTOP_SESSION_NOT_READY {
|
||||
self.send_login_error(desktop_err).await;
|
||||
return true;
|
||||
@ -1324,7 +1294,7 @@ impl Connection {
|
||||
if hbb_common::get_version_number(&lr.version)
|
||||
>= hbb_common::get_version_number("1.2.0")
|
||||
{
|
||||
self.send_login_error("No Password Access").await;
|
||||
self.send_login_error(LOGIN_MSG_NO_PASSWORD_ACCESS).await;
|
||||
}
|
||||
return true;
|
||||
} else if password::approve_mode() == ApproveMode::Password
|
||||
@ -1333,6 +1303,7 @@ impl Connection {
|
||||
self.send_login_error("Connection not allowed").await;
|
||||
return false;
|
||||
} else if self.is_recent_session() {
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if desktop_err.is_empty() {
|
||||
#[cfg(target_os = "linux")]
|
||||
if is_headless {
|
||||
@ -1347,13 +1318,24 @@ impl Connection {
|
||||
} else {
|
||||
self.send_login_error(desktop_err).await;
|
||||
}
|
||||
#[cfg(not(all(target_os = "linux", feature = "linux_headless")))]
|
||||
{
|
||||
self.try_start_cm(lr.my_id, lr.my_name, true);
|
||||
self.send_logon_response().await;
|
||||
if self.port_forward_socket.is_some() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if lr.password.is_empty() {
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if desktop_err.is_empty() {
|
||||
self.try_start_cm(lr.my_id, lr.my_name, false);
|
||||
} else {
|
||||
self.send_login_error(LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_EMPTY)
|
||||
.await;
|
||||
}
|
||||
#[cfg(not(all(target_os = "linux", feature = "linux_headless")))]
|
||||
self.try_start_cm(lr.my_id, lr.my_name, false);
|
||||
} else {
|
||||
let mut failure = LOGIN_FAILURES
|
||||
.lock()
|
||||
@ -1394,6 +1376,7 @@ impl Connection {
|
||||
.lock()
|
||||
.unwrap()
|
||||
.insert(self.ip.clone(), failure);
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if desktop_err.is_empty() {
|
||||
self.send_login_error(LOGIN_MSG_PASSWORD_WRONG).await;
|
||||
self.try_start_cm(lr.my_id, lr.my_name, false);
|
||||
@ -1401,10 +1384,16 @@ impl Connection {
|
||||
self.send_login_error(LOGIN_MSG_DESKTOP_SESSION_NOT_READY_PASSWORD_WRONG)
|
||||
.await;
|
||||
}
|
||||
#[cfg(not(all(target_os = "linux", feature = "linux_headless")))]
|
||||
{
|
||||
self.send_login_error(LOGIN_MSG_PASSWORD_WRONG).await;
|
||||
self.try_start_cm(lr.my_id, lr.my_name, false);
|
||||
}
|
||||
} else {
|
||||
if failure.0 != 0 {
|
||||
LOGIN_FAILURES.lock().unwrap().remove(&self.ip);
|
||||
}
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if desktop_err.is_empty() {
|
||||
#[cfg(target_os = "linux")]
|
||||
if is_headless {
|
||||
@ -1420,6 +1409,14 @@ impl Connection {
|
||||
} else {
|
||||
self.send_login_error(desktop_err).await;
|
||||
}
|
||||
#[cfg(not(all(target_os = "linux", feature = "linux_headless")))]
|
||||
{
|
||||
self.send_logon_response().await;
|
||||
self.try_start_cm(lr.my_id, lr.my_name, true);
|
||||
if self.port_forward_socket.is_some() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if let Some(message::Union::TestDelay(t)) = msg.union {
|
||||
@ -2207,11 +2204,13 @@ async fn start_ipc(
|
||||
args.push("--hide");
|
||||
};
|
||||
|
||||
#[cfg(all(target_os = "linux", not(feature = "flutter")))]
|
||||
#[cfg(target_os = "linux")]
|
||||
#[cfg(not(feature = "linux_headless"))]
|
||||
let user = None;
|
||||
#[cfg(all(target_os = "linux", feature = "flutter"))]
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
let mut user = None;
|
||||
#[cfg(all(target_os = "linux", feature = "flutter"))]
|
||||
// Cm run as user, wait until desktop session is ready.
|
||||
#[cfg(all(target_os = "linux", feature = "linux_headless"))]
|
||||
if linux_desktop_manager::is_headless() {
|
||||
let mut username = linux_desktop_manager::get_username();
|
||||
loop {
|
||||
|
Loading…
Reference in New Issue
Block a user