protocol_slab.rs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. use std::sync::Arc;
  2. use log::*;
  3. use smol::Executor;
  4. use crate::{
  5. darkpulse::{
  6. aes_decrypt, messages, CiphertextHash, ControlCommand, ControlMessage, SlabsManagerSafe,
  7. },
  8. error::Result as NetResult,
  9. net::{
  10. message_subscriber::MessageSubscription,
  11. protocols::{ProtocolJobsManager, ProtocolJobsManagerPtr},
  12. ChannelPtr,
  13. },
  14. serial::deserialize,
  15. };
  16. pub struct ProtocolSlab {
  17. channel: ChannelPtr,
  18. slabman: SlabsManagerSafe,
  19. sync_sub: MessageSubscription<messages::SyncMessage>,
  20. inv_sub: MessageSubscription<messages::InvMessage>,
  21. get_slabs_sub: MessageSubscription<messages::GetSlabsMessage>,
  22. slab_sub: MessageSubscription<messages::SlabMessage>,
  23. jobsman: ProtocolJobsManagerPtr,
  24. }
  25. impl ProtocolSlab {
  26. pub async fn new(slabman: SlabsManagerSafe, channel: ChannelPtr) -> Arc<Self> {
  27. let sync_sub = channel
  28. .clone()
  29. .subscribe_msg::<messages::SyncMessage>()
  30. .await
  31. .expect("Missing sync dispatcher!");
  32. let inv_sub = channel
  33. .clone()
  34. .subscribe_msg::<messages::InvMessage>()
  35. .await
  36. .expect("Missing inv dispatcher!");
  37. let get_slabs_sub = channel
  38. .clone()
  39. .subscribe_msg::<messages::GetSlabsMessage>()
  40. .await
  41. .expect("Missing getslabs dispatcher!");
  42. let slab_sub = channel
  43. .clone()
  44. .subscribe_msg::<messages::SlabMessage>()
  45. .await
  46. .expect("Missing slab dispatcher!");
  47. Arc::new(Self {
  48. channel: channel.clone(),
  49. slabman,
  50. sync_sub,
  51. inv_sub,
  52. get_slabs_sub,
  53. slab_sub,
  54. jobsman: ProtocolJobsManager::new("ProtocolSlab", channel),
  55. })
  56. }
  57. pub async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) {
  58. debug!(target: "net", "ProtocolSlab::start() [START]");
  59. self.jobsman.clone().start(executor.clone());
  60. self.jobsman.clone().spawn(self.clone().handle_receive_sync(), executor.clone()).await;
  61. self.jobsman.clone().spawn(self.clone().handle_receive_inv(), executor.clone()).await;
  62. self.jobsman.clone().spawn(self.clone().handle_receive_get_slabs(), executor.clone()).await;
  63. self.jobsman.clone().spawn(self.clone().handle_receive_slab(), executor).await;
  64. let _ = self.channel.send(messages::SyncMessage {}).await;
  65. debug!(target: "net", "ProtocolSlab::start() [END]");
  66. }
  67. async fn handle_receive_sync(self: Arc<Self>) -> NetResult<()> {
  68. debug!(target: "net", "ProtocolSlab::handle_receive_sync() [START]");
  69. loop {
  70. let _sync_msg = self.sync_sub.receive().await?;
  71. let slab_hashs = self.slabman.lock().await.get_slabs_hash();
  72. let inv_msg = messages::InvMessage { slabs_hash: slab_hashs.clone() };
  73. self.channel.send(inv_msg).await?;
  74. info!("receive sync message!");
  75. }
  76. }
  77. async fn handle_receive_inv(self: Arc<Self>) -> NetResult<()> {
  78. debug!(target: "net", "ProtocolSlab::handle_receive_inv() [START]");
  79. loop {
  80. let inv_msg = self.inv_sub.receive().await?;
  81. let mut list_of_hash: Vec<CiphertextHash> = vec![];
  82. let slabs_hash = self.slabman.lock().await.get_slabs_hash();
  83. for slab in inv_msg.slabs_hash.iter() {
  84. if !slabs_hash.contains(slab) {
  85. list_of_hash.push(*slab);
  86. }
  87. }
  88. let getslabs_msg = messages::GetSlabsMessage { slabs_hash: list_of_hash };
  89. self.channel.send(getslabs_msg).await?;
  90. info!("receive inv message!");
  91. }
  92. }
  93. async fn handle_receive_get_slabs(self: Arc<Self>) -> NetResult<()> {
  94. debug!(target: "net", "ProtocolSlab::handle_receive_get_slabs() [START]");
  95. loop {
  96. let get_slabs_msg = self.get_slabs_sub.receive().await?;
  97. for slab_hash in get_slabs_msg.slabs_hash.iter() {
  98. let slabman = self.slabman.lock().await;
  99. let slab = slabman.get_slab(slab_hash);
  100. if let Some(slab) = slab {
  101. self.channel.send(slab.clone()).await?;
  102. }
  103. }
  104. info!("receive getslabs message!");
  105. }
  106. }
  107. async fn handle_receive_slab(self: Arc<Self>) -> NetResult<()> {
  108. debug!(target: "net", "ProtocolSlab::handle_receive_slab() [START]");
  109. loop {
  110. let slab_msg = self.slab_sub.receive().await?;
  111. info!("receive slab message!");
  112. let channels = self.slabman.lock().await.get_channels().unwrap_or_default();
  113. let slab = messages::SlabMessage {
  114. nonce: slab_msg.nonce,
  115. ciphertext: slab_msg.ciphertext.clone(),
  116. };
  117. for channel in channels.iter() {
  118. if let Some(plaintext) = aes_decrypt(
  119. &channel.get_channel_secret(),
  120. &slab_msg.nonce,
  121. slab_msg.ciphertext.clone(),
  122. ) {
  123. self.slabman
  124. .lock()
  125. .await
  126. .add_new_slab(slab.clone())
  127. .await
  128. .expect("error during adding new slab to database");
  129. let des_plaintext: ControlMessage = deserialize(&plaintext[..])
  130. .expect("error during deserializing the message");
  131. match des_plaintext.control {
  132. ControlCommand::Join => {
  133. info!("{} joined the group", des_plaintext.payload.nickname);
  134. }
  135. ControlCommand::Leave => {
  136. info!("{} left the group", des_plaintext.payload.nickname);
  137. }
  138. ControlCommand::Message => {
  139. info!(
  140. "{} -> {}: {}",
  141. des_plaintext.payload.timestamp,
  142. des_plaintext.payload.nickname,
  143. des_plaintext.payload.text
  144. );
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. }