main.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. use std::{fs::File, io::Write};
  2. use crypto_box::{aead::Aead, Box, SecretKey, KEY_SIZE};
  3. use darkfi::{
  4. raft::DataStore,
  5. util::{
  6. expand_path,
  7. serial::{deserialize, SerialDecodable, SerialEncodable},
  8. },
  9. Result,
  10. };
  11. mod error;
  12. mod month_tasks;
  13. mod task_info;
  14. mod util;
  15. use crate::{task_info::TaskInfo, util::load};
  16. #[derive(Debug)]
  17. pub struct Info<T> {
  18. pub logs: Vec<Log<T>>,
  19. pub commits: Vec<T>,
  20. pub voted_for: Vec<Option<NodeId>>,
  21. pub terms: Vec<u64>,
  22. }
  23. #[derive(Debug)]
  24. pub struct Log<T> {
  25. pub term: u64,
  26. pub msg: T,
  27. }
  28. #[derive(Debug)]
  29. pub struct NodeId(Vec<u8>);
  30. #[derive(Debug, SerialEncodable, SerialDecodable)]
  31. struct EncryptedTask {
  32. nonce: Vec<u8>,
  33. payload: Vec<u8>,
  34. }
  35. fn decrypt_task(encrypt_task: &EncryptedTask, secret_key: &SecretKey) -> Option<TaskInfo> {
  36. let public_key = secret_key.public_key();
  37. let msg_box = Box::new(&public_key, secret_key);
  38. let nonce = encrypt_task.nonce.as_slice();
  39. let decrypted_task = match msg_box.decrypt(nonce.into(), &encrypt_task.payload[..]) {
  40. Ok(m) => m,
  41. Err(_) => return None,
  42. };
  43. deserialize(&decrypted_task).ok()
  44. }
  45. type PrivmsgId = u32;
  46. #[derive(Debug, SerialEncodable, SerialDecodable)]
  47. struct Privmsg {
  48. id: PrivmsgId,
  49. nickname: String,
  50. channel: String,
  51. message: String,
  52. }
  53. fn extract_taud() -> Result<String> {
  54. let db_path = expand_path(&"~/.config/darkfi/tau/tau.db").unwrap();
  55. let datastore = DataStore::<EncryptedTask>::new(&db_path.to_str().unwrap())?;
  56. let sk_path = expand_path(&"~/.config/darkfi/tau/secret_key").unwrap();
  57. let sk = {
  58. let loaded_key = load::<String>(&sk_path);
  59. if loaded_key.is_err() {
  60. log::error!(
  61. "Could not load secret key from file, \
  62. please run \"taud --help\" for more information"
  63. );
  64. return Ok("Load secret_key error".into())
  65. }
  66. let sk_bytes = hex::decode(loaded_key.unwrap())?;
  67. let sk_bytes: [u8; KEY_SIZE] = sk_bytes.as_slice().try_into()?;
  68. SecretKey::try_from(sk_bytes)?
  69. };
  70. println!("Extracting db from: {:?}", db_path);
  71. // Retrieve all data trees
  72. let sled_logs = datastore.logs.get_all()?;
  73. let sled_commits = datastore.commits.get_all()?;
  74. let sled_voted_for = datastore.voted_for.get_all()?;
  75. let sled_terms = datastore.current_term.get_all()?;
  76. // Parse retrieved data trees
  77. println!("Data extracted, parsing to viewable form...");
  78. // Logs
  79. let mut logs = vec![];
  80. for log in sled_logs {
  81. let encrypt_task: EncryptedTask = deserialize(&log.msg)?;
  82. let task_info = decrypt_task(&encrypt_task, &sk).unwrap();
  83. logs.push(Log { term: log.term, msg: task_info });
  84. }
  85. // Commits
  86. let mut commits = vec![];
  87. for commit in &sled_commits {
  88. let task_info = decrypt_task(
  89. &EncryptedTask { nonce: commit.nonce.clone(), payload: commit.payload.clone() },
  90. &sk,
  91. )
  92. .unwrap();
  93. commits.push(task_info);
  94. }
  95. // Voted for
  96. let mut voted_for = vec![];
  97. for vote in sled_voted_for {
  98. match vote {
  99. Some(v) => voted_for.push(Some(NodeId(v.0.clone()))),
  100. None => voted_for.push(None),
  101. }
  102. }
  103. // Terms
  104. let mut terms = vec![];
  105. for term in sled_terms {
  106. terms.push(term);
  107. }
  108. let info = Info::<TaskInfo> { logs, commits, voted_for, terms };
  109. let info_string = format!("{:#?}", info);
  110. Ok(info_string)
  111. }
  112. fn extract_ircd() -> Result<String> {
  113. let db_path = expand_path(&"~/.config/darkfi/ircd/ircd.db").unwrap();
  114. let datastore = DataStore::<Privmsg>::new(&db_path.to_str().unwrap())?;
  115. println!("Extracting db from: {:?}", db_path);
  116. // Retrieve all data trees
  117. let sled_logs = datastore.logs.get_all()?;
  118. let sled_commits = datastore.commits.get_all()?;
  119. let sled_voted_for = datastore.voted_for.get_all()?;
  120. let sled_terms = datastore.current_term.get_all()?;
  121. // Parse retrieved data trees
  122. println!("Data extracted, parsing to viewable form...");
  123. // Logs
  124. let mut logs = vec![];
  125. for log in sled_logs {
  126. logs.push(Log { term: log.term, msg: deserialize(&log.msg)? });
  127. }
  128. // Commits
  129. let mut commits = vec![];
  130. for commit in &sled_commits {
  131. commits.push(Privmsg {
  132. id: commit.id,
  133. nickname: commit.nickname.clone(),
  134. channel: commit.channel.clone(),
  135. message: commit.message.clone(),
  136. });
  137. }
  138. // Voted for
  139. let mut voted_for = vec![];
  140. for vote in sled_voted_for {
  141. match vote {
  142. Some(v) => voted_for.push(Some(NodeId(v.0.clone()))),
  143. None => voted_for.push(None),
  144. }
  145. }
  146. // Terms
  147. let mut terms = vec![];
  148. for term in sled_terms {
  149. terms.push(term);
  150. }
  151. let info = Info::<Privmsg> { logs, commits, voted_for, terms };
  152. let info_string = format!("{:#?}", info);
  153. Ok(info_string)
  154. }
  155. #[async_std::main]
  156. async fn main() -> Result<()> {
  157. let info_string = extract_taud()?;
  158. // Generating file
  159. let file_path = "raft_db";
  160. println!("Data parsed, writing to file {:?}", file_path);
  161. let mut file = File::create(file_path)?;
  162. file.write(info_string.as_bytes())?;
  163. println!("File created!");
  164. Ok(())
  165. }