Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overhaul core Tracker: refactor authentication module #1196

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
44255e2
refactor: [#1195] create dir for mod
josecelano Jan 21, 2025
f4c7b97
refactor: [#1195] extract DatabaseKeyRepository
josecelano Jan 21, 2025
12a62ce
refactor: [#1195] extract InMemoryKeyRepository
josecelano Jan 21, 2025
a93a79c
refactor: [#1195] remove deprecated context section in docs
josecelano Jan 21, 2025
cd542dc
refactor: [#1195] extract authentication::Service
josecelano Jan 21, 2025
81b4b3c
refactor: [#1195] extract and move method
josecelano Jan 21, 2025
23590e7
refactor: [#1195] make method private
josecelano Jan 21, 2025
bb2f9e0
refactor: [#1195] extract core::authentication::handler::KeysHandler
josecelano Jan 21, 2025
c06da07
refactor: [#1195] more authentication tests to authentication service
josecelano Jan 22, 2025
9c61b26
refactor: [#1195] move tests to KeysHandler
josecelano Jan 22, 2025
663250b
refactor: [#1195] rename methods
josecelano Jan 22, 2025
504357c
refactor: [#1195] inject dependencies in authenticatio::Facade
josecelano Jan 22, 2025
965e911
refactor: [#1195] inject dependencies into authenticattion::Facade
josecelano Jan 22, 2025
457d01b
refactor: [#1195] rename service to AuthenticationService
josecelano Jan 22, 2025
747b608
refactor: [#1195] use AuthenticationService directy
josecelano Jan 22, 2025
661fe6a
refactor: [#1195] remove AuthenticationService from authentication Fa…
josecelano Jan 22, 2025
77eccdc
fix: [#1195] format
josecelano Jan 22, 2025
dff6bca
refactor: [#1195] remove authentication::Facade service
josecelano Jan 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
// Load peer keys
if app_container.tracker.is_private() {
app_container
.tracker
.authentication
.keys_handler
.load_keys_from_database()
.await
.expect("Could not retrieve keys from database.");
Expand Down Expand Up @@ -100,6 +99,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
if let Some(job) = http_tracker::start_job(
http_tracker_config,
app_container.tracker.clone(),
app_container.authentication_service.clone(),
app_container.whitelist_authorization.clone(),
app_container.stats_event_sender.clone(),
registar.give_form(),
Expand All @@ -119,6 +119,7 @@ pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<
if let Some(job) = tracker_apis::start_job(
http_api_config,
app_container.tracker.clone(),
app_container.keys_handler.clone(),
app_container.whitelist_manager.clone(),
app_container.ban_service.clone(),
app_container.stats_event_sender.clone(),
Expand Down
18 changes: 14 additions & 4 deletions src/app_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ use std::sync::Arc;

use torrust_tracker_configuration::Configuration;

use crate::core::authentication::handler::KeysHandler;
use crate::core::authentication::key::repository::in_memory::InMemoryKeyRepository;
use crate::core::authentication::key::repository::persisted::DatabaseKeyRepository;
use crate::core::authentication::service::{self, AuthenticationService};
use crate::core::databases::Database;
use crate::core::services::initialize_database;
use crate::core::whitelist;
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
use crate::core::{authentication, whitelist};

/// Initialize the tracker dependencies.
#[allow(clippy::type_complexity)]
Expand All @@ -17,15 +21,21 @@ pub fn initialize_tracker_dependencies(
Arc<Box<dyn Database>>,
Arc<InMemoryWhitelist>,
Arc<whitelist::authorization::Authorization>,
Arc<authentication::Facade>,
Arc<AuthenticationService>,
) {
let database = initialize_database(config);
let in_memory_whitelist = Arc::new(InMemoryWhitelist::default());
let whitelist_authorization = Arc::new(whitelist::authorization::Authorization::new(
&config.core,
&in_memory_whitelist.clone(),
));
let authentication = Arc::new(authentication::Facade::new(&config.core, &database.clone()));
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
let authentication_service = Arc::new(service::AuthenticationService::new(&config.core, &in_memory_key_repository));
let _keys_handler = Arc::new(KeysHandler::new(
&db_key_repository.clone(),
&in_memory_key_repository.clone(),
));

(database, in_memory_whitelist, whitelist_authorization, authentication)
(database, in_memory_whitelist, whitelist_authorization, authentication_service)
}
27 changes: 18 additions & 9 deletions src/bootstrap/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ use tracing::instrument;
use super::config::initialize_configuration;
use crate::bootstrap;
use crate::container::AppContainer;
use crate::core::authentication::handler::KeysHandler;
use crate::core::authentication::key::repository::in_memory::InMemoryKeyRepository;
use crate::core::authentication::key::repository::persisted::DatabaseKeyRepository;
use crate::core::authentication::service;
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist_manager, statistics};
use crate::core::whitelist;
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
use crate::core::{authentication, whitelist};
use crate::servers::udp::server::banning::BanService;
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
use crate::shared::crypto::ephemeral_instance_keys;
Expand Down Expand Up @@ -89,23 +93,28 @@ pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
&in_memory_whitelist.clone(),
));
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
let authentication = Arc::new(authentication::Facade::new(&configuration.core, &database.clone()));

let tracker = Arc::new(initialize_tracker(
configuration,
&database,
&whitelist_authorization,
&authentication,
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
let authentication_service = Arc::new(service::AuthenticationService::new(
&configuration.core,
&in_memory_key_repository,
));
let keys_handler = Arc::new(KeysHandler::new(
&db_key_repository.clone(),
&in_memory_key_repository.clone(),
));

let tracker = Arc::new(initialize_tracker(configuration, &database, &whitelist_authorization));

AppContainer {
tracker,
keys_handler,
authentication_service,
whitelist_authorization,
ban_service,
stats_event_sender,
stats_repository,
whitelist_manager,
authentication,
}
}

Expand Down
31 changes: 26 additions & 5 deletions src/bootstrap/jobs/http_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use torrust_tracker_configuration::HttpTracker;
use tracing::instrument;

use super::make_rust_tls;
use crate::core::authentication::service::AuthenticationService;
use crate::core::statistics::event::sender::Sender;
use crate::core::{self, statistics, whitelist};
use crate::servers::http::server::{HttpServer, Launcher};
Expand All @@ -34,10 +35,11 @@ use crate::servers::registar::ServiceRegistrationForm;
///
/// It would panic if the `config::HttpTracker` struct would contain inappropriate values.
///
#[instrument(skip(config, tracker, whitelist_authorization, stats_event_sender, form))]
#[instrument(skip(config, tracker, authentication_service, whitelist_authorization, stats_event_sender, form))]
pub async fn start_job(
config: &HttpTracker,
tracker: Arc<core::Tracker>,
authentication_service: Arc<AuthenticationService>,
whitelist_authorization: Arc<whitelist::authorization::Authorization>,
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
form: ServiceRegistrationForm,
Expand All @@ -55,6 +57,7 @@ pub async fn start_job(
socket,
tls,
tracker.clone(),
authentication_service.clone(),
whitelist_authorization.clone(),
stats_event_sender.clone(),
form,
Expand All @@ -70,12 +73,19 @@ async fn start_v1(
socket: SocketAddr,
tls: Option<RustlsConfig>,
tracker: Arc<core::Tracker>,
authentication_service: Arc<AuthenticationService>,
whitelist_authorization: Arc<whitelist::authorization::Authorization>,
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
form: ServiceRegistrationForm,
) -> JoinHandle<()> {
let server = HttpServer::new(Launcher::new(socket, tls))
.start(tracker, whitelist_authorization, stats_event_sender, form)
.start(
tracker,
authentication_service,
whitelist_authorization,
stats_event_sender,
form,
)
.await
.expect("it should be able to start to the http tracker");

Expand All @@ -100,9 +110,13 @@ mod tests {

use crate::bootstrap::app::initialize_global_services;
use crate::bootstrap::jobs::http_tracker::start_job;
use crate::core::authentication::handler::KeysHandler;
use crate::core::authentication::key::repository::in_memory::InMemoryKeyRepository;
use crate::core::authentication::key::repository::persisted::DatabaseKeyRepository;
use crate::core::authentication::service;
use crate::core::services::{initialize_database, initialize_tracker, statistics};
use crate::core::whitelist;
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
use crate::core::{authentication, whitelist};
use crate::servers::http::Version;
use crate::servers::registar::Registar;

Expand All @@ -123,15 +137,22 @@ mod tests {
&cfg.core,
&in_memory_whitelist.clone(),
));
let authentication = Arc::new(authentication::Facade::new(&cfg.core, &database.clone()));
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
let authentication_service = Arc::new(service::AuthenticationService::new(&cfg.core, &in_memory_key_repository));
let _keys_handler = Arc::new(KeysHandler::new(
&db_key_repository.clone(),
&in_memory_key_repository.clone(),
));

let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization, &authentication));
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization));

let version = Version::V1;

start_job(
config,
tracker,
authentication_service,
whitelist_authorization,
stats_event_sender,
Registar::default().give_form(),
Expand Down
34 changes: 30 additions & 4 deletions src/bootstrap/jobs/tracker_apis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use torrust_tracker_configuration::{AccessTokens, HttpApi};
use tracing::instrument;

use super::make_rust_tls;
use crate::core::authentication::handler::KeysHandler;
use crate::core::statistics::event::sender::Sender;
use crate::core::statistics::repository::Repository;
use crate::core::whitelist::manager::WhiteListManager;
Expand Down Expand Up @@ -60,10 +61,20 @@ pub struct ApiServerJobStarted();
///
///
#[allow(clippy::too_many_arguments)]
#[instrument(skip(config, tracker, whitelist_manager, ban_service, stats_event_sender, stats_repository, form))]
#[instrument(skip(
config,
tracker,
keys_handler,
whitelist_manager,
ban_service,
stats_event_sender,
stats_repository,
form
))]
pub async fn start_job(
config: &HttpApi,
tracker: Arc<core::Tracker>,
keys_handler: Arc<KeysHandler>,
whitelist_manager: Arc<WhiteListManager>,
ban_service: Arc<RwLock<BanService>>,
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
Expand All @@ -85,6 +96,7 @@ pub async fn start_job(
bind_to,
tls,
tracker.clone(),
keys_handler.clone(),
whitelist_manager.clone(),
ban_service.clone(),
stats_event_sender.clone(),
Expand All @@ -103,6 +115,7 @@ pub async fn start_job(
socket,
tls,
tracker,
keys_handler,
whitelist_manager,
ban_service,
stats_event_sender,
Expand All @@ -114,6 +127,7 @@ async fn start_v1(
socket: SocketAddr,
tls: Option<RustlsConfig>,
tracker: Arc<core::Tracker>,
keys_handler: Arc<KeysHandler>,
whitelist_manager: Arc<WhiteListManager>,
ban_service: Arc<RwLock<BanService>>,
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
Expand All @@ -124,6 +138,7 @@ async fn start_v1(
let server = ApiServer::new(Launcher::new(socket, tls))
.start(
tracker,
keys_handler,
whitelist_manager,
stats_event_sender,
stats_repository,
Expand All @@ -149,9 +164,13 @@ mod tests {

use crate::bootstrap::app::initialize_global_services;
use crate::bootstrap::jobs::tracker_apis::start_job;
use crate::core::authentication::handler::KeysHandler;
use crate::core::authentication::key::repository::in_memory::InMemoryKeyRepository;
use crate::core::authentication::key::repository::persisted::DatabaseKeyRepository;
use crate::core::authentication::service;
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist_manager, statistics};
use crate::core::whitelist;
use crate::core::whitelist::repository::in_memory::InMemoryWhitelist;
use crate::core::{authentication, whitelist};
use crate::servers::apis::Version;
use crate::servers::registar::Registar;
use crate::servers::udp::server::banning::BanService;
Expand All @@ -176,15 +195,22 @@ mod tests {
&in_memory_whitelist.clone(),
));
let whitelist_manager = initialize_whitelist_manager(database.clone(), in_memory_whitelist.clone());
let authentication = Arc::new(authentication::Facade::new(&cfg.core, &database.clone()));
let db_key_repository = Arc::new(DatabaseKeyRepository::new(&database));
let in_memory_key_repository = Arc::new(InMemoryKeyRepository::default());
let _authentication_service = Arc::new(service::AuthenticationService::new(&cfg.core, &in_memory_key_repository));
let keys_handler = Arc::new(KeysHandler::new(
&db_key_repository.clone(),
&in_memory_key_repository.clone(),
));

let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization, &authentication));
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_authorization));

let version = Version::V1;

start_job(
config,
tracker,
keys_handler,
whitelist_manager,
ban_service,
stats_event_sender,
Expand Down
7 changes: 5 additions & 2 deletions src/container.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ use std::sync::Arc;

use tokio::sync::RwLock;

use crate::core::authentication::handler::KeysHandler;
use crate::core::authentication::service::AuthenticationService;
use crate::core::statistics::event::sender::Sender;
use crate::core::statistics::repository::Repository;
use crate::core::whitelist::manager::WhiteListManager;
use crate::core::{authentication, whitelist, Tracker};
use crate::core::{whitelist, Tracker};
use crate::servers::udp::server::banning::BanService;

pub struct AppContainer {
pub tracker: Arc<Tracker>,
pub keys_handler: Arc<KeysHandler>,
pub authentication_service: Arc<AuthenticationService>,
pub whitelist_authorization: Arc<whitelist::authorization::Authorization>,
pub ban_service: Arc<RwLock<BanService>>,
pub stats_event_sender: Arc<Option<Box<dyn Sender>>>,
pub stats_repository: Arc<Repository>,
pub whitelist_manager: Arc<WhiteListManager>,
pub authentication: Arc<authentication::Facade>,
}
Loading
Loading