1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*use actix_http::header::HeaderMap;
use actix_web::web::Data;
use async_trait::async_trait;
use indexmap::IndexMap;
use log::{debug, info};
use sha2::Digest;
use tokio::sync::Mutex;
#[double]
use crate::client::PointerCachingClient;
#[double]
use crate::client::ChunkCachingClient;
#[double]
use crate::client::CachingClient;
#[double]
use crate::client::StreamingClient;
#[double]
use crate::client::RegisterCachingClient;
#[double]
use crate::client::ArchiveCachingClient;
use mockall_double::double;
use crate::client::command::error::CommandError;
use crate::client::command::Command;
use crate::model::access_list::AccessList;
use crate::config::anttp_config::AntTpConfig;
#[double]
use crate::service::access_checker::AccessChecker;
#[double]
use crate::service::bookmark_resolver::BookmarkResolver;
#[double]
use crate::service::pointer_name_resolver::PointerNameResolver;
#[double]
use crate::service::file_service::FileService;
#[double]
use crate::service::resolver_service::ResolverService;
pub struct UpdateAccessCheckerCommand {
id: u128,
caching_client: Data<Mutex<CachingClient>>,
streaming_client: Data<Mutex<StreamingClient>>,
ant_tp_config: AntTpConfig,
access_checker: Data<Mutex<AccessChecker>>,
bookmark_resolver: Data<Mutex<BookmarkResolver>>,
pointer_name_resolver: Data<PointerNameResolver>,
}
impl UpdateAccessCheckerCommand {
pub fn new(caching_client: Data<Mutex<CachingClient>>,
streaming_client: Data<Mutex<StreamingClient>>,
ant_tp_config: AntTpConfig,
access_checker: Data<Mutex<AccessChecker>>,
bookmark_resolver: Data<Mutex<BookmarkResolver>>,
pointer_name_resolver: Data<PointerNameResolver>,
) -> Self {
let id = rand::random::<u128>();
Self { id, caching_client, streaming_client, ant_tp_config, access_checker, bookmark_resolver, pointer_name_resolver }
}
}
const STRUCT_NAME: &'static str = "UpdateAccessCheckerCommand";
#[async_trait]
impl Command for UpdateAccessCheckerCommand {
async fn execute(&self) -> Result<(), CommandError> {
let caching_client = self.caching_client.get_ref().lock().await.clone();
let streaming_client = self.streaming_client.get_ref().lock().await.clone();
let resolver_service = ResolverService::new(
ArchiveCachingClient::new(caching_client.clone(), streaming_client),
PointerCachingClient::new(caching_client.clone()),
RegisterCachingClient::new(caching_client.clone()),
self.access_checker.clone(),
self.bookmark_resolver.clone(),
self.pointer_name_resolver.clone(),
self.ant_tp_config.cached_mutable_ttl,
);
let file_service = FileService::new(ChunkCachingClient::new(caching_client.clone()), 1);
let access_list = match resolver_service.resolve(&self.ant_tp_config.access_list_address, &"", &HeaderMap::new()).await {
Some(resolved_address) => match file_service.download_data_bytes(resolved_address.xor_name, 0, 0).await {
Ok(buf) => {
let json = String::from_utf8(buf.to_vec()).unwrap_or(String::new());
debug!("json [{}]", json);
serde_json::from_str(&json.as_str().trim()).unwrap_or(AccessList::default())
}
Err(_) => AccessList::default()
}
None => AccessList::default()
};
self.access_checker.lock().await.update(&access_list);
info!("access list at [{}] processed successfully: [{:?}]", self.ant_tp_config.access_list_address, access_list);
Ok(())
}
fn action_hash(&self) -> Vec<u8> {
let mut hasher = sha2::Sha256::new();
hasher.update(STRUCT_NAME);
hasher.update(self.ant_tp_config.access_list_address.clone());
hasher.finalize().to_ascii_lowercase()
}
fn id(&self) -> u128 {
self.id
}
fn name(&self) -> String {
STRUCT_NAME.to_string()
}
fn properties(&self) -> IndexMap<String, String> {
let mut properties = IndexMap::new();
properties.insert("access_list_address".to_string(), self.ant_tp_config.access_list_address.clone());
properties
}
}*/