mod.rs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. /* This file is part of DarkFi (https://dark.fi)
  2. *
  3. * Copyright (C) 2020-2026 Dyne.org foundation
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU Affero General Public License as
  7. * published by the Free Software Foundation, either version 3 of the
  8. * License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU Affero General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Affero General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. use sled_overlay::sled;
  19. use std::{array::TryFromSliceError, string::FromUtf8Error, sync::Arc};
  20. #[cfg(feature = "enable-plugin-darkirc")]
  21. pub mod darkirc;
  22. #[cfg(feature = "enable-plugin-darkirc")]
  23. pub use darkirc::DarkIrcPtr;
  24. #[cfg(feature = "enable-plugin-fud")]
  25. pub mod fud;
  26. #[cfg(feature = "enable-plugin-fud")]
  27. pub use fud::FudPluginPtr as FudPtr;
  28. #[cfg(feature = "enable-plugin-drk")]
  29. pub mod drk;
  30. #[cfg(feature = "enable-plugin-drk")]
  31. pub use drk::DrkPluginPtr as DrkPtr;
  32. #[cfg(feature = "enable-plugin-darkirc")]
  33. pub use darkirc::DarkIrc;
  34. #[cfg(feature = "enable-plugin-drk")]
  35. pub use drk::DrkPlugin;
  36. #[cfg(feature = "enable-plugin-fud")]
  37. pub use fud::FudPlugin;
  38. #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
  39. use darkfi::net::Settings as NetSettings;
  40. #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
  41. use crate::{
  42. prop::{Property, PropertyAtomicGuard, PropertySubType, PropertyType, PropertyValue, Role},
  43. scene::{SceneNode, SceneNodePtr, SceneNodeType},
  44. };
  45. #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
  46. pub struct PluginSettings {
  47. pub setting_root: SceneNodePtr,
  48. pub sled_tree: sled::Tree,
  49. }
  50. #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
  51. impl PluginSettings {
  52. pub fn add_setting(&self, name: &str, default: PropertyValue) -> Option<SceneNodePtr> {
  53. let atom = &mut PropertyAtomicGuard::none();
  54. let node = match default {
  55. PropertyValue::Bool(b) => {
  56. let mut node = SceneNode::new(name, SceneNodeType::Setting);
  57. let prop = Property::new("value", PropertyType::Bool, PropertySubType::Null);
  58. node.add_property(prop).unwrap();
  59. let prop = Property::new("default", PropertyType::Bool, PropertySubType::Null);
  60. node.add_property(prop).unwrap();
  61. node.set_property_bool(atom, Role::User, "value", b.clone()).unwrap();
  62. node.set_property_bool(atom, Role::App, "default", b.clone()).unwrap();
  63. Some(node)
  64. }
  65. PropertyValue::Uint32(u) => {
  66. let mut node = SceneNode::new(name, SceneNodeType::Setting);
  67. let prop = Property::new("value", PropertyType::Uint32, PropertySubType::Null);
  68. node.add_property(prop).unwrap();
  69. let prop = Property::new("default", PropertyType::Uint32, PropertySubType::Null);
  70. node.add_property(prop).unwrap();
  71. node.set_property_u32(atom, Role::User, "value", u.clone()).unwrap();
  72. node.set_property_u32(atom, Role::App, "default", u.clone()).unwrap();
  73. Some(node)
  74. }
  75. PropertyValue::Float32(f) => {
  76. let mut node = SceneNode::new(name, SceneNodeType::Setting);
  77. let prop = Property::new("value", PropertyType::Float32, PropertySubType::Null);
  78. node.add_property(prop).unwrap();
  79. let prop = Property::new("default", PropertyType::Float32, PropertySubType::Null);
  80. node.add_property(prop).unwrap();
  81. node.set_property_f32(atom, Role::User, "value", f.clone()).unwrap();
  82. node.set_property_f32(atom, Role::App, "default", f.clone()).unwrap();
  83. Some(node)
  84. }
  85. PropertyValue::Str(s) => {
  86. let mut node = SceneNode::new(name, SceneNodeType::Setting);
  87. let prop = Property::new("value", PropertyType::Str, PropertySubType::Null);
  88. node.add_property(prop).unwrap();
  89. let prop = Property::new("default", PropertyType::Str, PropertySubType::Null);
  90. node.add_property(prop).unwrap();
  91. node.set_property_str(atom, Role::User, "value", s.clone()).unwrap();
  92. node.set_property_str(atom, Role::App, "default", s.clone()).unwrap();
  93. Some(node)
  94. }
  95. _ => None,
  96. };
  97. match node {
  98. Some(n) => {
  99. let node_ptr = Arc::new(n);
  100. self.setting_root.link(node_ptr.clone().into());
  101. Some(node_ptr)
  102. }
  103. None => None,
  104. }
  105. }
  106. // For all settings, copy the value from sled into the setting node's value property
  107. pub fn load_settings(&self) {
  108. let atom = &mut PropertyAtomicGuard::none();
  109. for setting_node in self.setting_root.get_children().iter() {
  110. if setting_node.typ != SceneNodeType::Setting {
  111. continue
  112. }
  113. let value = setting_node.get_property("value").clone().unwrap();
  114. match value.typ {
  115. PropertyType::Bool => {
  116. let sled_result = self.sled_tree.get(setting_node.name.as_str());
  117. if let Ok(Some(sled_value)) = sled_result {
  118. setting_node
  119. .set_property_bool(atom, Role::User, "value", sled_value[0] != 0)
  120. .unwrap();
  121. }
  122. }
  123. PropertyType::Uint32 => {
  124. let sled_result = self.sled_tree.get(setting_node.name.as_str());
  125. if let Ok(Some(sled_value)) = sled_result {
  126. if sled_value.len() == 4 {
  127. let bytes: Result<[u8; 4], TryFromSliceError> =
  128. sled_value.as_ref().try_into();
  129. if let Ok(b) = bytes {
  130. setting_node
  131. .set_property_u32(
  132. atom,
  133. Role::User,
  134. "value",
  135. u32::from_le_bytes(b),
  136. )
  137. .unwrap();
  138. }
  139. }
  140. }
  141. }
  142. PropertyType::Float32 => {
  143. let sled_result = self.sled_tree.get(setting_node.name.as_str());
  144. if let Ok(Some(sled_value)) = sled_result {
  145. if sled_value.len() == 4 {
  146. let bytes: Result<[u8; 4], TryFromSliceError> =
  147. sled_value.as_ref().try_into();
  148. if let Ok(b) = bytes {
  149. setting_node
  150. .set_property_f32(
  151. atom,
  152. Role::User,
  153. "value",
  154. f32::from_le_bytes(b),
  155. )
  156. .unwrap();
  157. }
  158. }
  159. }
  160. }
  161. PropertyType::Str => {
  162. let sled_result = self.sled_tree.get(setting_node.name.as_str());
  163. if let Ok(Some(sled_value)) = sled_result {
  164. let string: Result<String, FromUtf8Error> =
  165. String::from_utf8(sled_value.to_vec());
  166. if let Ok(s) = string {
  167. setting_node.set_property_str(atom, Role::User, "value", s).unwrap();
  168. }
  169. }
  170. }
  171. _ => {}
  172. }
  173. }
  174. }
  175. // Save all settings to sled
  176. pub fn save_settings(&self) {
  177. for setting_node in self.setting_root.get_children().iter() {
  178. if setting_node.typ != SceneNodeType::Setting {
  179. continue
  180. }
  181. let value = setting_node.get_property("value").clone().unwrap();
  182. match value.typ {
  183. PropertyType::Bool => {
  184. let value_bytes = if value.get_bool(0).unwrap() { 1u8 } else { 0u8 };
  185. self.sled_tree
  186. .insert(setting_node.name.as_str(), sled::IVec::from(vec![value_bytes]))
  187. .unwrap();
  188. }
  189. PropertyType::Uint32 => {
  190. self.sled_tree
  191. .insert(
  192. setting_node.name.as_str(),
  193. sled::IVec::from(value.get_u32(0).unwrap().to_le_bytes().as_ref()),
  194. )
  195. .unwrap();
  196. }
  197. PropertyType::Float32 => {
  198. self.sled_tree
  199. .insert(
  200. setting_node.name.as_str(),
  201. sled::IVec::from(value.get_f32(0).unwrap().to_le_bytes().as_ref()),
  202. )
  203. .unwrap();
  204. }
  205. PropertyType::Str => {
  206. self.sled_tree
  207. .insert(
  208. setting_node.name.as_str(),
  209. sled::IVec::from(value.get_str(0).unwrap().as_bytes()),
  210. )
  211. .unwrap();
  212. }
  213. _ => {}
  214. }
  215. }
  216. }
  217. pub fn get_setting(&self, name: &str) -> Option<SceneNodePtr> {
  218. self.setting_root
  219. .clone()
  220. .get_children()
  221. .iter()
  222. .find(|node| node.typ == SceneNodeType::Setting && node.name == name)
  223. .cloned()
  224. }
  225. pub fn add_p2p_settings(&self, p2p_settings: &NetSettings) {
  226. self.add_setting(
  227. "net.outbound_connections",
  228. PropertyValue::Uint32(p2p_settings.outbound_connections as u32),
  229. );
  230. self.add_setting(
  231. "net.inbound_connections",
  232. PropertyValue::Uint32(p2p_settings.inbound_connections as u32),
  233. );
  234. //TODO: Update this when multiple active_profiles at a time is supported
  235. self.add_setting(
  236. "net.outbound_connect_timeout",
  237. PropertyValue::Uint32(
  238. p2p_settings
  239. .outbound_connect_timeout(&p2p_settings.active_profiles.first().unwrap())
  240. as u32,
  241. ),
  242. );
  243. self.add_setting(
  244. "net.channel_handshake_timeout",
  245. PropertyValue::Uint32(
  246. p2p_settings
  247. .channel_handshake_timeout(&p2p_settings.active_profiles.first().unwrap())
  248. as u32,
  249. ),
  250. );
  251. self.add_setting(
  252. "net.channel_heartbeat_interval",
  253. PropertyValue::Uint32(
  254. p2p_settings
  255. .channel_heartbeat_interval(&p2p_settings.active_profiles.first().unwrap())
  256. as u32,
  257. ),
  258. );
  259. self.add_setting(
  260. "net.outbound_peer_discovery_cooloff_time",
  261. PropertyValue::Uint32(p2p_settings.outbound_peer_discovery_cooloff_time as u32),
  262. );
  263. self.add_setting("net.localnet", PropertyValue::Bool(p2p_settings.localnet));
  264. self.add_setting(
  265. "net.greylist_refinery_interval",
  266. PropertyValue::Uint32(p2p_settings.greylist_refinery_interval as u32),
  267. );
  268. self.add_setting(
  269. "net.time_with_no_connections",
  270. PropertyValue::Uint32(p2p_settings.time_with_no_connections as u32),
  271. );
  272. }
  273. // Update a NetSettings from settings in the node tree
  274. pub fn update_p2p_settings(&self, p2p_settings: &mut NetSettings) {
  275. p2p_settings.outbound_connections = self
  276. .get_setting("net.outbound_connections")
  277. .unwrap()
  278. .get_property_u32("value")
  279. .unwrap() as usize;
  280. p2p_settings.inbound_connections =
  281. self.get_setting("net.inbound_connections").unwrap().get_property_u32("value").unwrap()
  282. as usize;
  283. //TODO: Update this when multiple active_profiles at a time is supported
  284. if let Some(profile) =
  285. p2p_settings.profiles.get_mut(p2p_settings.active_profiles.first().unwrap())
  286. {
  287. profile.outbound_connect_timeout = self
  288. .get_setting("net.outbound_connect_timeout")
  289. .unwrap()
  290. .get_property_u32("value")
  291. .unwrap() as u64;
  292. profile.channel_handshake_timeout = self
  293. .get_setting("net.channel_handshake_timeout")
  294. .unwrap()
  295. .get_property_u32("value")
  296. .unwrap() as u64;
  297. profile.channel_heartbeat_interval = self
  298. .get_setting("net.channel_heartbeat_interval")
  299. .unwrap()
  300. .get_property_u32("value")
  301. .unwrap() as u64;
  302. }
  303. p2p_settings.outbound_peer_discovery_cooloff_time = self
  304. .get_setting("net.outbound_peer_discovery_cooloff_time")
  305. .unwrap()
  306. .get_property_u32("value")
  307. .unwrap() as u64;
  308. p2p_settings.localnet =
  309. self.get_setting("net.localnet").unwrap().get_property_bool("value").unwrap();
  310. p2p_settings.greylist_refinery_interval = self
  311. .get_setting("net.greylist_refinery_interval")
  312. .unwrap()
  313. .get_property_u32("value")
  314. .unwrap() as u64;
  315. p2p_settings.time_with_no_connections = self
  316. .get_setting("net.time_with_no_connections")
  317. .unwrap()
  318. .get_property_u32("value")
  319. .unwrap() as u64;
  320. }
  321. }