checkpoint
This commit is contained in:
@@ -72,6 +72,14 @@ macro_rules! apibail_no_connection {
|
||||
};
|
||||
}
|
||||
|
||||
#[allow(unused_macros)]
|
||||
#[macro_export]
|
||||
macro_rules! apibail_key_not_found {
|
||||
($x:expr) => {
|
||||
return Err(VeilidAPIError::key_not_found($x))
|
||||
};
|
||||
}
|
||||
|
||||
#[allow(unused_macros)]
|
||||
#[macro_export]
|
||||
macro_rules! apibail_invalid_target {
|
||||
@@ -127,8 +135,8 @@ pub enum VeilidAPIError {
|
||||
InvalidTarget,
|
||||
#[error("No connection: {message}")]
|
||||
NoConnection { message: String },
|
||||
#[error("No peer info: {node_id}")]
|
||||
NoPeerInfo { node_id: TypedKey },
|
||||
#[error("Key not found: {key}")]
|
||||
KeyNotFound { key: TypedKey },
|
||||
#[error("Internal: {message}")]
|
||||
Internal { message: String },
|
||||
#[error("Unimplemented: {message}")]
|
||||
@@ -171,8 +179,8 @@ impl VeilidAPIError {
|
||||
message: msg.to_string(),
|
||||
}
|
||||
}
|
||||
pub fn no_peer_info(node_id: TypedKey) -> Self {
|
||||
Self::NoPeerInfo { node_id }
|
||||
pub fn key_not_found(key: TypedKey) -> Self {
|
||||
Self::KeyNotFound { key }
|
||||
}
|
||||
pub fn internal<T: ToString>(msg: T) -> Self {
|
||||
Self::Internal {
|
||||
|
||||
@@ -42,6 +42,29 @@ impl DHTSchemaDFLT {
|
||||
pub fn data_size(&self) -> usize {
|
||||
0
|
||||
}
|
||||
|
||||
/// Check a subkey value data against the schema
|
||||
pub fn check_subkey_value_data(
|
||||
&self,
|
||||
owner: &PublicKey,
|
||||
subkey: ValueSubkey,
|
||||
value_data: &ValueData,
|
||||
) -> bool {
|
||||
let subkey = subkey as usize;
|
||||
|
||||
// Check is subkey is in owner range
|
||||
if subkey < (self.o_cnt as usize) {
|
||||
// Check value data has valid writer
|
||||
if value_data.writer() == owner {
|
||||
return true;
|
||||
}
|
||||
// Wrong writer
|
||||
return false;
|
||||
}
|
||||
|
||||
// Subkey out of range
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<&[u8]> for DHTSchemaDFLT {
|
||||
|
||||
@@ -58,6 +58,19 @@ impl DHTSchema {
|
||||
DHTSchema::SMPL(s) => s.data_size(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Check a subkey value data against the schema
|
||||
pub fn check_subkey_value_data(
|
||||
&self,
|
||||
owner: &PublicKey,
|
||||
subkey: ValueSubkey,
|
||||
value_data: &ValueData,
|
||||
) -> bool {
|
||||
match self {
|
||||
DHTSchema::DFLT(d) => d.check_subkey_value_data(owner, subkey, value_data),
|
||||
DHTSchema::SMPL(s) => s.check_subkey_value_data(owner, subkey, value_data),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for DHTSchema {
|
||||
|
||||
@@ -18,7 +18,7 @@ use super::*;
|
||||
pub struct DHTSchemaSMPLMember {
|
||||
/// Member key
|
||||
pub m_key: PublicKey,
|
||||
/// Member subkey countanyway,
|
||||
/// Member subkey count
|
||||
pub m_cnt: u16,
|
||||
}
|
||||
|
||||
@@ -78,6 +78,44 @@ impl DHTSchemaSMPL {
|
||||
pub fn data_size(&self) -> usize {
|
||||
self.members.len() * mem::size_of::<DHTSchemaSMPLMember>()
|
||||
}
|
||||
|
||||
/// Check a subkey value data against the schema
|
||||
pub fn check_subkey_value_data(
|
||||
&self,
|
||||
owner: &PublicKey,
|
||||
subkey: ValueSubkey,
|
||||
value_data: &ValueData,
|
||||
) -> bool {
|
||||
let mut cur_subkey = subkey as usize;
|
||||
|
||||
// Check is subkey is in owner range
|
||||
if cur_subkey < (self.o_cnt as usize) {
|
||||
// Check value data has valid writer
|
||||
if value_data.writer() == owner {
|
||||
return true;
|
||||
}
|
||||
// Wrong writer
|
||||
return false;
|
||||
}
|
||||
cur_subkey -= self.o_cnt as usize;
|
||||
|
||||
// Check all member ranges
|
||||
for m in &self.members {
|
||||
// Check if subkey is in member range
|
||||
if cur_subkey < (m.m_cnt as usize) {
|
||||
// Check value data has valid writer
|
||||
if value_data.writer() == &m.m_key {
|
||||
return true;
|
||||
}
|
||||
// Wrong writer
|
||||
return false;
|
||||
}
|
||||
cur_subkey -= m.m_cnt as usize;
|
||||
}
|
||||
|
||||
// Subkey out of range
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<&[u8]> for DHTSchemaSMPL {
|
||||
|
||||
Reference in New Issue
Block a user