mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-01 10:15:31 +00:00
aquatic_common: move access list code to own file
This commit is contained in:
parent
9893341622
commit
60d183003d
7 changed files with 84 additions and 81 deletions
77
aquatic_common/src/access_list.rs
Normal file
77
aquatic_common/src/access_list.rs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use hashbrown::HashSet;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||||
|
pub enum AccessListType {
|
||||||
|
Allow,
|
||||||
|
Deny,
|
||||||
|
Ignore,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
|
pub struct AccessListConfig {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub list_type: AccessListType,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for AccessListConfig {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
path: "".into(),
|
||||||
|
list_type: AccessListType::Ignore,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct AccessList(HashSet<[u8; 20]>);
|
||||||
|
|
||||||
|
impl AccessList {
|
||||||
|
fn parse_info_hash(line: String) -> anyhow::Result<[u8; 20]> {
|
||||||
|
let mut bytes = [0u8; 20];
|
||||||
|
|
||||||
|
hex::decode_to_slice(line, &mut bytes)?;
|
||||||
|
|
||||||
|
Ok(bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_from_path(&mut self, path: &PathBuf) -> anyhow::Result<()> {
|
||||||
|
let file = File::open(path)?;
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
|
||||||
|
let mut new_list = HashSet::new();
|
||||||
|
|
||||||
|
for line in reader.lines() {
|
||||||
|
new_list.insert(Self::parse_info_hash(line?)?);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.0 = new_list;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn allows(&self, list_type: AccessListType, info_hash_bytes: &[u8; 20]) -> bool {
|
||||||
|
match list_type {
|
||||||
|
AccessListType::Allow => self.0.contains(info_hash_bytes),
|
||||||
|
AccessListType::Deny => !self.0.contains(info_hash_bytes),
|
||||||
|
AccessListType::Ignore => true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_info_hash(){
|
||||||
|
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeee".to_owned()).is_ok());
|
||||||
|
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeeef".to_owned()).is_err());
|
||||||
|
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeee".to_owned()).is_err());
|
||||||
|
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeeö".to_owned()).is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,71 +1,10 @@
|
||||||
use std::fs::File;
|
|
||||||
use std::io::{BufRead, BufReader};
|
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use hashbrown::HashSet;
|
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
pub mod access_list;
|
||||||
pub enum AccessListType {
|
|
||||||
Allow,
|
|
||||||
Deny,
|
|
||||||
Ignore,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
||||||
pub struct AccessListConfig {
|
|
||||||
pub path: PathBuf,
|
|
||||||
pub list_type: AccessListType,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for AccessListConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self {
|
|
||||||
path: "".into(),
|
|
||||||
list_type: AccessListType::Ignore,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct AccessList(HashSet<[u8; 20]>);
|
|
||||||
|
|
||||||
impl AccessList {
|
|
||||||
fn parse_info_hash(line: String) -> anyhow::Result<[u8; 20]> {
|
|
||||||
let mut bytes = [0u8; 20];
|
|
||||||
|
|
||||||
hex::decode_to_slice(line, &mut bytes)?;
|
|
||||||
|
|
||||||
Ok(bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_from_path(&mut self, path: &PathBuf) -> anyhow::Result<()> {
|
|
||||||
let file = File::open(path)?;
|
|
||||||
let reader = BufReader::new(file);
|
|
||||||
|
|
||||||
let mut new_list = HashSet::new();
|
|
||||||
|
|
||||||
for line in reader.lines() {
|
|
||||||
new_list.insert(Self::parse_info_hash(line?)?);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.0 = new_list;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn allows(&self, list_type: AccessListType, info_hash_bytes: &[u8; 20]) -> bool {
|
|
||||||
match list_type {
|
|
||||||
AccessListType::Allow => self.0.contains(info_hash_bytes),
|
|
||||||
AccessListType::Deny => !self.0.contains(info_hash_bytes),
|
|
||||||
AccessListType::Ignore => true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Peer or connection valid until this instant
|
/// Peer or connection valid until this instant
|
||||||
///
|
///
|
||||||
|
|
@ -157,16 +96,3 @@ pub fn convert_ipv4_mapped_ipv6(ip_address: IpAddr) -> IpAddr {
|
||||||
ip_address
|
ip_address
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_access_list_parse_info_hash(){
|
|
||||||
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeee".to_owned()).is_ok());
|
|
||||||
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeeef".to_owned()).is_err());
|
|
||||||
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeee".to_owned()).is_err());
|
|
||||||
assert!(AccessList::parse_info_hash("aaaabbbbccccddddeeeeaaaabbbbccccddddeeeö".to_owned()).is_err());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,12 +3,12 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
|
||||||
use std::sync::{atomic::AtomicUsize, Arc};
|
use std::sync::{atomic::AtomicUsize, Arc};
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
use aquatic_common::AccessListType;
|
use aquatic_common::access_list::AccessListType;
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
|
||||||
pub use aquatic_common::{AccessList, ValidUntil};
|
pub use aquatic_common::{access_list::AccessList, ValidUntil};
|
||||||
pub use aquatic_udp_protocol::*;
|
pub use aquatic_udp_protocol::*;
|
||||||
|
|
||||||
pub const MAX_PACKET_SIZE: usize = 4096;
|
pub const MAX_PACKET_SIZE: usize = 4096;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
|
|
||||||
use aquatic_common::AccessListConfig;
|
use aquatic_common::access_list::AccessListConfig;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use aquatic_cli_helpers::LogLevel;
|
use aquatic_cli_helpers::LogLevel;
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ use rand::{
|
||||||
Rng, SeedableRng,
|
Rng, SeedableRng,
|
||||||
};
|
};
|
||||||
|
|
||||||
use aquatic_common::{convert_ipv4_mapped_ipv6, extract_response_peers, AccessListType};
|
use aquatic_common::{convert_ipv4_mapped_ipv6, extract_response_peers, access_list::AccessListType};
|
||||||
use aquatic_udp_protocol::*;
|
use aquatic_udp_protocol::*;
|
||||||
|
|
||||||
use crate::common::*;
|
use crate::common::*;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use std::thread::Builder;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use aquatic_common::AccessListType;
|
use aquatic_common::access_list::AccessListType;
|
||||||
use crossbeam_channel::unbounded;
|
use crossbeam_channel::unbounded;
|
||||||
use privdrop::PrivDrop;
|
use privdrop::PrivDrop;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ use std::time::Instant;
|
||||||
|
|
||||||
use histogram::Histogram;
|
use histogram::Histogram;
|
||||||
|
|
||||||
use aquatic_common::AccessListType;
|
use aquatic_common::access_list::AccessListType;
|
||||||
|
|
||||||
use crate::common::*;
|
use crate::common::*;
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue