refactor rpc validation
This commit is contained in:
@@ -4,27 +4,27 @@ pub fn encode_node_info(
|
||||
node_info: &NodeInfo,
|
||||
builder: &mut veilid_capnp::node_info::Builder,
|
||||
) -> Result<(), RPCError> {
|
||||
builder.set_network_class(encode_network_class(node_info.network_class));
|
||||
builder.set_network_class(encode_network_class(node_info.network_class()));
|
||||
|
||||
let mut ps_builder = builder.reborrow().init_outbound_protocols();
|
||||
encode_protocol_type_set(&node_info.outbound_protocols, &mut ps_builder)?;
|
||||
encode_protocol_type_set(&node_info.outbound_protocols(), &mut ps_builder)?;
|
||||
|
||||
let mut ats_builder = builder.reborrow().init_address_types();
|
||||
encode_address_type_set(&node_info.address_types, &mut ats_builder)?;
|
||||
encode_address_type_set(&node_info.address_types(), &mut ats_builder)?;
|
||||
|
||||
let mut es_builder = builder
|
||||
.reborrow()
|
||||
.init_envelope_support(node_info.envelope_support.len() as u32);
|
||||
.init_envelope_support(node_info.envelope_support().len() as u32);
|
||||
if let Some(s) = es_builder.as_slice() {
|
||||
s.clone_from_slice(&node_info.envelope_support);
|
||||
s.clone_from_slice(&node_info.envelope_support());
|
||||
}
|
||||
|
||||
let mut cs_builder = builder
|
||||
.reborrow()
|
||||
.init_crypto_support(node_info.crypto_support.len() as u32);
|
||||
.init_crypto_support(node_info.crypto_support().len() as u32);
|
||||
if let Some(s) = cs_builder.as_slice() {
|
||||
let csvec: Vec<u32> = node_info
|
||||
.crypto_support
|
||||
.crypto_support()
|
||||
.iter()
|
||||
.map(|x| u32::from_be_bytes(x.0))
|
||||
.collect();
|
||||
@@ -33,7 +33,7 @@ pub fn encode_node_info(
|
||||
|
||||
let mut didl_builder = builder.reborrow().init_dial_info_detail_list(
|
||||
node_info
|
||||
.dial_info_detail_list
|
||||
.dial_info_detail_list()
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(RPCError::map_protocol(
|
||||
@@ -41,9 +41,9 @@ pub fn encode_node_info(
|
||||
))?,
|
||||
);
|
||||
|
||||
for idx in 0..node_info.dial_info_detail_list.len() {
|
||||
for idx in 0..node_info.dial_info_detail_list().len() {
|
||||
let mut did_builder = didl_builder.reborrow().get(idx as u32);
|
||||
encode_dial_info_detail(&node_info.dial_info_detail_list[idx], &mut did_builder)?;
|
||||
encode_dial_info_detail(&node_info.dial_info_detail_list()[idx], &mut did_builder)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -131,12 +131,12 @@ pub fn decode_node_info(reader: &veilid_capnp::node_info::Reader) -> Result<Node
|
||||
dial_info_detail_list.push(decode_dial_info_detail(&did)?)
|
||||
}
|
||||
|
||||
Ok(NodeInfo {
|
||||
Ok(NodeInfo::new(
|
||||
network_class,
|
||||
outbound_protocols,
|
||||
address_types,
|
||||
envelope_support,
|
||||
crypto_support,
|
||||
dial_info_detail_list,
|
||||
})
|
||||
))
|
||||
}
|
||||
|
||||
@@ -9,18 +9,18 @@ impl RPCAnswer {
|
||||
pub fn new(detail: RPCAnswerDetail) -> Self {
|
||||
Self { detail }
|
||||
}
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
self.detail.validate(crypto)
|
||||
}
|
||||
pub fn into_detail(self) -> RPCAnswerDetail {
|
||||
self.detail
|
||||
}
|
||||
pub fn desc(&self) -> &'static str {
|
||||
self.detail.desc()
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::answer::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCAnswer, RPCError> {
|
||||
pub fn decode(reader: &veilid_capnp::answer::Reader) -> Result<RPCAnswer, RPCError> {
|
||||
let d_reader = reader.get_detail();
|
||||
let detail = RPCAnswerDetail::decode(&d_reader, crypto)?;
|
||||
let detail = RPCAnswerDetail::decode(&d_reader)?;
|
||||
Ok(RPCAnswer { detail })
|
||||
}
|
||||
pub fn encode(&self, builder: &mut veilid_capnp::answer::Builder) -> Result<(), RPCError> {
|
||||
@@ -60,10 +60,23 @@ impl RPCAnswerDetail {
|
||||
RPCAnswerDetail::CancelTunnelA(_) => "CancelTunnelA",
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
match self {
|
||||
RPCAnswerDetail::StatusA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::FindNodeA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::AppCallA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::GetValueA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::SetValueA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::WatchValueA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::SupplyBlockA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::FindBlockA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::StartTunnelA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::CompleteTunnelA(r) => r.validate(crypto),
|
||||
RPCAnswerDetail::CancelTunnelA(r) => r.validate(crypto),
|
||||
}
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::answer::detail::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCAnswerDetail, RPCError> {
|
||||
let which_reader = reader.which().map_err(RPCError::protocol)?;
|
||||
let out = match which_reader {
|
||||
@@ -74,7 +87,7 @@ impl RPCAnswerDetail {
|
||||
}
|
||||
veilid_capnp::answer::detail::FindNodeA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationFindNodeA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationFindNodeA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::FindNodeA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::AppCallA(r) => {
|
||||
@@ -84,27 +97,27 @@ impl RPCAnswerDetail {
|
||||
}
|
||||
veilid_capnp::answer::detail::GetValueA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationGetValueA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationGetValueA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::GetValueA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::SetValueA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationSetValueA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationSetValueA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::SetValueA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::WatchValueA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationWatchValueA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationWatchValueA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::WatchValueA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::SupplyBlockA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationSupplyBlockA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationSupplyBlockA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::SupplyBlockA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::FindBlockA(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationFindBlockA::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationFindBlockA::decode(&op_reader)?;
|
||||
RPCAnswerDetail::FindBlockA(out)
|
||||
}
|
||||
veilid_capnp::answer::detail::StartTunnelA(r) => {
|
||||
|
||||
@@ -16,25 +16,30 @@ impl RPCOperationKind {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn decode(
|
||||
kind_reader: &veilid_capnp::operation::kind::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<Self, RPCError> {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
match self {
|
||||
RPCOperationKind::Question(r) => r.validate(crypto),
|
||||
RPCOperationKind::Statement(r) => r.validate(crypto),
|
||||
RPCOperationKind::Answer(r) => r.validate(crypto),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn decode(kind_reader: &veilid_capnp::operation::kind::Reader) -> Result<Self, RPCError> {
|
||||
let which_reader = kind_reader.which().map_err(RPCError::protocol)?;
|
||||
let out = match which_reader {
|
||||
veilid_capnp::operation::kind::Which::Question(r) => {
|
||||
let q_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCQuestion::decode(&q_reader, crypto)?;
|
||||
let out = RPCQuestion::decode(&q_reader)?;
|
||||
RPCOperationKind::Question(out)
|
||||
}
|
||||
veilid_capnp::operation::kind::Which::Statement(r) => {
|
||||
let q_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCStatement::decode(&q_reader, crypto)?;
|
||||
let out = RPCStatement::decode(&q_reader)?;
|
||||
RPCOperationKind::Statement(out)
|
||||
}
|
||||
veilid_capnp::operation::kind::Which::Answer(r) => {
|
||||
let q_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCAnswer::decode(&q_reader, crypto)?;
|
||||
let out = RPCAnswer::decode(&q_reader)?;
|
||||
RPCOperationKind::Answer(out)
|
||||
}
|
||||
};
|
||||
@@ -93,6 +98,15 @@ impl RPCOperation {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
// Validate sender peer info
|
||||
if let Some(sender_peer_info) = &self.opt_sender_peer_info {
|
||||
sender_peer_info.validate(crypto.clone())?;
|
||||
}
|
||||
// Validate operation kind
|
||||
self.kind.validate(crypto)
|
||||
}
|
||||
|
||||
pub fn op_id(&self) -> OperationId {
|
||||
self.op_id
|
||||
}
|
||||
@@ -112,17 +126,14 @@ impl RPCOperation {
|
||||
self.kind
|
||||
}
|
||||
|
||||
pub fn decode(
|
||||
operation_reader: &veilid_capnp::operation::Reader,
|
||||
crypto: Crypto,
|
||||
) -> 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() {
|
||||
let pi_reader = operation_reader
|
||||
.get_sender_peer_info()
|
||||
.map_err(RPCError::protocol)?;
|
||||
let pi = decode_peer_info(&pi_reader, crypto.clone())?;
|
||||
let pi = decode_peer_info(&pi_reader)?;
|
||||
Some(pi)
|
||||
} else {
|
||||
None
|
||||
@@ -131,7 +142,7 @@ impl RPCOperation {
|
||||
let target_node_info_ts = Timestamp::new(operation_reader.get_target_node_info_ts());
|
||||
|
||||
let kind_reader = operation_reader.get_kind();
|
||||
let kind = RPCOperationKind::decode(&kind_reader, crypto)?;
|
||||
let kind = RPCOperationKind::decode(&kind_reader)?;
|
||||
|
||||
Ok(RPCOperation {
|
||||
op_id,
|
||||
|
||||
@@ -6,6 +6,10 @@ pub struct RPCOperationAppCallQ {
|
||||
}
|
||||
|
||||
impl RPCOperationAppCallQ {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
xxx length should be checked in decode verify this
|
||||
Ok(())
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_app_call_q::Reader,
|
||||
) -> Result<RPCOperationAppCallQ, RPCError> {
|
||||
|
||||
@@ -35,7 +35,6 @@ pub struct RPCOperationFindBlockA {
|
||||
impl RPCOperationFindBlockA {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_find_block_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationFindBlockA, RPCError> {
|
||||
let data = reader.get_data().map_err(RPCError::protocol)?.to_vec();
|
||||
|
||||
@@ -47,7 +46,7 @@ impl RPCOperationFindBlockA {
|
||||
.map_err(RPCError::map_internal("too many suppliers"))?,
|
||||
);
|
||||
for s in suppliers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&s, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&s)?;
|
||||
suppliers.push(peer_info);
|
||||
}
|
||||
|
||||
@@ -59,7 +58,7 @@ impl RPCOperationFindBlockA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,9 @@ pub struct RPCOperationFindNodeQ {
|
||||
}
|
||||
|
||||
impl RPCOperationFindNodeQ {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
Ok(())
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_find_node_q::Reader,
|
||||
) -> Result<RPCOperationFindNodeQ, RPCError> {
|
||||
@@ -29,9 +32,14 @@ pub struct RPCOperationFindNodeA {
|
||||
}
|
||||
|
||||
impl RPCOperationFindNodeA {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
for pi in &self.peers {
|
||||
pi.validate(crypto.clone()).map_err(RPCError::protocol)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_find_node_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationFindNodeA, RPCError> {
|
||||
let peers_reader = reader.get_peers().map_err(RPCError::protocol)?;
|
||||
let mut peers = Vec::<PeerInfo>::with_capacity(
|
||||
@@ -41,7 +49,7 @@ impl RPCOperationFindNodeA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,16 +4,22 @@ use super::*;
|
||||
pub struct RPCOperationGetValueQ {
|
||||
pub key: TypedKey,
|
||||
pub subkey: ValueSubkey,
|
||||
pub want_descriptor: bool,
|
||||
}
|
||||
|
||||
impl RPCOperationGetValueQ {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_get_value_q::Reader,
|
||||
) -> Result<RPCOperationGetValueQ, RPCError> {
|
||||
let k_reader = reader.get_key().map_err(RPCError::protocol)?;
|
||||
let k_reader = reader.reborrow().get_key().map_err(RPCError::protocol)?;
|
||||
let key = decode_typed_key(&k_reader)?;
|
||||
let subkey = reader.get_subkey();
|
||||
Ok(RPCOperationGetValueQ { key, subkey })
|
||||
let subkey = reader.reborrow().get_subkey();
|
||||
let want_descriptor = reader.reborrow().get_want_descriptor();
|
||||
Ok(RPCOperationGetValueQ {
|
||||
key,
|
||||
subkey,
|
||||
want_descriptor,
|
||||
})
|
||||
}
|
||||
pub fn encode(
|
||||
&self,
|
||||
@@ -22,24 +28,24 @@ impl RPCOperationGetValueQ {
|
||||
let mut k_builder = builder.reborrow().init_key();
|
||||
encode_typed_key(&self.key, &mut k_builder);
|
||||
builder.set_subkey(self.subkey);
|
||||
builder.set_want_descriptor(self.want_descriptor);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum RPCOperationGetValueA {
|
||||
Data(ValueData),
|
||||
Value(ValueDetail),
|
||||
Peers(Vec<PeerInfo>),
|
||||
}
|
||||
|
||||
impl RPCOperationGetValueA {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_get_value_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationGetValueA, RPCError> {
|
||||
match reader.which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::operation_get_value_a::Which::Data(r) => {
|
||||
let data = decode_value_data(&r.map_err(RPCError::protocol)?)?;
|
||||
veilid_capnp::operation_get_value_a::Which::Value(r) => {
|
||||
let value_detail = decode_value_detail(&r.map_err(RPCError::protocol)?)?;
|
||||
Ok(RPCOperationGetValueA::Data(data))
|
||||
}
|
||||
veilid_capnp::operation_get_value_a::Which::Peers(r) => {
|
||||
@@ -51,7 +57,7 @@ impl RPCOperationGetValueA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -80,10 +80,9 @@ pub struct RPCOperationRoute {
|
||||
impl RPCOperationRoute {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_route::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationRoute, RPCError> {
|
||||
let sr_reader = reader.get_safety_route().map_err(RPCError::protocol)?;
|
||||
let safety_route = decode_safety_route(&sr_reader, crypto)?;
|
||||
let safety_route = decode_safety_route(&sr_reader)?;
|
||||
|
||||
let o_reader = reader.get_operation().map_err(RPCError::protocol)?;
|
||||
let operation = RoutedOperation::decode(&o_reader)?;
|
||||
|
||||
@@ -40,7 +40,6 @@ pub enum RPCOperationSetValueA {
|
||||
impl RPCOperationSetValueA {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_set_value_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationSetValueA, RPCError> {
|
||||
match reader.which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::operation_set_value_a::Which::Data(r) => {
|
||||
@@ -56,7 +55,7 @@ impl RPCOperationSetValueA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,9 +8,8 @@ pub struct RPCOperationSignal {
|
||||
impl RPCOperationSignal {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_signal::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationSignal, RPCError> {
|
||||
let signal_info = decode_signal_info(reader, crypto)?;
|
||||
let signal_info = decode_signal_info(reader)?;
|
||||
Ok(RPCOperationSignal { signal_info })
|
||||
}
|
||||
pub fn encode(
|
||||
|
||||
@@ -6,6 +6,10 @@ pub struct RPCOperationStatusQ {
|
||||
}
|
||||
|
||||
impl RPCOperationStatusQ {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_status_q::Reader,
|
||||
) -> Result<RPCOperationStatusQ, RPCError> {
|
||||
@@ -37,6 +41,9 @@ pub struct RPCOperationStatusA {
|
||||
}
|
||||
|
||||
impl RPCOperationStatusA {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
Ok(())
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_status_a::Reader,
|
||||
) -> Result<RPCOperationStatusA, RPCError> {
|
||||
|
||||
@@ -34,8 +34,7 @@ pub enum RPCOperationSupplyBlockA {
|
||||
impl RPCOperationSupplyBlockA {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_supply_block_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationSupplyBlockA, RPCError> {
|
||||
= ) -> Result<RPCOperationSupplyBlockA, RPCError> {
|
||||
match reader.which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::operation_supply_block_a::Which::Expiration(r) => {
|
||||
Ok(RPCOperationSupplyBlockA::Expiration(r))
|
||||
@@ -49,7 +48,7 @@ impl RPCOperationSupplyBlockA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,6 @@ pub struct RPCOperationWatchValueA {
|
||||
impl RPCOperationWatchValueA {
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::operation_watch_value_a::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCOperationWatchValueA, RPCError> {
|
||||
let expiration = reader.get_expiration();
|
||||
let peers_reader = reader.get_peers().map_err(RPCError::protocol)?;
|
||||
@@ -91,7 +90,7 @@ impl RPCOperationWatchValueA {
|
||||
.map_err(RPCError::map_internal("too many peers"))?,
|
||||
);
|
||||
for p in peers_reader.iter() {
|
||||
let peer_info = decode_peer_info(&p, crypto.clone())?;
|
||||
let peer_info = decode_peer_info(&p)?;
|
||||
peers.push(peer_info);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@ impl RPCQuestion {
|
||||
pub fn new(respond_to: RespondTo, detail: RPCQuestionDetail) -> Self {
|
||||
Self { respond_to, detail }
|
||||
}
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
self.respond_to.validate(crypto.clone())?;
|
||||
self.detail.validate(crypto)
|
||||
}
|
||||
pub fn respond_to(&self) -> &RespondTo {
|
||||
&self.respond_to
|
||||
}
|
||||
@@ -19,12 +23,9 @@ impl RPCQuestion {
|
||||
pub fn desc(&self) -> &'static str {
|
||||
self.detail.desc()
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::question::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCQuestion, RPCError> {
|
||||
pub fn decode(reader: &veilid_capnp::question::Reader) -> Result<RPCQuestion, RPCError> {
|
||||
let rt_reader = reader.get_respond_to();
|
||||
let respond_to = RespondTo::decode(&rt_reader, crypto)?;
|
||||
let respond_to = RespondTo::decode(&rt_reader)?;
|
||||
let d_reader = reader.get_detail();
|
||||
let detail = RPCQuestionDetail::decode(&d_reader)?;
|
||||
Ok(RPCQuestion { respond_to, detail })
|
||||
@@ -68,6 +69,21 @@ impl RPCQuestionDetail {
|
||||
RPCQuestionDetail::CancelTunnelQ(_) => "CancelTunnelQ",
|
||||
}
|
||||
}
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
match self {
|
||||
RPCQuestionDetail::StatusQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::FindNodeQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::AppCallQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::GetValueQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::SetValueQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::WatchValueQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::SupplyBlockQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::FindBlockQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::StartTunnelQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::CompleteTunnelQ(r) => r.validate(crypto),
|
||||
RPCQuestionDetail::CancelTunnelQ(r) => r.validate(crypto),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::question::detail::Reader,
|
||||
|
||||
@@ -7,6 +7,13 @@ pub enum RespondTo {
|
||||
}
|
||||
|
||||
impl RespondTo {
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
match self {
|
||||
RespondTo::Sender => Ok(()),
|
||||
RespondTo::PrivateRoute(pr) => pr.validate(crypto).map_err(RPCError::protocol),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn encode(
|
||||
&self,
|
||||
builder: &mut veilid_capnp::question::respond_to::Builder,
|
||||
@@ -23,15 +30,12 @@ impl RespondTo {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::question::respond_to::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<Self, RPCError> {
|
||||
pub fn decode(reader: &veilid_capnp::question::respond_to::Reader) -> Result<Self, RPCError> {
|
||||
let respond_to = match reader.which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::question::respond_to::Sender(()) => RespondTo::Sender,
|
||||
veilid_capnp::question::respond_to::PrivateRoute(pr_reader) => {
|
||||
let pr_reader = pr_reader.map_err(RPCError::protocol)?;
|
||||
let pr = decode_private_route(&pr_reader, crypto)?;
|
||||
let pr = decode_private_route(&pr_reader)?;
|
||||
RespondTo::PrivateRoute(pr)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -9,6 +9,9 @@ impl RPCStatement {
|
||||
pub fn new(detail: RPCStatementDetail) -> Self {
|
||||
Self { detail }
|
||||
}
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
self.detail.validate(crypto)
|
||||
}
|
||||
pub fn detail(&self) -> &RPCStatementDetail {
|
||||
&self.detail
|
||||
}
|
||||
@@ -18,12 +21,9 @@ impl RPCStatement {
|
||||
pub fn desc(&self) -> &'static str {
|
||||
self.detail.desc()
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::statement::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCStatement, RPCError> {
|
||||
pub fn decode(reader: &veilid_capnp::statement::Reader) -> Result<RPCStatement, RPCError> {
|
||||
let d_reader = reader.get_detail();
|
||||
let detail = RPCStatementDetail::decode(&d_reader, crypto)?;
|
||||
let detail = RPCStatementDetail::decode(&d_reader)?;
|
||||
Ok(RPCStatement { detail })
|
||||
}
|
||||
pub fn encode(&self, builder: &mut veilid_capnp::statement::Builder) -> Result<(), RPCError> {
|
||||
@@ -53,9 +53,18 @@ impl RPCStatementDetail {
|
||||
RPCStatementDetail::AppMessage(_) => "AppMessage",
|
||||
}
|
||||
}
|
||||
pub fn validate(&self, crypto: Crypto) -> Result<(), RPCError> {
|
||||
match self {
|
||||
RPCStatementDetail::ValidateDialInfo(r) => r.validate(crypto),
|
||||
RPCStatementDetail::Route(r) => r.validate(crypto),
|
||||
RPCStatementDetail::ValueChanged(r) => r.validate(crypto),
|
||||
RPCStatementDetail::Signal(r) => r.validate(crypto),
|
||||
RPCStatementDetail::ReturnReceipt(r) => r.validate(crypto),
|
||||
RPCStatementDetail::AppMessage(r) => r.validate(crypto),
|
||||
}
|
||||
}
|
||||
pub fn decode(
|
||||
reader: &veilid_capnp::statement::detail::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RPCStatementDetail, RPCError> {
|
||||
let which_reader = reader.which().map_err(RPCError::protocol)?;
|
||||
let out = match which_reader {
|
||||
@@ -66,7 +75,7 @@ impl RPCStatementDetail {
|
||||
}
|
||||
veilid_capnp::statement::detail::Route(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationRoute::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationRoute::decode(&op_reader)?;
|
||||
RPCStatementDetail::Route(out)
|
||||
}
|
||||
veilid_capnp::statement::detail::ValueChanged(r) => {
|
||||
@@ -76,7 +85,7 @@ impl RPCStatementDetail {
|
||||
}
|
||||
veilid_capnp::statement::detail::Signal(r) => {
|
||||
let op_reader = r.map_err(RPCError::protocol)?;
|
||||
let out = RPCOperationSignal::decode(&op_reader, crypto)?;
|
||||
let out = RPCOperationSignal::decode(&op_reader)?;
|
||||
RPCStatementDetail::Signal(out)
|
||||
}
|
||||
veilid_capnp::statement::detail::ReturnReceipt(r) => {
|
||||
|
||||
@@ -7,12 +7,12 @@ pub fn encode_peer_info(
|
||||
//
|
||||
let mut nids_builder = builder.reborrow().init_node_ids(
|
||||
peer_info
|
||||
.node_ids
|
||||
.node_ids()
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(RPCError::map_invalid_format("out of bound error"))?,
|
||||
);
|
||||
for (i, nid) in peer_info.node_ids.iter().enumerate() {
|
||||
for (i, nid) in peer_info.node_ids().iter().enumerate() {
|
||||
encode_typed_key(
|
||||
nid,
|
||||
&mut nids_builder.reborrow().get(
|
||||
@@ -22,15 +22,12 @@ pub fn encode_peer_info(
|
||||
);
|
||||
}
|
||||
let mut sni_builder = builder.reborrow().init_signed_node_info();
|
||||
encode_signed_node_info(&peer_info.signed_node_info, &mut sni_builder)?;
|
||||
encode_signed_node_info(peer_info.signed_node_info(), &mut sni_builder)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_peer_info(
|
||||
reader: &veilid_capnp::peer_info::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<PeerInfo, RPCError> {
|
||||
pub fn decode_peer_info(reader: &veilid_capnp::peer_info::Reader) -> Result<PeerInfo, RPCError> {
|
||||
let nids_reader = reader
|
||||
.reborrow()
|
||||
.get_node_ids()
|
||||
@@ -43,7 +40,7 @@ pub fn decode_peer_info(
|
||||
for nid_reader in nids_reader.iter() {
|
||||
node_ids.add(decode_typed_key(&nid_reader)?);
|
||||
}
|
||||
let signed_node_info = decode_signed_node_info(&sni_reader, crypto, &mut node_ids)?;
|
||||
let signed_node_info = decode_signed_node_info(&sni_reader)?;
|
||||
if node_ids.len() == 0 {
|
||||
return Err(RPCError::protocol("no verified node ids"));
|
||||
}
|
||||
|
||||
@@ -67,10 +67,7 @@ pub fn encode_route_hop(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_route_hop(
|
||||
reader: &veilid_capnp::route_hop::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<RouteHop, RPCError> {
|
||||
pub fn decode_route_hop(reader: &veilid_capnp::route_hop::Reader) -> Result<RouteHop, RPCError> {
|
||||
let n_reader = reader.reborrow().get_node();
|
||||
let node = match n_reader.which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::route_hop::node::Which::NodeId(ni) => {
|
||||
@@ -80,7 +77,7 @@ pub fn decode_route_hop(
|
||||
veilid_capnp::route_hop::node::Which::PeerInfo(pi) => {
|
||||
let pi_reader = pi.map_err(RPCError::protocol)?;
|
||||
RouteNode::PeerInfo(
|
||||
decode_peer_info(&pi_reader, crypto)
|
||||
decode_peer_info(&pi_reader)
|
||||
.map_err(RPCError::map_protocol("invalid peer info in route hop"))?,
|
||||
)
|
||||
}
|
||||
@@ -128,7 +125,6 @@ pub fn encode_private_route(
|
||||
|
||||
pub fn decode_private_route(
|
||||
reader: &veilid_capnp::private_route::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<PrivateRoute, RPCError> {
|
||||
let public_key = decode_typed_key(&reader.get_public_key().map_err(
|
||||
RPCError::map_protocol("invalid public key in private route"),
|
||||
@@ -138,7 +134,7 @@ pub fn decode_private_route(
|
||||
let hops = match reader.get_hops().which().map_err(RPCError::protocol)? {
|
||||
veilid_capnp::private_route::hops::Which::FirstHop(rh_reader) => {
|
||||
let rh_reader = rh_reader.map_err(RPCError::protocol)?;
|
||||
PrivateRouteHops::FirstHop(decode_route_hop(&rh_reader, crypto)?)
|
||||
PrivateRouteHops::FirstHop(decode_route_hop(&rh_reader)?)
|
||||
}
|
||||
veilid_capnp::private_route::hops::Which::Data(rhd_reader) => {
|
||||
let rhd_reader = rhd_reader.map_err(RPCError::protocol)?;
|
||||
@@ -182,7 +178,6 @@ pub fn encode_safety_route(
|
||||
|
||||
pub fn decode_safety_route(
|
||||
reader: &veilid_capnp::safety_route::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<SafetyRoute, RPCError> {
|
||||
let public_key = decode_typed_key(
|
||||
&reader
|
||||
@@ -197,7 +192,7 @@ pub fn decode_safety_route(
|
||||
}
|
||||
veilid_capnp::safety_route::hops::Which::Private(pr_reader) => {
|
||||
let pr_reader = pr_reader.map_err(RPCError::protocol)?;
|
||||
SafetyRouteHops::Private(decode_private_route(&pr_reader, crypto)?)
|
||||
SafetyRouteHops::Private(decode_private_route(&pr_reader)?)
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ pub fn encode_signal_info(
|
||||
|
||||
pub fn decode_signal_info(
|
||||
reader: &veilid_capnp::operation_signal::Reader,
|
||||
crypto: Crypto,
|
||||
) -> Result<SignalInfo, RPCError> {
|
||||
Ok(
|
||||
match reader
|
||||
@@ -53,7 +52,7 @@ pub fn decode_signal_info(
|
||||
let pi_reader = r.get_peer_info().map_err(RPCError::map_protocol(
|
||||
"invalid peer info in hole punch signal info",
|
||||
))?;
|
||||
let peer_info = decode_peer_info(&pi_reader, crypto)?;
|
||||
let peer_info = decode_peer_info(&pi_reader)?;
|
||||
|
||||
SignalInfo::HolePunch { receipt, peer_info }
|
||||
}
|
||||
@@ -69,7 +68,7 @@ pub fn decode_signal_info(
|
||||
let pi_reader = r.get_peer_info().map_err(RPCError::map_protocol(
|
||||
"invalid peer info in reverse connect signal info",
|
||||
))?;
|
||||
let peer_info = decode_peer_info(&pi_reader, crypto)?;
|
||||
let peer_info = decode_peer_info(&pi_reader)?;
|
||||
|
||||
SignalInfo::ReverseConnect { receipt, peer_info }
|
||||
}
|
||||
|
||||
@@ -6,20 +6,20 @@ pub fn encode_signed_direct_node_info(
|
||||
) -> Result<(), RPCError> {
|
||||
//
|
||||
let mut ni_builder = builder.reborrow().init_node_info();
|
||||
encode_node_info(&signed_direct_node_info.node_info, &mut ni_builder)?;
|
||||
encode_node_info(signed_direct_node_info.node_info(), &mut ni_builder)?;
|
||||
|
||||
builder
|
||||
.reborrow()
|
||||
.set_timestamp(signed_direct_node_info.timestamp.into());
|
||||
.set_timestamp(signed_direct_node_info.timestamp().into());
|
||||
|
||||
let mut sigs_builder = builder.reborrow().init_signatures(
|
||||
signed_direct_node_info
|
||||
.signatures
|
||||
.signatures()
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(RPCError::map_invalid_format("out of bound error"))?,
|
||||
);
|
||||
for (i, typed_signature) in signed_direct_node_info.signatures.iter().enumerate() {
|
||||
for (i, typed_signature) in signed_direct_node_info.signatures().iter().enumerate() {
|
||||
encode_typed_signature(
|
||||
typed_signature,
|
||||
&mut sigs_builder.reborrow().get(
|
||||
@@ -34,8 +34,6 @@ pub fn encode_signed_direct_node_info(
|
||||
|
||||
pub fn decode_signed_direct_node_info(
|
||||
reader: &veilid_capnp::signed_direct_node_info::Reader,
|
||||
crypto: Crypto,
|
||||
node_ids: &mut TypedKeySet,
|
||||
) -> Result<SignedDirectNodeInfo, RPCError> {
|
||||
let ni_reader = reader
|
||||
.reborrow()
|
||||
@@ -61,6 +59,9 @@ pub fn decode_signed_direct_node_info(
|
||||
typed_signatures.push(typed_signature);
|
||||
}
|
||||
|
||||
SignedDirectNodeInfo::new(crypto, node_ids, node_info, timestamp, typed_signatures)
|
||||
.map_err(RPCError::protocol)
|
||||
Ok(SignedDirectNodeInfo::new(
|
||||
node_info,
|
||||
timestamp,
|
||||
typed_signatures,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -20,8 +20,6 @@ pub fn encode_signed_node_info(
|
||||
|
||||
pub fn decode_signed_node_info(
|
||||
reader: &veilid_capnp::signed_node_info::Reader,
|
||||
crypto: Crypto,
|
||||
node_ids: &mut TypedKeySet,
|
||||
) -> Result<SignedNodeInfo, RPCError> {
|
||||
match reader
|
||||
.which()
|
||||
@@ -29,12 +27,12 @@ pub fn decode_signed_node_info(
|
||||
{
|
||||
veilid_capnp::signed_node_info::Direct(d) => {
|
||||
let d_reader = d.map_err(RPCError::protocol)?;
|
||||
let sdni = decode_signed_direct_node_info(&d_reader, crypto, node_ids)?;
|
||||
let sdni = decode_signed_direct_node_info(&d_reader)?;
|
||||
Ok(SignedNodeInfo::Direct(sdni))
|
||||
}
|
||||
veilid_capnp::signed_node_info::Relayed(r) => {
|
||||
let r_reader = r.map_err(RPCError::protocol)?;
|
||||
let srni = decode_signed_relayed_node_info(&r_reader, crypto, node_ids)?;
|
||||
let srni = decode_signed_relayed_node_info(&r_reader)?;
|
||||
Ok(SignedNodeInfo::Relayed(srni))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,16 +6,16 @@ pub fn encode_signed_relayed_node_info(
|
||||
) -> Result<(), RPCError> {
|
||||
//
|
||||
let mut ni_builder = builder.reborrow().init_node_info();
|
||||
encode_node_info(&signed_relayed_node_info.node_info, &mut ni_builder)?;
|
||||
encode_node_info(signed_relayed_node_info.node_info(), &mut ni_builder)?;
|
||||
|
||||
let mut rids_builder = builder.reborrow().init_relay_ids(
|
||||
signed_relayed_node_info
|
||||
.relay_ids
|
||||
.relay_ids()
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(RPCError::map_invalid_format("out of bound error"))?,
|
||||
);
|
||||
for (i, typed_key) in signed_relayed_node_info.relay_ids.iter().enumerate() {
|
||||
for (i, typed_key) in signed_relayed_node_info.relay_ids().iter().enumerate() {
|
||||
encode_typed_key(
|
||||
typed_key,
|
||||
&mut rids_builder.reborrow().get(
|
||||
@@ -26,20 +26,20 @@ pub fn encode_signed_relayed_node_info(
|
||||
}
|
||||
|
||||
let mut ri_builder = builder.reborrow().init_relay_info();
|
||||
encode_signed_direct_node_info(&signed_relayed_node_info.relay_info, &mut ri_builder)?;
|
||||
encode_signed_direct_node_info(signed_relayed_node_info.relay_info(), &mut ri_builder)?;
|
||||
|
||||
builder
|
||||
.reborrow()
|
||||
.set_timestamp(signed_relayed_node_info.timestamp.into());
|
||||
.set_timestamp(signed_relayed_node_info.timestamp().into());
|
||||
|
||||
let mut sigs_builder = builder.reborrow().init_signatures(
|
||||
signed_relayed_node_info
|
||||
.signatures
|
||||
.signatures()
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(RPCError::map_invalid_format("out of bound error"))?,
|
||||
);
|
||||
for (i, typed_signature) in signed_relayed_node_info.signatures.iter().enumerate() {
|
||||
for (i, typed_signature) in signed_relayed_node_info.signatures().iter().enumerate() {
|
||||
encode_typed_signature(
|
||||
typed_signature,
|
||||
&mut sigs_builder.reborrow().get(
|
||||
@@ -54,8 +54,6 @@ pub fn encode_signed_relayed_node_info(
|
||||
|
||||
pub fn decode_signed_relayed_node_info(
|
||||
reader: &veilid_capnp::signed_relayed_node_info::Reader,
|
||||
crypto: Crypto,
|
||||
node_ids: &mut TypedKeySet,
|
||||
) -> Result<SignedRelayedNodeInfo, RPCError> {
|
||||
let ni_reader = reader
|
||||
.reborrow()
|
||||
@@ -81,20 +79,7 @@ pub fn decode_signed_relayed_node_info(
|
||||
.reborrow()
|
||||
.get_relay_info()
|
||||
.map_err(RPCError::protocol)?;
|
||||
let relay_info = decode_signed_direct_node_info(&ri_reader, crypto.clone(), &mut relay_ids)?;
|
||||
|
||||
// Ensure the relay info for the node has a superset of the crypto kinds of the node it is relaying
|
||||
if common_crypto_kinds(
|
||||
&node_info.crypto_support,
|
||||
&relay_info.node_info.crypto_support,
|
||||
)
|
||||
.len()
|
||||
!= node_info.crypto_support.len()
|
||||
{
|
||||
return Err(RPCError::protocol(
|
||||
"relay should have superset of node crypto kinds",
|
||||
));
|
||||
}
|
||||
let relay_info = decode_signed_direct_node_info(&ri_reader)?;
|
||||
|
||||
let timestamp = reader.reborrow().get_timestamp().into();
|
||||
|
||||
@@ -113,14 +98,11 @@ pub fn decode_signed_relayed_node_info(
|
||||
let typed_signature = decode_typed_signature(&sig_reader)?;
|
||||
typed_signatures.push(typed_signature);
|
||||
}
|
||||
SignedRelayedNodeInfo::new(
|
||||
crypto,
|
||||
node_ids,
|
||||
Ok(SignedRelayedNodeInfo::new(
|
||||
node_info,
|
||||
relay_ids,
|
||||
relay_info,
|
||||
timestamp,
|
||||
typed_signatures,
|
||||
)
|
||||
.map_err(RPCError::protocol)
|
||||
))
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ pub fn encode_signed_value_data(
|
||||
|
||||
pub fn decode_signed_value_data(
|
||||
reader: &veilid_capnp::signed_value_data::Reader,
|
||||
) -> Result<ValueData, RPCError> {
|
||||
) -> Result<SignedValueData, RPCError> {
|
||||
let seq = reader.get_seq();
|
||||
let data = reader.get_data().map_err(RPCError::protocol)?.to_vec();
|
||||
let wr = reader.get_writer().map_err(RPCError::protocol)?;
|
||||
@@ -24,8 +24,8 @@ pub fn decode_signed_value_data(
|
||||
let sr = reader.get_signature().map_err(RPCError::protocol)?;
|
||||
let signature = decode_signature512(&sr);
|
||||
|
||||
Ok(SignedValueData {
|
||||
value_data: ValueData { seq, data, writer },
|
||||
Ok(SignedValueData::new(
|
||||
ValueData::new_with_seq(seq, data, writer),
|
||||
signature,
|
||||
})
|
||||
))
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ pub fn encode_signed_value_descriptor(
|
||||
) -> Result<(), RPCError> {
|
||||
let mut ob = builder.reborrow().init_owner();
|
||||
encode_key256(signed_value_descriptor.owner(), &mut ob);
|
||||
builder.set_data(signed_value_descriptor.data());
|
||||
builder.set_schema_data(signed_value_descriptor.schema_data());
|
||||
let mut sb = builder.reborrow().init_signature();
|
||||
encode_signature512(signed_value_descriptor.signature(), &mut sb);
|
||||
Ok(())
|
||||
@@ -15,12 +15,14 @@ pub fn encode_signed_value_descriptor(
|
||||
|
||||
pub fn decode_signed_value_descriptor(
|
||||
reader: &veilid_capnp::signed_value_descriptor::Reader,
|
||||
vcrypto: CryptoSystemVersion,
|
||||
) -> Result<SignedValueDescriptor, RPCError> {
|
||||
let or = reader.get_owner().map_err(RPCError::protocol)?;
|
||||
let owner = decode_key256(&or);
|
||||
let data = reader.get_data().map_err(RPCError::protocol)?.to_vec();
|
||||
let schema_data = reader
|
||||
.get_schema_data()
|
||||
.map_err(RPCError::protocol)?
|
||||
.to_vec();
|
||||
let sr = reader.get_signature().map_err(RPCError::protocol)?;
|
||||
let signature = decode_signature512(&sr);
|
||||
Ok(SignedValueDescriptor::new(owner, data, signature, vcrypto).map_err(RPCError::protocol)?)
|
||||
Ok(SignedValueDescriptor::new(owner, schema_data, signature))
|
||||
}
|
||||
|
||||
@@ -6,13 +6,31 @@ pub fn encode_value_detail(
|
||||
builder: &mut veilid_capnp::value_detail::Builder,
|
||||
) -> Result<(), RPCError> {
|
||||
let mut svdb = builder.reborrow().init_signed_value_data();
|
||||
|
||||
encode_signed_value_data(value_detail.signed_value_data(), &mut svdb)?;
|
||||
if let Some(descriptor) = value_detail.descriptor() {
|
||||
let mut db = builder.reborrow().init_descriptor();
|
||||
encode_signed_value_descriptor(descriptor, &mut db)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_value_detail(
|
||||
reader: &veilid_capnp::value_detail::Reader,
|
||||
) -> Result<ValueDetail, RPCError> {
|
||||
let svdr = reader.get_signed_value_data().map_err(RPCError::protocol)?;
|
||||
let signed_value_data = decode_signed_value_data(&svdr)?;
|
||||
|
||||
let descriptor = if reader.has_descriptor() {
|
||||
let dr = reader
|
||||
.reborrow()
|
||||
.get_descriptor()
|
||||
.map_err(RPCError::protocol)?;
|
||||
let descriptor = decode_signed_value_descriptor(&dr)?;
|
||||
Some(descriptor)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
Ok(ValueDetail {
|
||||
signed_value_data,
|
||||
descriptor,
|
||||
|
||||
@@ -753,7 +753,7 @@ impl RPCProcessor {
|
||||
};
|
||||
|
||||
// Get our node info timestamp
|
||||
let our_node_info_ts = own_peer_info.signed_node_info.timestamp();
|
||||
let our_node_info_ts = own_peer_info.signed_node_info().timestamp();
|
||||
|
||||
// If the target has seen our node info already don't send it again
|
||||
if target.has_seen_our_node_info_ts(routing_domain, our_node_info_ts) {
|
||||
@@ -1214,16 +1214,19 @@ impl RPCProcessor {
|
||||
.get_root::<veilid_capnp::operation::Reader>()
|
||||
.map_err(RPCError::protocol)
|
||||
.map_err(logthru_rpc!())?;
|
||||
RPCOperation::decode(&op_reader, self.crypto.clone())?
|
||||
RPCOperation::decode(&op_reader)?
|
||||
};
|
||||
|
||||
// Validate the RPC operation
|
||||
operation.validate(self.crypto.clone())?;
|
||||
|
||||
// Get the sender noderef, incorporating sender's peer info
|
||||
let mut opt_sender_nr: Option<NodeRef> = None;
|
||||
if let Some(sender_peer_info) = operation.sender_peer_info() {
|
||||
// Ensure the sender peer info is for the actual sender specified in the envelope
|
||||
|
||||
// Sender PeerInfo was specified, update our routing table with it
|
||||
if !self.filter_node_info(routing_domain, &sender_peer_info.signed_node_info) {
|
||||
if !self.filter_node_info(routing_domain, sender_peer_info.signed_node_info()) {
|
||||
return Err(RPCError::invalid_format(
|
||||
"sender peerinfo has invalid peer scope",
|
||||
));
|
||||
@@ -1261,9 +1264,12 @@ impl RPCProcessor {
|
||||
.get_root::<veilid_capnp::operation::Reader>()
|
||||
.map_err(RPCError::protocol)
|
||||
.map_err(logthru_rpc!())?;
|
||||
RPCOperation::decode(&op_reader, self.crypto.clone())?
|
||||
RPCOperation::decode(&op_reader)?
|
||||
};
|
||||
|
||||
// Validate the RPC operation
|
||||
operation.validate(self.crypto.clone())?;
|
||||
|
||||
// Make the RPC message
|
||||
RPCMessage {
|
||||
header: encoded_msg.header,
|
||||
|
||||
@@ -52,7 +52,7 @@ impl RPCProcessor {
|
||||
|
||||
// Verify peers are in the correct peer scope
|
||||
for peer_info in &find_node_a.peers {
|
||||
if !self.filter_node_info(RoutingDomain::PublicInternet, &peer_info.signed_node_info) {
|
||||
if !self.filter_node_info(RoutingDomain::PublicInternet, peer_info.signed_node_info()) {
|
||||
return Err(RPCError::invalid_format(
|
||||
"find_node response has invalid peer scope",
|
||||
));
|
||||
|
||||
@@ -341,8 +341,11 @@ impl RPCProcessor {
|
||||
let rh_reader = dec_blob_reader
|
||||
.get_root::<veilid_capnp::route_hop::Reader>()
|
||||
.map_err(RPCError::protocol)?;
|
||||
decode_route_hop(&rh_reader, self.crypto.clone())?
|
||||
decode_route_hop(&rh_reader)?
|
||||
};
|
||||
|
||||
// Validate the RouteHop
|
||||
route_hop.validate(self.crypto.clone()).map_err(RPCError::protocol)?;
|
||||
|
||||
// Sign the operation if this is not our last hop
|
||||
// as the last hop is already signed by the envelope
|
||||
@@ -422,8 +425,11 @@ impl RPCProcessor {
|
||||
let pr_reader = dec_blob_reader
|
||||
.get_root::<veilid_capnp::private_route::Reader>()
|
||||
.map_err(RPCError::protocol)?;
|
||||
decode_private_route(&pr_reader, self.crypto.clone())?
|
||||
decode_private_route(&pr_reader)?
|
||||
};
|
||||
|
||||
// Validate the private route
|
||||
private_route.validate(self.crypto.clone()).map_err(RPCError::protocol)?;
|
||||
|
||||
// Switching from full safety route to private route first hop
|
||||
network_result_try!(
|
||||
@@ -440,9 +446,12 @@ impl RPCProcessor {
|
||||
let rh_reader = dec_blob_reader
|
||||
.get_root::<veilid_capnp::route_hop::Reader>()
|
||||
.map_err(RPCError::protocol)?;
|
||||
decode_route_hop(&rh_reader, self.crypto.clone())?
|
||||
decode_route_hop(&rh_reader)?
|
||||
};
|
||||
|
||||
// Validate the route hop
|
||||
route_hop.validate(self.crypto.clone()).map_err(RPCError::protocol)?;
|
||||
|
||||
// Continue the full safety route with another hop
|
||||
network_result_try!(
|
||||
self.process_route_safety_route_hop(
|
||||
|
||||
Reference in New Issue
Block a user