overwrite config

This commit is contained in:
rustdesk 2024-03-08 00:22:52 +08:00
parent 921ee34779
commit b32cf403e6

View File

@ -66,6 +66,12 @@ lazy_static::lazy_static! {
static ref KEY_PAIR: Arc<Mutex<Option<KeyPair>>> = Default::default(); static ref KEY_PAIR: Arc<Mutex<Option<KeyPair>>> = Default::default();
static ref USER_DEFAULT_CONFIG: Arc<RwLock<(UserDefaultConfig, Instant)>> = Arc::new(RwLock::new((UserDefaultConfig::load(), Instant::now()))); static ref USER_DEFAULT_CONFIG: Arc<RwLock<(UserDefaultConfig, Instant)>> = Arc::new(RwLock::new((UserDefaultConfig::load(), Instant::now())));
pub static ref NEW_STORED_PEER_CONFIG: Arc<Mutex<HashSet<String>>> = Default::default(); pub static ref NEW_STORED_PEER_CONFIG: Arc<Mutex<HashSet<String>>> = Default::default();
pub static ref DEFAULT_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
pub static ref OVERWRITE_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
pub static ref DEFAULT_DISPLAY_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
pub static ref OVERWRITE_DISPLAY_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
pub static ref DEFAULT_LOCAL_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
pub static ref OVERWRITE_LOCAL_SETTINGS: Arc<RwLock<HashMap<String, String>>> = Default::default();
} }
lazy_static::lazy_static! { lazy_static::lazy_static! {
@ -139,7 +145,7 @@ macro_rules! serde_field_bool {
} }
impl $struct_name { impl $struct_name {
pub fn $func() -> bool { pub fn $func() -> bool {
UserDefaultConfig::read().get($field_name) == "Y" UserDefaultConfig::read($field_name) == "Y"
} }
} }
impl Deref for $struct_name { impl Deref for $struct_name {
@ -900,7 +906,10 @@ impl Config {
} }
pub fn get_options() -> HashMap<String, String> { pub fn get_options() -> HashMap<String, String> {
CONFIG2.read().unwrap().options.clone() let mut res = DEFAULT_SETTINGS.read().unwrap().clone();
res.extend(CONFIG2.read().unwrap().options.clone());
res.extend(OVERWRITE_SETTINGS.read().unwrap().clone());
res
} }
pub fn set_options(v: HashMap<String, String>) { pub fn set_options(v: HashMap<String, String>) {
@ -913,9 +922,15 @@ impl Config {
} }
pub fn get_option(k: &str) -> String { pub fn get_option(k: &str) -> String {
if let Some(v) = OVERWRITE_SETTINGS.read().unwrap().get(k) {
return v.clone();
}
if let Some(v) = CONFIG2.read().unwrap().options.get(k) { if let Some(v) = CONFIG2.read().unwrap().options.get(k) {
v.clone() v.clone()
} else { } else {
if let Some(v) = DEFAULT_SETTINGS.read().unwrap().get(k) {
return v.clone();
}
"".to_owned() "".to_owned()
} }
} }
@ -1153,37 +1168,36 @@ impl PeerConfig {
serde_field_string!( serde_field_string!(
default_view_style, default_view_style,
deserialize_view_style, deserialize_view_style,
UserDefaultConfig::read().get("view_style") UserDefaultConfig::read("view_style")
); );
serde_field_string!( serde_field_string!(
default_scroll_style, default_scroll_style,
deserialize_scroll_style, deserialize_scroll_style,
UserDefaultConfig::read().get("scroll_style") UserDefaultConfig::read("scroll_style")
); );
serde_field_string!( serde_field_string!(
default_image_quality, default_image_quality,
deserialize_image_quality, deserialize_image_quality,
UserDefaultConfig::read().get("image_quality") UserDefaultConfig::read("image_quality")
); );
serde_field_string!( serde_field_string!(
default_reverse_mouse_wheel, default_reverse_mouse_wheel,
deserialize_reverse_mouse_wheel, deserialize_reverse_mouse_wheel,
UserDefaultConfig::read().get("reverse_mouse_wheel") UserDefaultConfig::read("reverse_mouse_wheel")
); );
serde_field_string!( serde_field_string!(
default_displays_as_individual_windows, default_displays_as_individual_windows,
deserialize_displays_as_individual_windows, deserialize_displays_as_individual_windows,
UserDefaultConfig::read().get("displays_as_individual_windows") UserDefaultConfig::read("displays_as_individual_windows")
); );
serde_field_string!( serde_field_string!(
default_use_all_my_displays_for_the_remote_session, default_use_all_my_displays_for_the_remote_session,
deserialize_use_all_my_displays_for_the_remote_session, deserialize_use_all_my_displays_for_the_remote_session,
UserDefaultConfig::read().get("use_all_my_displays_for_the_remote_session") UserDefaultConfig::read("use_all_my_displays_for_the_remote_session")
); );
fn default_custom_image_quality() -> Vec<i32> { fn default_custom_image_quality() -> Vec<i32> {
let f: f64 = UserDefaultConfig::read() let f: f64 = UserDefaultConfig::read("custom_image_quality")
.get("custom_image_quality")
.parse() .parse()
.unwrap_or(50.0); .unwrap_or(50.0);
vec![f as _] vec![f as _]
@ -1227,7 +1241,7 @@ impl PeerConfig {
] ]
.map(|key| { .map(|key| {
if !mp.contains_key(key) { if !mp.contains_key(key) {
mp.insert(key.to_owned(), UserDefaultConfig::read().get(key)); mp.insert(key.to_owned(), UserDefaultConfig::read(key));
} }
}); });
} }
@ -1367,9 +1381,15 @@ impl LocalConfig {
} }
pub fn get_option(k: &str) -> String { pub fn get_option(k: &str) -> String {
if let Some(v) = OVERWRITE_LOCAL_SETTINGS.read().unwrap().get(k) {
return v.clone();
}
if let Some(v) = LOCAL_CONFIG.read().unwrap().options.get(k) { if let Some(v) = LOCAL_CONFIG.read().unwrap().options.get(k) {
v.clone() v.clone()
} else { } else {
if let Some(v) = DEFAULT_LOCAL_SETTINGS.read().unwrap().get(k) {
return v.clone();
}
"".to_owned() "".to_owned()
} }
} }
@ -1514,15 +1534,17 @@ pub struct UserDefaultConfig {
} }
impl UserDefaultConfig { impl UserDefaultConfig {
pub fn read() -> UserDefaultConfig { fn read(key: &str) -> String {
let mut cfg = USER_DEFAULT_CONFIG.write().unwrap(); let mut cfg = USER_DEFAULT_CONFIG.write().unwrap();
// we do so, because default config may changed in another process, but we don't sync it
// but no need to read every time, give a small interval to avoid too many redundant read waste
if cfg.1.elapsed() > Duration::from_secs(1) { if cfg.1.elapsed() > Duration::from_secs(1) {
*cfg = (Self::load(), Instant::now()); *cfg = (Self::load(), Instant::now());
} }
cfg.0.clone() cfg.0.get(key)
} }
pub fn load() -> UserDefaultConfig { fn load() -> UserDefaultConfig {
Config::load_::<UserDefaultConfig>("_default") Config::load_::<UserDefaultConfig>("_default")
} }
@ -1531,7 +1553,7 @@ impl UserDefaultConfig {
Config::store_(self, "_default"); Config::store_(self, "_default");
} }
pub fn get(&self, key: &str) -> String { fn get(&self, key: &str) -> String {
match key { match key {
"view_style" => self.get_string(key, "original", vec!["adaptive"]), "view_style" => self.get_string(key, "original", vec!["adaptive"]),
"scroll_style" => self.get_string(key, "scrollauto", vec!["scrollbar"]), "scroll_style" => self.get_string(key, "scrollauto", vec!["scrollbar"]),
@ -1542,8 +1564,7 @@ impl UserDefaultConfig {
"custom_image_quality" => self.get_double_string(key, 50.0, 10.0, 0xFFF as f64), "custom_image_quality" => self.get_double_string(key, 50.0, 10.0, 0xFFF as f64),
"custom-fps" => self.get_double_string(key, 30.0, 5.0, 120.0), "custom-fps" => self.get_double_string(key, 30.0, 5.0, 120.0),
_ => self _ => self
.options .get_after(key)
.get(key)
.map(|v| v.to_string()) .map(|v| v.to_string())
.unwrap_or_default(), .unwrap_or_default(),
} }
@ -1560,7 +1581,7 @@ impl UserDefaultConfig {
#[inline] #[inline]
fn get_string(&self, key: &str, default: &str, others: Vec<&str>) -> String { fn get_string(&self, key: &str, default: &str, others: Vec<&str>) -> String {
match self.options.get(key) { match self.get_after(key) {
Some(option) => { Some(option) => {
if others.contains(&option.as_str()) { if others.contains(&option.as_str()) {
option.to_owned() option.to_owned()
@ -1574,7 +1595,7 @@ impl UserDefaultConfig {
#[inline] #[inline]
fn get_double_string(&self, key: &str, default: f64, min: f64, max: f64) -> String { fn get_double_string(&self, key: &str, default: f64, min: f64, max: f64) -> String {
match self.options.get(key) { match self.get_after(key) {
Some(option) => { Some(option) => {
let v: f64 = option.parse().unwrap_or(default); let v: f64 = option.parse().unwrap_or(default);
if v >= min && v <= max { if v >= min && v <= max {
@ -1586,6 +1607,20 @@ impl UserDefaultConfig {
None => default.to_string(), None => default.to_string(),
} }
} }
fn get_after(&self, key: &str) -> Option<String> {
if let Some(v) = OVERWRITE_DISPLAY_SETTINGS.read().unwrap().get(key) {
return Some(v.clone());
}
if let Some(v) = self.options.get(key) {
Some(v.clone())
} else {
if let Some(v) = DEFAULT_DISPLAY_SETTINGS.read().unwrap().get(key) {
return Some(v.clone());
}
None
}
}
} }
#[derive(Debug, Default, Serialize, Deserialize, Clone)] #[derive(Debug, Default, Serialize, Deserialize, Clone)]
@ -1833,6 +1868,118 @@ mod tests {
assert!(res.is_ok()); assert!(res.is_ok());
} }
#[test]
fn test_overwrite_settings() {
DEFAULT_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "a".to_string());
DEFAULT_SETTINGS
.write()
.unwrap()
.insert("c".to_string(), "a".to_string());
CONFIG2
.write()
.unwrap()
.options
.insert("a".to_string(), "b".to_string());
CONFIG2
.write()
.unwrap()
.options
.insert("b".to_string(), "b".to_string());
OVERWRITE_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "c".to_string());
OVERWRITE_SETTINGS
.write()
.unwrap()
.insert("d".to_string(), "c".to_string());
let res = Config::get_options();
assert!(res["a"] == "b");
assert!(res["c"] == "a");
assert!(res["b"] == "c");
assert!(res["d"] == "c");
assert!(Config::get_option("a") == "b");
assert!(Config::get_option("c") == "a");
assert!(Config::get_option("b") == "c");
assert!(Config::get_option("d") == "c");
DEFAULT_SETTINGS.write().unwrap().clear();
OVERWRITE_SETTINGS.write().unwrap().clear();
CONFIG2.write().unwrap().options.clear();
DEFAULT_LOCAL_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "a".to_string());
DEFAULT_LOCAL_SETTINGS
.write()
.unwrap()
.insert("c".to_string(), "a".to_string());
LOCAL_CONFIG
.write()
.unwrap()
.options
.insert("a".to_string(), "b".to_string());
LOCAL_CONFIG
.write()
.unwrap()
.options
.insert("b".to_string(), "b".to_string());
OVERWRITE_LOCAL_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "c".to_string());
OVERWRITE_LOCAL_SETTINGS
.write()
.unwrap()
.insert("d".to_string(), "c".to_string());
assert!(LocalConfig::get_option("a") == "b");
assert!(LocalConfig::get_option("c") == "a");
assert!(LocalConfig::get_option("b") == "c");
assert!(LocalConfig::get_option("d") == "c");
DEFAULT_LOCAL_SETTINGS.write().unwrap().clear();
OVERWRITE_LOCAL_SETTINGS.write().unwrap().clear();
LOCAL_CONFIG.write().unwrap().options.clear();
DEFAULT_DISPLAY_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "a".to_string());
DEFAULT_DISPLAY_SETTINGS
.write()
.unwrap()
.insert("c".to_string(), "a".to_string());
USER_DEFAULT_CONFIG
.write()
.unwrap()
.0
.options
.insert("a".to_string(), "b".to_string());
USER_DEFAULT_CONFIG
.write()
.unwrap()
.0
.options
.insert("b".to_string(), "b".to_string());
OVERWRITE_DISPLAY_SETTINGS
.write()
.unwrap()
.insert("b".to_string(), "c".to_string());
OVERWRITE_DISPLAY_SETTINGS
.write()
.unwrap()
.insert("d".to_string(), "c".to_string());
assert!(UserDefaultConfig::read("a") == "b");
assert!(UserDefaultConfig::read("c") == "a");
assert!(UserDefaultConfig::read("b") == "c");
assert!(UserDefaultConfig::read("d") == "c");
DEFAULT_DISPLAY_SETTINGS.write().unwrap().clear();
OVERWRITE_DISPLAY_SETTINGS.write().unwrap().clear();
LOCAL_CONFIG.write().unwrap().options.clear();
}
#[test] #[test]
fn test_config_deserialize() { fn test_config_deserialize() {
let wrong_type_str = r#" let wrong_type_str = r#"