cleanup
This commit is contained in:
		| @@ -14,17 +14,17 @@ pub async fn test_signed_node_info() { | ||||
|         let vcrypto = crypto.get(ck).unwrap(); | ||||
|  | ||||
|         // Test direct | ||||
|         let node_info = NodeInfo { | ||||
|             network_class: NetworkClass::InboundCapable, | ||||
|             outbound_protocols: ProtocolTypeSet::all(), | ||||
|             address_types: AddressTypeSet::all(), | ||||
|             envelope_support: VALID_ENVELOPE_VERSIONS.to_vec(), | ||||
|             crypto_support: VALID_CRYPTO_KINDS.to_vec(), | ||||
|             dial_info_detail_list: vec![DialInfoDetail { | ||||
|         let node_info = NodeInfo::new( | ||||
|             NetworkClass::InboundCapable, | ||||
|             ProtocolTypeSet::all(), | ||||
|             AddressTypeSet::all(), | ||||
|             VALID_ENVELOPE_VERSIONS.to_vec(), | ||||
|             VALID_CRYPTO_KINDS.to_vec(), | ||||
|             vec![DialInfoDetail { | ||||
|                 class: DialInfoClass::Mapped, | ||||
|                 dial_info: DialInfo::udp(SocketAddress::default()), | ||||
|             }], | ||||
|         }; | ||||
|         ); | ||||
|  | ||||
|         // Test correct validation | ||||
|         let keypair = vcrypto.generate_keypair(); | ||||
| @@ -48,7 +48,6 @@ pub async fn test_signed_node_info() { | ||||
|         // Test incorrect validation | ||||
|         let keypair1 = vcrypto.generate_keypair(); | ||||
|         let tks1: TypedKeySet = TypedKey::new(ck, keypair1.key).into(); | ||||
|         let oldtks1len = tks1.len(); | ||||
|         let sdni = SignedDirectNodeInfo::new( | ||||
|             node_info.clone(), | ||||
|             sni.timestamp(), | ||||
| @@ -69,17 +68,17 @@ pub async fn test_signed_node_info() { | ||||
|         assert_eq!(sdnifake.signatures().len(), sigsfake.len()); | ||||
|  | ||||
|         // Test relayed | ||||
|         let node_info2 = NodeInfo { | ||||
|             network_class: NetworkClass::OutboundOnly, | ||||
|             outbound_protocols: ProtocolTypeSet::all(), | ||||
|             address_types: AddressTypeSet::all(), | ||||
|             envelope_support: VALID_ENVELOPE_VERSIONS.to_vec(), | ||||
|             crypto_support: VALID_CRYPTO_KINDS.to_vec(), | ||||
|             dial_info_detail_list: vec![DialInfoDetail { | ||||
|         let node_info2 = NodeInfo::new( | ||||
|             NetworkClass::OutboundOnly, | ||||
|             ProtocolTypeSet::all(), | ||||
|             AddressTypeSet::all(), | ||||
|             VALID_ENVELOPE_VERSIONS.to_vec(), | ||||
|             VALID_CRYPTO_KINDS.to_vec(), | ||||
|             vec![DialInfoDetail { | ||||
|                 class: DialInfoClass::Blocked, | ||||
|                 dial_info: DialInfo::udp(SocketAddress::default()), | ||||
|             }], | ||||
|         }; | ||||
|         ); | ||||
|  | ||||
|         // Test correct validation | ||||
|         let keypair2 = vcrypto.generate_keypair(); | ||||
| @@ -109,7 +108,6 @@ pub async fn test_signed_node_info() { | ||||
|         // Test incorrect validation | ||||
|         let keypair3 = vcrypto.generate_keypair(); | ||||
|         let tks3: TypedKeySet = TypedKey::new(ck, keypair3.key).into(); | ||||
|         let oldtks3len = tks3.len(); | ||||
|  | ||||
|         let srni = SignedRelayedNodeInfo::new( | ||||
|             node_info2.clone(), | ||||
|   | ||||
| @@ -27,5 +27,5 @@ impl LowLevelProtocolType { | ||||
|         matches!(self, LowLevelProtocolType::TCP) | ||||
|     } | ||||
| } | ||||
| pub type LowLevelProtocolTypeSet = EnumSet<LowLevelProtocolType>; | ||||
|  | ||||
| // pub type LowLevelProtocolTypeSet = EnumSet<LowLevelProtocolType>; | ||||
|   | ||||
| @@ -136,6 +136,7 @@ impl BucketEntryInner { | ||||
|     /// Returns Ok(None) if no previous existing node id was associated with that crypto kind | ||||
|     /// Results Err() if this operation would add more crypto kinds than we support | ||||
|     pub fn add_node_id(&mut self, node_id: TypedKey) -> EyreResult<Option<TypedKey>> { | ||||
|         let total_node_id_count = self.validated_node_ids.len() + self.unsupported_node_ids.len(); | ||||
|         let node_ids = if VALID_CRYPTO_KINDS.contains(&node_id.kind) { | ||||
|             &mut self.validated_node_ids | ||||
|         } else { | ||||
| @@ -152,7 +153,7 @@ impl BucketEntryInner { | ||||
|             return Ok(Some(old_node_id)); | ||||
|         } | ||||
|         // Check to ensure we aren't adding more crypto kinds than we support | ||||
|         if self.validated_node_ids.len() + self.unsupported_node_ids.len() == MAX_CRYPTO_KINDS { | ||||
|         if total_node_id_count == MAX_CRYPTO_KINDS { | ||||
|             bail!("too many crypto kinds for this node"); | ||||
|         } | ||||
|         node_ids.add(node_id); | ||||
| @@ -345,10 +346,10 @@ impl BucketEntryInner { | ||||
|         }; | ||||
|         // Peer info includes all node ids, even unvalidated ones | ||||
|         let node_ids = self.node_ids(); | ||||
|         opt_current_sni.as_ref().map(|s| PeerInfo { | ||||
|         opt_current_sni.as_ref().map(|s| PeerInfo::new( | ||||
|             node_ids, | ||||
|             signed_node_info: *s.clone(), | ||||
|         }) | ||||
|             *s.clone(), | ||||
|         )) | ||||
|     } | ||||
|  | ||||
|     pub fn best_routing_domain( | ||||
| @@ -792,14 +793,14 @@ pub struct BucketEntry { | ||||
|  | ||||
| impl BucketEntry { | ||||
|     pub(super) fn new(first_node_id: TypedKey) -> Self { | ||||
|         let now = get_aligned_timestamp(); | ||||
|         let mut validated_node_ids = TypedKeySet::new(); | ||||
|         let mut unsupported_node_ids = TypedKeySet::new(); | ||||
|         validated_node_ids.add(first_node_id); | ||||
|  | ||||
|         // First node id should always be one we support since TypedKeySets are sorted and we must have at least one supported key | ||||
|         assert!(VALID_CRYPTO_KINDS.contains(&first_node_id.kind)); | ||||
|  | ||||
|         let now = get_aligned_timestamp(); | ||||
|         let inner = BucketEntryInner { | ||||
|             validated_node_ids, | ||||
|             unsupported_node_ids, | ||||
|             validated_node_ids: TypedKeySet::from(first_node_id), | ||||
|             unsupported_node_ids: TypedKeySet::new(), | ||||
|             envelope_support: Vec::new(), | ||||
|             updated_since_last_network_change: false, | ||||
|             last_connections: BTreeMap::new(), | ||||
|   | ||||
| @@ -329,14 +329,15 @@ impl RoutingTable { | ||||
|             let crypto_support = bsrec.node_ids.kinds(); | ||||
|  | ||||
|             // Make unsigned SignedNodeInfo | ||||
|             let sni = SignedNodeInfo::Direct(SignedDirectNodeInfo::with_no_signature(NodeInfo { | ||||
|                 network_class: NetworkClass::InboundCapable, // Bootstraps are always inbound capable | ||||
|                 outbound_protocols: ProtocolTypeSet::only(ProtocolType::UDP), // Bootstraps do not participate in relaying and will not make outbound requests, but will have UDP enabled | ||||
|                 address_types: AddressTypeSet::all(), // Bootstraps are always IPV4 and IPV6 capable | ||||
|                 envelope_support: bsrec.envelope_support, // Envelope support is as specified in the bootstrap list | ||||
|                 crypto_support, // Crypto support is derived from list of node ids | ||||
|                 dial_info_detail_list: bsrec.dial_info_details, // Dial info is as specified in the bootstrap list | ||||
|             })); | ||||
|             let sni = | ||||
|                 SignedNodeInfo::Direct(SignedDirectNodeInfo::with_no_signature(NodeInfo::new( | ||||
|                     NetworkClass::InboundCapable, // Bootstraps are always inbound capable | ||||
|                     ProtocolTypeSet::only(ProtocolType::UDP), // Bootstraps do not participate in relaying and will not make outbound requests, but will have UDP enabled | ||||
|                     AddressTypeSet::all(), // Bootstraps are always IPV4 and IPV6 capable | ||||
|                     bsrec.envelope_support, // Envelope support is as specified in the bootstrap list | ||||
|                     crypto_support,         // Crypto support is derived from list of node ids | ||||
|                     bsrec.dial_info_details, // Dial info is as specified in the bootstrap list | ||||
|                 ))); | ||||
|  | ||||
|             let pi = PeerInfo::new(bsrec.node_ids, sni); | ||||
|  | ||||
|   | ||||
| @@ -56,11 +56,6 @@ pub use typed_signature::*; | ||||
|  | ||||
| use super::*; | ||||
|  | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct DecodeContext { | ||||
|     config: VeilidConfig, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone)] | ||||
| pub enum QuestionContext { | ||||
|     GetValue(ValidateGetValueContext), | ||||
| @@ -69,7 +64,7 @@ pub enum QuestionContext { | ||||
|  | ||||
| #[derive(Clone)] | ||||
| pub struct RPCValidateContext { | ||||
|     crypto: Crypto, | ||||
|     rpc_processor: RPCProcessor, | ||||
|     question_context: Option<QuestionContext>, | ||||
|     pub crypto: Crypto, | ||||
|     pub rpc_processor: RPCProcessor, | ||||
|     pub question_context: Option<QuestionContext>, | ||||
| } | ||||
|   | ||||
| @@ -133,10 +133,7 @@ impl RPCOperation { | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     pub fn decode( | ||||
|         context: &DecodeContext, | ||||
|         operation_reader: &veilid_capnp::operation::Reader, | ||||
|     ) -> Result<Self, RPCError> { | ||||
|     pub fn decode(operation_reader: &veilid_capnp::operation::Reader) -> Result<Self, RPCError> { | ||||
|         let op_id = OperationId::new(operation_reader.get_op_id()); | ||||
|  | ||||
|         let sender_peer_info = if operation_reader.has_sender_peer_info() { | ||||
|   | ||||
| @@ -5,9 +5,9 @@ const MAX_GET_VALUE_A_PEERS_LEN: usize = 20; | ||||
|  | ||||
| #[derive(Clone)] | ||||
| pub struct ValidateGetValueContext { | ||||
|     last_descriptor: Option<SignedValueDescriptor>, | ||||
|     subkey: ValueSubkey, | ||||
|     vcrypto: CryptoSystemVersion, | ||||
|     pub last_descriptor: Option<SignedValueDescriptor>, | ||||
|     pub subkey: ValueSubkey, | ||||
|     pub vcrypto: CryptoSystemVersion, | ||||
| } | ||||
|  | ||||
| impl fmt::Debug for ValidateGetValueContext { | ||||
|   | ||||
| @@ -6,7 +6,7 @@ pub struct RPCOperationReturnReceipt { | ||||
| } | ||||
|  | ||||
| impl RPCOperationReturnReceipt { | ||||
|     pub fn new(receipt: &[u8]) -> Result<Self, RPCError> { | ||||
|     pub fn new(receipt: Vec<u8>) -> Result<Self, RPCError> { | ||||
|         if receipt.len() < MIN_RECEIPT_SIZE { | ||||
|             return Err(RPCError::protocol("ReturnReceipt receipt too short to set")); | ||||
|         } | ||||
| @@ -14,9 +14,7 @@ impl RPCOperationReturnReceipt { | ||||
|             return Err(RPCError::protocol("ReturnReceipt receipt too long to set")); | ||||
|         } | ||||
|  | ||||
|         Ok(Self { | ||||
|             receipt: receipt.to_vec(), | ||||
|         }) | ||||
|         Ok(Self { receipt }) | ||||
|     } | ||||
|     pub fn validate(&mut self, _validate_context: &RPCValidateContext) -> Result<(), RPCError> { | ||||
|         Ok(()) | ||||
|   | ||||
| @@ -44,8 +44,5 @@ pub fn decode_peer_info(reader: &veilid_capnp::peer_info::Reader) -> Result<Peer | ||||
|     if node_ids.len() == 0 { | ||||
|         return Err(RPCError::protocol("no verified node ids")); | ||||
|     } | ||||
|     Ok(PeerInfo { | ||||
|         node_ids, | ||||
|         signed_node_info, | ||||
|     }) | ||||
|     Ok(PeerInfo::new(node_ids, signed_node_info)) | ||||
| } | ||||
|   | ||||
| @@ -312,7 +312,7 @@ impl RPCProcessor { | ||||
|     } | ||||
|  | ||||
|     pub fn set_storage_manager(&self, opt_storage_manager: Option<StorageManager>) { | ||||
|         let inner = self.inner.lock(); | ||||
|         let mut inner = self.inner.lock(); | ||||
|         inner.opt_storage_manager = opt_storage_manager | ||||
|     } | ||||
|  | ||||
| @@ -555,10 +555,7 @@ impl RPCProcessor { | ||||
|  | ||||
|         // Prepare route operation | ||||
|         let sr_hop_count = compiled_route.safety_route.hop_count; | ||||
|         let route_operation = RPCOperationRoute { | ||||
|             safety_route: compiled_route.safety_route, | ||||
|             operation, | ||||
|         }; | ||||
|         let route_operation = RPCOperationRoute::new(compiled_route.safety_route, operation); | ||||
|         let ssni_route = | ||||
|             self.get_sender_peer_info(&Destination::direct(compiled_route.first_hop.clone())); | ||||
|         let operation = RPCOperation::new_statement( | ||||
| @@ -1216,18 +1213,15 @@ impl RPCProcessor { | ||||
|             .get_root::<veilid_capnp::operation::Reader>() | ||||
|             .map_err(RPCError::protocol) | ||||
|             .map_err(logthru_rpc!())?; | ||||
|         let decode_context = DecodeContext { | ||||
|             config: self.config.clone(), | ||||
|         }; | ||||
|         let operation = RPCOperation::decode(&decode_context, &op_reader)?; | ||||
|         let mut operation = RPCOperation::decode(&op_reader)?; | ||||
|  | ||||
|         // Validate the RPC message | ||||
|         self.validate_rpc_operation(&operation)?; | ||||
|         self.validate_rpc_operation(&mut operation)?; | ||||
|  | ||||
|         Ok(operation) | ||||
|     } | ||||
|  | ||||
|     fn validate_rpc_operation(&self, operation: &RPCOperation) -> Result<(), RPCError> { | ||||
|     fn validate_rpc_operation(&self, operation: &mut RPCOperation) -> Result<(), RPCError> { | ||||
|         // If this is an answer, get the question context for this answer | ||||
|         // If we received an answer for a question we did not ask, this will return an error | ||||
|         let question_context = if let RPCOperationKind::Answer(_) = operation.kind() { | ||||
| @@ -1260,7 +1254,10 @@ impl RPCProcessor { | ||||
|         let msg = match &encoded_msg.header.detail { | ||||
|             RPCMessageHeaderDetail::Direct(detail) => { | ||||
|                 // Decode and validate the RPC operation | ||||
|                 let operation = self.decode_rpc_operation(&encoded_msg)?; | ||||
|                 let operation = match self.decode_rpc_operation(&encoded_msg) { | ||||
|                     Ok(v) => v, | ||||
|                     Err(e) => return Ok(NetworkResult::invalid_message(e)), | ||||
|                 }; | ||||
|  | ||||
|                 // Get the routing domain this message came over | ||||
|                 let routing_domain = detail.routing_domain; | ||||
|   | ||||
| @@ -100,7 +100,7 @@ where | ||||
|  | ||||
|     /// Get operation context | ||||
|     pub fn get_op_context(&self, op_id: OperationId) -> Result<C, RPCError> { | ||||
|         let mut inner = self.inner.lock(); | ||||
|         let inner = self.inner.lock(); | ||||
|         let Some(waiting_op) = inner.waiting_op_table.get(&op_id) else { | ||||
|             return Err(RPCError::internal("Missing operation id getting op context")); | ||||
|         }; | ||||
|   | ||||
| @@ -9,7 +9,7 @@ impl RPCProcessor { | ||||
|         dest: Destination, | ||||
|         message: Vec<u8>, | ||||
|     ) -> Result<NetworkResult<Answer<Vec<u8>>>, RPCError> { | ||||
|         let app_call_q = RPCOperationAppCallQ::new(&message)?; | ||||
|         let app_call_q = RPCOperationAppCallQ::new(message)?; | ||||
|         let question = RPCQuestion::new( | ||||
|             network_result_try!(self.get_destination_respond_to(&dest)?), | ||||
|             RPCQuestionDetail::AppCallQ(app_call_q), | ||||
| @@ -91,7 +91,7 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Return the appcall answer | ||||
|         let app_call_a = RPCOperationAppCallA::new(&message_a)?; | ||||
|         let app_call_a = RPCOperationAppCallA::new(message_a)?; | ||||
|  | ||||
|         // Send status answer | ||||
|         self.answer(msg, RPCAnswer::new(RPCAnswerDetail::AppCallA(app_call_a))) | ||||
|   | ||||
| @@ -9,7 +9,7 @@ impl RPCProcessor { | ||||
|         dest: Destination, | ||||
|         message: Vec<u8>, | ||||
|     ) -> Result<NetworkResult<()>, RPCError> { | ||||
|         let app_message = RPCOperationAppMessage { message }; | ||||
|         let app_message = RPCOperationAppMessage::new(message)?; | ||||
|         let statement = RPCStatement::new(RPCStatementDetail::AppMessage(app_message)); | ||||
|  | ||||
|         // Send the app message request | ||||
| @@ -22,7 +22,7 @@ impl RPCProcessor { | ||||
|         msg: RPCMessage, | ||||
|     ) -> Result<NetworkResult<()>, RPCError> { | ||||
|         // Get the statement | ||||
|         let (op_id, _, _, kind) = msg.operation.destructure(); | ||||
|         let (_, _, _, kind) = msg.operation.destructure(); | ||||
|         let app_message = match kind { | ||||
|             RPCOperationKind::Statement(s) => match s.destructure() { | ||||
|                 RPCStatementDetail::AppMessage(s) => s, | ||||
|   | ||||
| @@ -1,8 +1,12 @@ | ||||
| use super::*; | ||||
| use crate::storage_manager::SignedValueDescriptor; | ||||
| use crate::storage_manager::{SignedValueData, SignedValueDescriptor}; | ||||
|  | ||||
| #[derive(Clone, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)] | ||||
| pub enum GetValueAnswer {} | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct GetValueAnswer { | ||||
|     pub value: Option<SignedValueData>, | ||||
|     pub peers: Vec<PeerInfo>, | ||||
|     pub descriptor: Option<SignedValueDescriptor>, | ||||
| } | ||||
|  | ||||
| impl RPCProcessor { | ||||
|     // Sends a get value request and wait for response | ||||
| @@ -44,17 +48,24 @@ impl RPCProcessor { | ||||
|  | ||||
|         // Get the right answer type | ||||
|         let (_, _, _, kind) = msg.operation.destructure(); | ||||
|         let app_call_a = match kind { | ||||
|         let get_value_a = match kind { | ||||
|             RPCOperationKind::Answer(a) => match a.destructure() { | ||||
|                 RPCAnswerDetail::AppCallA(a) => a, | ||||
|                 _ => return Err(RPCError::invalid_format("not an appcall answer")), | ||||
|                 RPCAnswerDetail::GetValueA(a) => a, | ||||
|                 _ => return Err(RPCError::invalid_format("not a getvalue answer")), | ||||
|             }, | ||||
|             _ => return Err(RPCError::invalid_format("not an answer")), | ||||
|         }; | ||||
|  | ||||
|         let a_message = app_call_a.destructure(); | ||||
|         let (value, peers, descriptor) = get_value_a.destructure(); | ||||
|  | ||||
|         Ok(NetworkResult::value(Answer::new(latency, a_message))) | ||||
|         Ok(NetworkResult::value(Answer::new( | ||||
|             latency, | ||||
|             GetValueAnswer { | ||||
|                 value, | ||||
|                 peers, | ||||
|                 descriptor, | ||||
|             }, | ||||
|         ))) | ||||
|     } | ||||
|  | ||||
|     #[instrument(level = "trace", skip(self, msg), fields(msg.operation.op_id), ret, err)] | ||||
|   | ||||
| @@ -11,7 +11,7 @@ impl RPCProcessor { | ||||
|     ) -> Result<NetworkResult<()>, RPCError> { | ||||
|         let receipt = receipt.as_ref().to_vec(); | ||||
|  | ||||
|         let return_receipt = RPCOperationReturnReceipt { receipt }; | ||||
|         let return_receipt = RPCOperationReturnReceipt::new(receipt)?; | ||||
|         let statement = RPCStatement::new(RPCStatementDetail::ReturnReceipt(return_receipt)); | ||||
|  | ||||
|         // Send the return_receipt request | ||||
| @@ -27,9 +27,9 @@ impl RPCProcessor { | ||||
|     ) -> Result<NetworkResult<()>, RPCError> { | ||||
|         // Get the statement | ||||
|         let (_, _, _, kind) = msg.operation.destructure(); | ||||
|         let RPCOperationReturnReceipt { receipt } = match kind { | ||||
|         let receipt = match kind { | ||||
|             RPCOperationKind::Statement(s) => match s.destructure() { | ||||
|                 RPCStatementDetail::ReturnReceipt(s) => s, | ||||
|                 RPCStatementDetail::ReturnReceipt(s) => s.destructure(), | ||||
|                 _ => panic!("not a return receipt"), | ||||
|             }, | ||||
|             _ => panic!("not a statement"), | ||||
|   | ||||
| @@ -34,17 +34,17 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Apply sequencing preference | ||||
|         next_hop_nr.set_sequencing(routed_operation.sequencing); | ||||
|         next_hop_nr.set_sequencing(routed_operation.sequencing()); | ||||
|  | ||||
|         // Pass along the route | ||||
|         let next_hop_route = RPCOperationRoute { | ||||
|             safety_route: SafetyRoute { | ||||
|         let next_hop_route = RPCOperationRoute::new( | ||||
|             SafetyRoute { | ||||
|                 public_key: safety_route.public_key, | ||||
|                 hop_count: safety_route.hop_count - 1, | ||||
|                 hops: SafetyRouteHops::Data(route_hop.next_hop.unwrap()), | ||||
|             }, | ||||
|             operation: routed_operation, | ||||
|         }; | ||||
|             routed_operation, | ||||
|         ); | ||||
|         let next_hop_route_stmt = RPCStatement::new(RPCStatementDetail::Route(next_hop_route)); | ||||
|  | ||||
|         // Send the next route statement | ||||
| @@ -76,17 +76,17 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Apply sequencing preference | ||||
|         next_hop_nr.set_sequencing(routed_operation.sequencing); | ||||
|         next_hop_nr.set_sequencing(routed_operation.sequencing()); | ||||
|  | ||||
|         // Pass along the route | ||||
|         let next_hop_route = RPCOperationRoute { | ||||
|             safety_route: SafetyRoute { | ||||
|         let next_hop_route = RPCOperationRoute::new( | ||||
|             SafetyRoute { | ||||
|                 public_key: safety_route_public_key, | ||||
|                 hop_count: 0, | ||||
|                 hops: SafetyRouteHops::Private(next_private_route), | ||||
|             }, | ||||
|             operation: routed_operation, | ||||
|         }; | ||||
|             routed_operation, | ||||
|         ); | ||||
|         let next_hop_route_stmt = RPCStatement::new(RPCStatementDetail::Route(next_hop_route)); | ||||
|  | ||||
|         // Send the next route statement | ||||
| @@ -114,8 +114,8 @@ impl RPCProcessor { | ||||
|             .cached_dh(&remote_sr_pubkey.value, &node_id_secret) | ||||
|             .map_err(RPCError::protocol)?; | ||||
|         let body = match vcrypto.decrypt_aead( | ||||
|             &routed_operation.data, | ||||
|             &routed_operation.nonce, | ||||
|             routed_operation.data(), | ||||
|             routed_operation.nonce(), | ||||
|             &dh_secret, | ||||
|             None, | ||||
|         ) { | ||||
| @@ -132,7 +132,7 @@ impl RPCProcessor { | ||||
|         self.enqueue_safety_routed_message( | ||||
|             detail, | ||||
|             remote_sr_pubkey.value, | ||||
|             routed_operation.sequencing, | ||||
|             routed_operation.sequencing(), | ||||
|             body, | ||||
|         ) | ||||
|         .map_err(RPCError::internal)?; | ||||
| @@ -162,8 +162,8 @@ impl RPCProcessor { | ||||
|         let Some((secret_key, safety_spec)) = rss | ||||
|             .with_signature_validated_route( | ||||
|                 &pr_pubkey, | ||||
|                 &routed_operation.signatures, | ||||
|                 &routed_operation.data, | ||||
|                 routed_operation.signatures(), | ||||
|                 routed_operation.data(), | ||||
|                 sender_id.value, | ||||
|                 |rssd, rsd| {  | ||||
|                     ( | ||||
| @@ -172,7 +172,7 @@ impl RPCProcessor { | ||||
|                             preferred_route, | ||||
|                             hop_count: rssd.hop_count(), | ||||
|                             stability: rssd.get_stability(), | ||||
|                             sequencing: routed_operation.sequencing, | ||||
|                             sequencing: routed_operation.sequencing(), | ||||
|                         }, | ||||
|                     ) | ||||
|                 } | ||||
| @@ -188,8 +188,8 @@ impl RPCProcessor { | ||||
|             .map_err(RPCError::protocol)?; | ||||
|         let body = vcrypto | ||||
|             .decrypt_aead( | ||||
|                 &routed_operation.data, | ||||
|                 &routed_operation.nonce, | ||||
|                 routed_operation.data(), | ||||
|                 routed_operation.nonce(), | ||||
|                 &dh_secret, | ||||
|                 None, | ||||
|             ) | ||||
| @@ -353,9 +353,9 @@ impl RPCProcessor { | ||||
|             let node_id = self.routing_table.node_id(crypto_kind); | ||||
|             let node_id_secret = self.routing_table.node_id_secret_key(crypto_kind); | ||||
|             let sig = vcrypto | ||||
|                 .sign(&node_id.value, &node_id_secret, &route_operation.data) | ||||
|                 .sign(&node_id.value, &node_id_secret, route_operation.data()) | ||||
|                 .map_err(RPCError::internal)?; | ||||
|             route_operation.signatures.push(sig); | ||||
|             route_operation.add_signature(sig); | ||||
|         } | ||||
|  | ||||
|         Ok(NetworkResult::value(route_hop)) | ||||
| @@ -378,7 +378,7 @@ impl RPCProcessor { | ||||
|  | ||||
|         // Get the statement | ||||
|         let (_,_,_,kind) = msg.operation.destructure(); | ||||
|         let mut route = match kind { | ||||
|         let route = match kind { | ||||
|             RPCOperationKind::Statement(s) => match s.destructure() { | ||||
|                 RPCStatementDetail::Route(s) => s, | ||||
|                 _ => panic!("not a route statement"), | ||||
| @@ -387,7 +387,7 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Get crypto kind | ||||
|         let crypto_kind = route.safety_route.crypto_kind(); | ||||
|         let crypto_kind = route.safety_route().crypto_kind(); | ||||
|         let Some(vcrypto) = self.crypto.get(crypto_kind) else { | ||||
|             return Ok(NetworkResult::invalid_message( | ||||
|                 "routed operation crypto is not supported", | ||||
| @@ -395,13 +395,14 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // See what kind of safety route we have going on here | ||||
|         match route.safety_route.hops { | ||||
|         let (safety_route, mut routed_operation) = route.destructure(); | ||||
|         match safety_route.hops { | ||||
|             // There is a safety route hop | ||||
|             SafetyRouteHops::Data(ref route_hop_data) => { | ||||
|                 // Decrypt the blob with DEC(nonce, DH(the SR's public key, this hop's secret) | ||||
|                 let node_id_secret = self.routing_table.node_id_secret_key(crypto_kind); | ||||
|                 let dh_secret = vcrypto | ||||
|                     .cached_dh(&route.safety_route.public_key.value, &node_id_secret) | ||||
|                     .cached_dh(&safety_route.public_key.value, &node_id_secret) | ||||
|                     .map_err(RPCError::protocol)?; | ||||
|                 let mut dec_blob_data = vcrypto | ||||
|                     .decrypt_aead( | ||||
| @@ -435,8 +436,8 @@ impl RPCProcessor { | ||||
|                     // Switching from full safety route to private route first hop | ||||
|                     network_result_try!( | ||||
|                         self.process_private_route_first_hop( | ||||
|                             route.operation, | ||||
|                             route.safety_route.public_key, | ||||
|                             routed_operation, | ||||
|                             safety_route.public_key, | ||||
|                             private_route, | ||||
|                         ) | ||||
|                         .await? | ||||
| @@ -456,9 +457,9 @@ impl RPCProcessor { | ||||
|                     // Continue the full safety route with another hop | ||||
|                     network_result_try!( | ||||
|                         self.process_route_safety_route_hop( | ||||
|                             route.operation, | ||||
|                             routed_operation, | ||||
|                             route_hop, | ||||
|                             route.safety_route | ||||
|                             safety_route | ||||
|                         ) | ||||
|                         .await? | ||||
|                     ); | ||||
| @@ -474,8 +475,8 @@ impl RPCProcessor { | ||||
|                         // Safety route was a stub, start with the beginning of the private route | ||||
|                         network_result_try!( | ||||
|                             self.process_private_route_first_hop( | ||||
|                                 route.operation, | ||||
|                                 route.safety_route.public_key, | ||||
|                                 routed_operation, | ||||
|                                 safety_route.public_key, | ||||
|                                 private_route, | ||||
|                             ) | ||||
|                             .await? | ||||
| @@ -486,7 +487,7 @@ impl RPCProcessor { | ||||
|                         let route_hop = network_result_try!(self.decrypt_private_route_hop_data( | ||||
|                             &route_hop_data, | ||||
|                             &private_route.public_key, | ||||
|                             &mut route.operation | ||||
|                             &mut routed_operation | ||||
|                         )?); | ||||
|  | ||||
|                         // Ensure hop count > 0 | ||||
| @@ -499,9 +500,9 @@ impl RPCProcessor { | ||||
|                         // Make next PrivateRoute and pass it on | ||||
|                         network_result_try!( | ||||
|                             self.process_route_private_route_hop( | ||||
|                                 route.operation, | ||||
|                                 routed_operation, | ||||
|                                 route_hop.node, | ||||
|                                 route.safety_route.public_key, | ||||
|                                 safety_route.public_key, | ||||
|                                 PrivateRoute { | ||||
|                                     public_key: private_route.public_key, | ||||
|                                     hop_count: private_route.hop_count - 1, | ||||
| @@ -521,7 +522,7 @@ impl RPCProcessor { | ||||
|                                 "route should be at the end", | ||||
|                             )); | ||||
|                         } | ||||
|                         if route.safety_route.hop_count != 0 { | ||||
|                         if safety_route.hop_count != 0 { | ||||
|                             return Ok(NetworkResult::invalid_message( | ||||
|                                 "Safety hop count should be zero if switched to private route", | ||||
|                             )); | ||||
| @@ -531,8 +532,8 @@ impl RPCProcessor { | ||||
|                         network_result_try!(self.process_routed_operation( | ||||
|                             detail, | ||||
|                             vcrypto, | ||||
|                             route.operation, | ||||
|                             route.safety_route.public_key, | ||||
|                             routed_operation, | ||||
|                             safety_route.public_key, | ||||
|                             private_route.public_key, | ||||
|                         )?); | ||||
|                     } | ||||
|   | ||||
| @@ -22,7 +22,7 @@ impl RPCProcessor { | ||||
|             )); | ||||
|         } | ||||
|  | ||||
|         let signal = RPCOperationSignal { signal_info }; | ||||
|         let signal = RPCOperationSignal::new(signal_info); | ||||
|         let statement = RPCStatement::new(RPCStatementDetail::Signal(signal)); | ||||
|  | ||||
|         // Send the signal request | ||||
|   | ||||
| @@ -68,7 +68,7 @@ impl RPCProcessor { | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         let status_q = RPCOperationStatusQ { node_status }; | ||||
|         let status_q = RPCOperationStatusQ::new(node_status); | ||||
|         let question = RPCQuestion::new( | ||||
|             network_result_try!(self.get_destination_respond_to(&dest)?), | ||||
|             RPCQuestionDetail::StatusQ(status_q), | ||||
| @@ -88,8 +88,9 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Get the right answer type | ||||
|         let status_a = match msg.operation.into_kind() { | ||||
|             RPCOperationKind::Answer(a) => match a.into_detail() { | ||||
|         let (_, _, _, kind) = msg.operation.destructure(); | ||||
|         let status_a = match kind { | ||||
|             RPCOperationKind::Answer(a) => match a.destructure() { | ||||
|                 RPCAnswerDetail::StatusA(a) => a, | ||||
|                 _ => return Err(RPCError::invalid_format("not a status answer")), | ||||
|             }, | ||||
| @@ -98,7 +99,7 @@ impl RPCProcessor { | ||||
|  | ||||
|         // Ensure the returned node status is the kind for the routing domain we asked for | ||||
|         if let Some(target_nr) = opt_target_nr { | ||||
|             if let Some(node_status) = status_a.node_status { | ||||
|             if let Some(node_status) = status_a.node_status() { | ||||
|                 match routing_domain { | ||||
|                     RoutingDomain::PublicInternet => { | ||||
|                         if !matches!(node_status, NodeStatus::PublicInternet(_)) { | ||||
| @@ -117,7 +118,7 @@ impl RPCProcessor { | ||||
|                 } | ||||
|  | ||||
|                 // Update latest node status in routing table | ||||
|                 target_nr.update_node_status(node_status); | ||||
|                 target_nr.update_node_status(node_status.clone()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -131,7 +132,7 @@ impl RPCProcessor { | ||||
|                 safety_selection, | ||||
|             } => { | ||||
|                 if matches!(safety_selection, SafetySelection::Unsafe(_)) { | ||||
|                     if let Some(sender_info) = status_a.sender_info { | ||||
|                     if let Some(sender_info) = status_a.sender_info() { | ||||
|                         match send_data_kind { | ||||
|                             SendDataKind::Direct(connection_descriptor) => { | ||||
|                                 // Directly requested status that actually gets sent directly and not over a relay will tell us what our IP address appears as | ||||
| @@ -199,7 +200,7 @@ impl RPCProcessor { | ||||
|                 let routing_domain = detail.routing_domain; | ||||
|  | ||||
|                 // Ensure the node status from the question is the kind for the routing domain we received the request in | ||||
|                 if let Some(node_status) = &status_q.node_status { | ||||
|                 if let Some(node_status) = status_q.node_status() { | ||||
|                     match routing_domain { | ||||
|                         RoutingDomain::PublicInternet => { | ||||
|                             if !matches!(node_status, NodeStatus::PublicInternet(_)) { | ||||
| @@ -244,10 +245,7 @@ impl RPCProcessor { | ||||
|         }; | ||||
|  | ||||
|         // Make status answer | ||||
|         let status_a = RPCOperationStatusA { | ||||
|             node_status, | ||||
|             sender_info, | ||||
|         }; | ||||
|         let status_a = RPCOperationStatusA::new(node_status, sender_info); | ||||
|  | ||||
|         // Send status answer | ||||
|         self.answer(msg, RPCAnswer::new(RPCAnswerDetail::StatusA(status_a))) | ||||
|   | ||||
| @@ -17,11 +17,7 @@ impl RPCProcessor { | ||||
|             .generate_single_shot_receipt(receipt_time, []) | ||||
|             .map_err(RPCError::internal)?; | ||||
|  | ||||
|         let validate_dial_info = RPCOperationValidateDialInfo { | ||||
|             dial_info, | ||||
|             receipt, | ||||
|             redirect, | ||||
|         }; | ||||
|         let validate_dial_info = RPCOperationValidateDialInfo::new(dial_info, receipt, redirect)?; | ||||
|         let statement = RPCStatement::new(RPCStatementDetail::ValidateDialInfo(validate_dial_info)); | ||||
|  | ||||
|         // Send the validate_dial_info request | ||||
| @@ -134,11 +130,8 @@ impl RPCProcessor { | ||||
|                 } | ||||
|  | ||||
|                 // Make a copy of the request, without the redirect flag | ||||
|                 let validate_dial_info = RPCOperationValidateDialInfo { | ||||
|                     dial_info: dial_info.clone(), | ||||
|                     receipt: receipt.clone(), | ||||
|                     redirect: false, | ||||
|                 }; | ||||
|                 let validate_dial_info = | ||||
|                     RPCOperationValidateDialInfo::new(dial_info.clone(), receipt.clone(), false)?; | ||||
|                 let statement = | ||||
|                     RPCStatement::new(RPCStatementDetail::ValidateDialInfo(validate_dial_info)); | ||||
|  | ||||
|   | ||||
| @@ -101,6 +101,7 @@ impl RecordStore { | ||||
|     } | ||||
|  | ||||
|     fn add_to_subkey_cache(&mut self, key: SubkeyTableKey, record_data: RecordData) { | ||||
|         let record_data_total_size = record_data.total_size(); | ||||
|         // Write to subkey cache | ||||
|         let mut dead_size = 0usize; | ||||
|         if let Some(old_record_data) = self.subkey_cache.insert(key, record_data, |_, v| { | ||||
| @@ -111,7 +112,7 @@ impl RecordStore { | ||||
|             dead_size += old_record_data.total_size(); | ||||
|         } | ||||
|         self.subkey_cache_total_size -= dead_size; | ||||
|         self.subkey_cache_total_size += record_data.total_size(); | ||||
|         self.subkey_cache_total_size += record_data_total_size; | ||||
|  | ||||
|         // Purge over size limit | ||||
|         if let Some(max_subkey_cache_memory_mb) = self.limits.max_subkey_cache_memory_mb { | ||||
| @@ -270,16 +271,20 @@ impl RecordStore { | ||||
|         F: FnOnce(&Record) -> R, | ||||
|     { | ||||
|         // Get record from index | ||||
|         let mut out = None; | ||||
|         let rtk = RecordTableKey { key }; | ||||
|         if let Some(record) = self.record_index.get_mut(&rtk) { | ||||
|             // Callback | ||||
|             out = Some(f(record)); | ||||
|  | ||||
|             // Touch | ||||
|             record.touch(get_aligned_timestamp()); | ||||
|             self.mark_record_changed(rtk); | ||||
|  | ||||
|             // Callback | ||||
|             return Some(f(record)); | ||||
|         } | ||||
|         None | ||||
|         if out.is_some() { | ||||
|             self.mark_record_changed(rtk); | ||||
|         } | ||||
|  | ||||
|         out | ||||
|     } | ||||
|  | ||||
|     pub async fn get_subkey<R, F>( | ||||
|   | ||||
| @@ -8,10 +8,10 @@ use super::*; | ||||
| pub struct VeilidAppMessage { | ||||
|     /// Some(sender) if the message was sent directly, None if received via a private/safety route | ||||
|     #[serde(with = "opt_json_as_string")] | ||||
|     pub sender: Option<PublicKey>, | ||||
|     sender: Option<PublicKey>, | ||||
|     /// The content of the message to deliver to the application | ||||
|     #[serde(with = "json_as_base64")] | ||||
|     pub message: Vec<u8>, | ||||
|     message: Vec<u8>, | ||||
| } | ||||
|  | ||||
| impl VeilidAppMessage { | ||||
|   | ||||
| @@ -25,11 +25,11 @@ impl DHTRecordDescriptor { | ||||
|         Self { owner, schema } | ||||
|     } | ||||
|  | ||||
|     pub fn owner(&self) -> PublicKey { | ||||
|         self.owner | ||||
|     pub fn owner(&self) -> &PublicKey { | ||||
|         &self.owner | ||||
|     } | ||||
|  | ||||
|     pub fn schema(&self) -> DHTSchema { | ||||
|         self.schema | ||||
|     pub fn schema(&self) -> &DHTSchema { | ||||
|         &self.schema | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -58,7 +58,7 @@ impl DHTSchemaSMPL { | ||||
|         // o_cnt | ||||
|         out.extend_from_slice(&self.o_cnt.to_le_bytes()); | ||||
|         // members | ||||
|         for m in self.members { | ||||
|         for m in &self.members { | ||||
|             // m_key | ||||
|             out.extend_from_slice(&m.m_key.bytes); | ||||
|             // m_cnt | ||||
|   | ||||
		Reference in New Issue
	
	Block a user