Skip to content

Commit e630e5f

Browse files
committed
Merge #1190: Overhaul core Tracker: extract whitelist authorization
a5f41fc refactor: [#1189] extract whitelist::authorization::Authorization (Jose Celano) 597c986 refactor: [#1189] extract mod whitelist::manager (Jose Celano) c35c124 refactor: [#1189] new whitelist::repository module (Jose Celano) Pull request description: Overhaul core Tracker: extract whitelist authorization. ACKs for top commit: josecelano: ACK a5f41fc Tree-SHA512: c4d03c3585c547f63751f808e7d1792a4af662d3627d53cb6775421f3b052d62859315ba86440d96390d84c82d6bfbf7b1c55bb3f0b90aab789660e07756141e
2 parents 765bd6f + a5f41fc commit e630e5f

37 files changed

+652
-372
lines changed

src/app.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
6161
// Load whitelisted torrents
6262
if app_container.tracker.is_listed() {
6363
app_container
64-
.tracker
6564
.whitelist_manager
6665
.load_whitelist_from_database()
6766
.await
@@ -81,6 +80,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
8180
udp_tracker::start_job(
8281
udp_tracker_config,
8382
app_container.tracker.clone(),
83+
app_container.whitelist_authorization.clone(),
8484
app_container.stats_event_sender.clone(),
8585
app_container.ban_service.clone(),
8686
registar.give_form(),
@@ -99,6 +99,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
9999
if let Some(job) = http_tracker::start_job(
100100
http_tracker_config,
101101
app_container.tracker.clone(),
102+
app_container.whitelist_authorization.clone(),
102103
app_container.stats_event_sender.clone(),
103104
registar.give_form(),
104105
servers::http::Version::V1,
@@ -117,6 +118,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
117118
if let Some(job) = tracker_apis::start_job(
118119
http_api_config,
119120
app_container.tracker.clone(),
121+
app_container.whitelist_manager.clone(),
120122
app_container.ban_service.clone(),
121123
app_container.stats_event_sender.clone(),
122124
app_container.stats_repository.clone(),

src/app_test.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,26 @@ use std::sync::Arc;
44
use torrust_tracker_configuration::Configuration;
55

66
use crate::core::databases::Database;
7-
use crate::core::services::{initialize_database, initialize_whitelist};
8-
use crate::core::whitelist::WhiteListManager;
7+
use crate::core::services::initialize_database;
8+
use crate::core::whitelist;
9+
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
910

1011
/// Initialize the tracker dependencies.
1112
#[allow(clippy::type_complexity)]
1213
#[must_use]
13-
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
14+
pub fn initialize_tracker_dependencies(
15+
config: &Configuration,
16+
) -> (
17+
Arc<Box<dyn Database>>,
18+
Arc<InMemoryWhitelist>,
19+
Arc<whitelist::authorization::Authorization>,
20+
) {
1421
let database = initialize_database(config);
15-
let whitelist_manager = initialize_whitelist(database.clone());
22+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
23+
let whitelist_authorization = Arc::new(whitelist::authorization::Authorization::new(
24+
&config.core,
25+
&in_memory_whitelist.clone(),
26+
));
1627

17-
(database, whitelist_manager)
28+
(database, in_memory_whitelist, whitelist_authorization)
1829
}

src/bootstrap/app.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ use tracing::instrument;
2222
use super::config::initialize_configuration;
2323
use crate::bootstrap;
2424
use crate::container::AppContainer;
25-
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
25+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist_manager, statistics};
26+
use crate::core::whitelist;
27+
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
2628
use crate::servers::udp::server::banning::BanService;
2729
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
2830
use crate::shared::crypto::ephemeral_instance_keys;
@@ -81,11 +83,18 @@ pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
8183
let stats_repository = Arc::new(stats_repository);
8284
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
8385
let database = initialize_database(configuration);
84-
let whitelist_manager = initialize_whitelist(database.clone());
85-
let tracker = Arc::new(initialize_tracker(configuration, &database, &whitelist_manager));
86+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
87+
let whitelist_authorization = Arc::new(whitelist::authorization::Authorization::new(
88+
&configuration.core,
89+
&in_memory_whitelist.clone(),
90+
));
91+
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
92+
93+
let tracker = Arc::new(initialize_tracker(configuration, &database, &whitelist_authorization));
8694

8795
AppContainer {
8896
tracker,
97+
whitelist_authorization,
8998
ban_service,
9099
stats_event_sender,
91100
stats_repository,

src/bootstrap/jobs/http_tracker.rs

+36-11
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use tracing::instrument;
2020

2121
use super::make_rust_tls;
2222
use crate::core::statistics::event::sender::Sender;
23-
use crate::core::{self, statistics};
23+
use crate::core::{self, statistics, whitelist};
2424
use crate::servers::http::server::{HttpServer, Launcher};
2525
use crate::servers::http::Version;
2626
use crate::servers::registar::ServiceRegistrationForm;
@@ -34,10 +34,11 @@ use crate::servers::registar::ServiceRegistrationForm;
3434
///
3535
/// It would panic if the `config::HttpTracker` struct would contain inappropriate values.
3636
///
37-
#[instrument(skip(config, tracker, stats_event_sender, form))]
37+
#[instrument(skip(config, tracker, whitelist_authorization, stats_event_sender, form))]
3838
pub async fn start_job(
3939
config: &HttpTracker,
4040
tracker: Arc<core::Tracker>,
41+
whitelist_authorization: Arc<whitelist::authorization::Authorization>,
4142
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
4243
form: ServiceRegistrationForm,
4344
version: Version,
@@ -49,21 +50,32 @@ pub async fn start_job(
4950
.map(|tls| tls.expect("it should have a valid http tracker tls configuration"));
5051

5152
match version {
52-
Version::V1 => Some(start_v1(socket, tls, tracker.clone(), stats_event_sender.clone(), form).await),
53+
Version::V1 => Some(
54+
start_v1(
55+
socket,
56+
tls,
57+
tracker.clone(),
58+
whitelist_authorization.clone(),
59+
stats_event_sender.clone(),
60+
form,
61+
)
62+
.await,
63+
),
5364
}
5465
}
5566

5667
#[allow(clippy::async_yields_async)]
57-
#[instrument(skip(socket, tls, tracker, stats_event_sender, form))]
68+
#[instrument(skip(socket, tls, tracker, whitelist_authorization, stats_event_sender, form))]
5869
async fn start_v1(
5970
socket: SocketAddr,
6071
tls: Option<RustlsConfig>,
6172
tracker: Arc<core::Tracker>,
73+
whitelist_authorization: Arc<whitelist::authorization::Authorization>,
6274
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
6375
form: ServiceRegistrationForm,
6476
) -> JoinHandle<()> {
6577
let server = HttpServer::new(Launcher::new(socket, tls))
66-
.start(tracker, stats_event_sender, form)
78+
.start(tracker, whitelist_authorization, stats_event_sender, form)
6779
.await
6880
.expect("it should be able to start to the http tracker");
6981

@@ -88,7 +100,9 @@ mod tests {
88100

89101
use crate::bootstrap::app::initialize_global_services;
90102
use crate::bootstrap::jobs::http_tracker::start_job;
91-
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
103+
use crate::core::services::{initialize_database, initialize_tracker, statistics};
104+
use crate::core::whitelist;
105+
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
92106
use crate::servers::http::Version;
93107
use crate::servers::registar::Registar;
94108

@@ -104,13 +118,24 @@ mod tests {
104118
initialize_global_services(&cfg);
105119

106120
let database = initialize_database(&cfg);
107-
let whitelist_manager = initialize_whitelist(database.clone());
108-
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
121+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
122+
let whitelist_authorization = Arc::new(whitelist::authorization::Authorization::new(
123+
&cfg.core,
124+
&in_memory_whitelist.clone(),
125+
));
126+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization));
109127

110128
let version = Version::V1;
111129

112-
start_job(config, tracker, stats_event_sender, Registar::default().give_form(), version)
113-
.await
114-
.expect("it should be able to join to the http tracker start-job");
130+
start_job(
131+
config,
132+
tracker,
133+
whitelist_authorization,
134+
stats_event_sender,
135+
Registar::default().give_form(),
136+
version,
137+
)
138+
.await
139+
.expect("it should be able to join to the http tracker start-job");
115140
}
116141
}

src/bootstrap/jobs/tracker_apis.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ use torrust_tracker_configuration::{AccessTokens, HttpApi};
3030
use tracing::instrument;
3131

3232
use super::make_rust_tls;
33-
use crate::core;
3433
use crate::core::statistics::event::sender::Sender;
3534
use crate::core::statistics::repository::Repository;
35+
use crate::core::whitelist::manager::WhiteListManager;
36+
use crate::core::{self};
3637
use crate::servers::apis::server::{ApiServer, Launcher};
3738
use crate::servers::apis::Version;
3839
use crate::servers::registar::ServiceRegistrationForm;
@@ -58,10 +59,12 @@ pub struct ApiServerJobStarted();
5859
/// It would panic if unable to send the `ApiServerJobStarted` notice.
5960
///
6061
///
61-
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository, form))]
62+
#[allow(clippy::too_many_arguments)]
63+
#[instrument(skip(config, tracker, whitelist_manager, ban_service, stats_event_sender, stats_repository, form))]
6264
pub async fn start_job(
6365
config: &HttpApi,
6466
tracker: Arc<core::Tracker>,
67+
whitelist_manager: Arc<WhiteListManager>,
6568
ban_service: Arc<RwLock<BanService>>,
6669
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
6770
stats_repository: Arc<Repository>,
@@ -82,6 +85,7 @@ pub async fn start_job(
8285
bind_to,
8386
tls,
8487
tracker.clone(),
88+
whitelist_manager.clone(),
8589
ban_service.clone(),
8690
stats_event_sender.clone(),
8791
stats_repository.clone(),
@@ -99,6 +103,7 @@ pub async fn start_job(
99103
socket,
100104
tls,
101105
tracker,
106+
whitelist_manager,
102107
ban_service,
103108
stats_event_sender,
104109
stats_repository,
@@ -109,6 +114,7 @@ async fn start_v1(
109114
socket: SocketAddr,
110115
tls: Option<RustlsConfig>,
111116
tracker: Arc<core::Tracker>,
117+
whitelist_manager: Arc<WhiteListManager>,
112118
ban_service: Arc<RwLock<BanService>>,
113119
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
114120
stats_repository: Arc<Repository>,
@@ -118,6 +124,7 @@ async fn start_v1(
118124
let server = ApiServer::new(Launcher::new(socket, tls))
119125
.start(
120126
tracker,
127+
whitelist_manager,
121128
stats_event_sender,
122129
stats_repository,
123130
ban_service,
@@ -142,7 +149,9 @@ mod tests {
142149

143150
use crate::bootstrap::app::initialize_global_services;
144151
use crate::bootstrap::jobs::tracker_apis::start_job;
145-
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
152+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist_manager, statistics};
153+
use crate::core::whitelist;
154+
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
146155
use crate::servers::apis::Version;
147156
use crate::servers::registar::Registar;
148157
use crate::servers::udp::server::banning::BanService;
@@ -161,14 +170,21 @@ mod tests {
161170
initialize_global_services(&cfg);
162171

163172
let database = initialize_database(&cfg);
164-
let whitelist_manager = initialize_whitelist(database.clone());
165-
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
173+
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
174+
let whitelist_authorization = Arc::new(whitelist::authorization::Authorization::new(
175+
&cfg.core,
176+
&in_memory_whitelist.clone(),
177+
));
178+
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
179+
180+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization));
166181

167182
let version = Version::V1;
168183

169184
start_job(
170185
config,
171186
tracker,
187+
whitelist_manager,
172188
ban_service,
173189
stats_event_sender,
174190
stats_repository,

src/bootstrap/jobs/udp_tracker.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use tokio::task::JoinHandle;
1313
use torrust_tracker_configuration::UdpTracker;
1414
use tracing::instrument;
1515

16-
use crate::core;
1716
use crate::core::statistics::event::sender::Sender;
17+
use crate::core::{self, whitelist};
1818
use crate::servers::registar::ServiceRegistrationForm;
1919
use crate::servers::udp::server::banning::BanService;
2020
use crate::servers::udp::server::spawner::Spawner;
@@ -32,10 +32,11 @@ use crate::servers::udp::UDP_TRACKER_LOG_TARGET;
3232
/// It will panic if the task did not finish successfully.
3333
#[must_use]
3434
#[allow(clippy::async_yields_async)]
35-
#[instrument(skip(config, tracker, stats_event_sender, ban_service, form))]
35+
#[instrument(skip(config, tracker, whitelist_authorization, stats_event_sender, ban_service, form))]
3636
pub async fn start_job(
3737
config: &UdpTracker,
3838
tracker: Arc<core::Tracker>,
39+
whitelist_authorization: Arc<whitelist::authorization::Authorization>,
3940
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
4041
ban_service: Arc<RwLock<BanService>>,
4142
form: ServiceRegistrationForm,
@@ -44,7 +45,14 @@ pub async fn start_job(
4445
let cookie_lifetime = config.cookie_lifetime;
4546

4647
let server = Server::new(Spawner::new(bind_to))
47-
.start(tracker, stats_event_sender, ban_service, form, cookie_lifetime)
48+
.start(
49+
tracker,
50+
whitelist_authorization,
51+
stats_event_sender,
52+
ban_service,
53+
form,
54+
cookie_lifetime,
55+
)
4856
.await
4957
.expect("it should be able to start the udp tracker");
5058

src/container.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ use tokio::sync::RwLock;
44

55
use crate::core::statistics::event::sender::Sender;
66
use crate::core::statistics::repository::Repository;
7-
use crate::core::whitelist::WhiteListManager;
8-
use crate::core::Tracker;
7+
use crate::core::whitelist::manager::WhiteListManager;
8+
use crate::core::{whitelist, Tracker};
99
use crate::servers::udp::server::banning::BanService;
1010

1111
pub struct AppContainer {
1212
pub tracker: Arc<Tracker>,
13+
pub whitelist_authorization: Arc<whitelist::authorization::Authorization>,
1314
pub ban_service: Arc<RwLock<BanService>>,
1415
pub stats_event_sender: Arc<Option<Box<dyn Sender>>>,
1516
pub stats_repository: Arc<Repository>,

0 commit comments

Comments
 (0)