Skip to content

Commit 478e234

Browse files
committed
feat: [#448] new authorization service implemented in the other services
1 parent 9ebd7b5 commit 478e234

File tree

6 files changed

+38
-63
lines changed

6 files changed

+38
-63
lines changed

src/services/authentication.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@ use argon2::{Argon2, PasswordHash, PasswordVerifier};
55
use jsonwebtoken::{decode, encode, Algorithm, DecodingKey, EncodingKey, Header, Validation};
66
use pbkdf2::Pbkdf2;
77

8-
use super::user::{DbUserProfileRepository, DbUserRepository};
8+
use super::user::DbUserProfileRepository;
99
use crate::config::Configuration;
1010
use crate::databases::database::{Database, Error};
1111
use crate::errors::ServiceError;
1212
use crate::models::user::{UserAuthentication, UserClaims, UserCompact, UserId};
13+
use crate::services::user::Repository;
1314
use crate::utils::clock;
1415

1516
pub struct Service {
1617
configuration: Arc<Configuration>,
1718
json_web_token: Arc<JsonWebToken>,
18-
user_repository: Arc<DbUserRepository>,
19+
user_repository: Arc<Box<dyn Repository>>,
1920
user_profile_repository: Arc<DbUserProfileRepository>,
2021
user_authentication_repository: Arc<DbUserAuthenticationRepository>,
2122
}
@@ -24,7 +25,7 @@ impl Service {
2425
pub fn new(
2526
configuration: Arc<Configuration>,
2627
json_web_token: Arc<JsonWebToken>,
27-
user_repository: Arc<DbUserRepository>,
28+
user_repository: Arc<Box<dyn Repository>>,
2829
user_profile_repository: Arc<DbUserProfileRepository>,
2930
user_authentication_repository: Arc<DbUserAuthenticationRepository>,
3031
) -> Self {

src/services/category.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
//! Category service.
22
use std::sync::Arc;
33

4-
use super::user::DbUserRepository;
4+
use super::authorization::{self, ACTION};
55
use crate::databases::database::{Category, Database, Error as DatabaseError};
66
use crate::errors::ServiceError;
77
use crate::models::category::CategoryId;
88
use crate::models::user::UserId;
99

1010
pub struct Service {
1111
category_repository: Arc<DbCategoryRepository>,
12-
user_repository: Arc<DbUserRepository>,
12+
authorization_service: Arc<authorization::Service>,
1313
}
1414

1515
impl Service {
1616
#[must_use]
17-
pub fn new(category_repository: Arc<DbCategoryRepository>, user_repository: Arc<DbUserRepository>) -> Service {
17+
pub fn new(category_repository: Arc<DbCategoryRepository>, authorization_service: Arc<authorization::Service>) -> Service {
1818
Service {
1919
category_repository,
20-
user_repository,
20+
authorization_service,
2121
}
2222
}
2323

@@ -32,13 +32,9 @@ impl Service {
3232
/// * The category already exists.
3333
/// * There is a database error.
3434
pub async fn add_category(&self, category_name: &str, user_id: &UserId) -> Result<i64, ServiceError> {
35-
let user = self.user_repository.get_compact(user_id).await?;
36-
37-
// Check if user is administrator
38-
// todo: extract authorization service
39-
if !user.administrator {
40-
return Err(ServiceError::Unauthorized);
41-
}
35+
self.authorization_service
36+
.authorize(ACTION::AddCategory, Some(*user_id))
37+
.await?;
4238

4339
let trimmed_name = category_name.trim();
4440

@@ -70,13 +66,9 @@ impl Service {
7066
/// * The user does not have the required permissions.
7167
/// * There is a database error.
7268
pub async fn delete_category(&self, category_name: &str, user_id: &UserId) -> Result<(), ServiceError> {
73-
let user = self.user_repository.get_compact(user_id).await?;
74-
75-
// Check if user is administrator
76-
// todo: extract authorization service
77-
if !user.administrator {
78-
return Err(ServiceError::Unauthorized);
79-
}
69+
self.authorization_service
70+
.authorize(ACTION::DeleteCategory, Some(*user_id))
71+
.await?;
8072

8173
match self.category_repository.delete(category_name).await {
8274
Ok(()) => Ok(()),

src/services/proxy.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ use std::sync::Arc;
1010

1111
use bytes::Bytes;
1212

13-
use super::user::DbUserRepository;
1413
use crate::cache::image::manager::{Error, ImageCacheService};
1514
use crate::models::user::UserId;
15+
use crate::services::user::Repository;
1616

1717
pub struct Service {
1818
image_cache_service: Arc<ImageCacheService>,
19-
user_repository: Arc<DbUserRepository>,
19+
user_repository: Arc<Box<dyn Repository>>,
2020
}
2121

2222
impl Service {
2323
#[must_use]
24-
pub fn new(image_cache_service: Arc<ImageCacheService>, user_repository: Arc<DbUserRepository>) -> Self {
24+
pub fn new(image_cache_service: Arc<ImageCacheService>, user_repository: Arc<Box<dyn Repository>>) -> Self {
2525
Self {
2626
image_cache_service,
2727
user_repository,

src/services/settings.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
//! Settings service.
22
use std::sync::Arc;
33

4-
use super::user::DbUserRepository;
4+
use super::authorization::{self, ACTION};
55
use crate::config::{Configuration, ConfigurationPublic, Settings};
66
use crate::errors::ServiceError;
77
use crate::models::user::UserId;
88

99
pub struct Service {
1010
configuration: Arc<Configuration>,
11-
user_repository: Arc<DbUserRepository>,
11+
authorization_service: Arc<authorization::Service>,
1212
}
1313

1414
impl Service {
1515
#[must_use]
16-
pub fn new(configuration: Arc<Configuration>, user_repository: Arc<DbUserRepository>) -> Service {
16+
pub fn new(configuration: Arc<Configuration>, authorization_service: Arc<authorization::Service>) -> Service {
1717
Service {
1818
configuration,
19-
user_repository,
19+
authorization_service,
2020
}
2121
}
2222

@@ -26,13 +26,9 @@ impl Service {
2626
///
2727
/// It returns an error if the user does not have the required permissions.
2828
pub async fn get_all(&self, user_id: &UserId) -> Result<Settings, ServiceError> {
29-
let user = self.user_repository.get_compact(user_id).await?;
30-
31-
// Check if user is administrator
32-
// todo: extract authorization service
33-
if !user.administrator {
34-
return Err(ServiceError::Unauthorized);
35-
}
29+
self.authorization_service
30+
.authorize(ACTION::GetSettings, Some(*user_id))
31+
.await?;
3632

3733
let torrust_index_configuration = self.configuration.get_all().await;
3834

@@ -45,13 +41,9 @@ impl Service {
4541
///
4642
/// It returns an error if the user does not have the required permissions.
4743
pub async fn get_all_masking_secrets(&self, user_id: &UserId) -> Result<Settings, ServiceError> {
48-
let user = self.user_repository.get_compact(user_id).await?;
49-
50-
// Check if user is administrator
51-
// todo: extract authorization service
52-
if !user.administrator {
53-
return Err(ServiceError::Unauthorized);
54-
}
44+
self.authorization_service
45+
.authorize(ACTION::GetSettingsSecret, Some(*user_id))
46+
.await?;
5547

5648
let mut torrust_index_configuration = self.configuration.get_all().await;
5749

src/services/tag.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
//! Tag service.
22
use std::sync::Arc;
33

4-
use super::user::DbUserRepository;
4+
use super::authorization::{self, ACTION};
55
use crate::databases::database::{Database, Error as DatabaseError, Error};
66
use crate::errors::ServiceError;
77
use crate::models::torrent_tag::{TagId, TorrentTag};
88
use crate::models::user::UserId;
99

1010
pub struct Service {
1111
tag_repository: Arc<DbTagRepository>,
12-
user_repository: Arc<DbUserRepository>,
12+
authorization_service: Arc<authorization::Service>,
1313
}
1414

1515
impl Service {
1616
#[must_use]
17-
pub fn new(tag_repository: Arc<DbTagRepository>, user_repository: Arc<DbUserRepository>) -> Service {
17+
pub fn new(tag_repository: Arc<DbTagRepository>, authorization_service: Arc<authorization::Service>) -> Service {
1818
Service {
1919
tag_repository,
20-
user_repository,
20+
authorization_service,
2121
}
2222
}
2323

@@ -30,13 +30,7 @@ impl Service {
3030
/// * The user does not have the required permissions.
3131
/// * There is a database error.
3232
pub async fn add_tag(&self, tag_name: &str, user_id: &UserId) -> Result<TagId, ServiceError> {
33-
let user = self.user_repository.get_compact(user_id).await?;
34-
35-
// Check if user is administrator
36-
// todo: extract authorization service
37-
if !user.administrator {
38-
return Err(ServiceError::Unauthorized);
39-
}
33+
self.authorization_service.authorize(ACTION::AddTag, Some(*user_id)).await?;
4034

4135
let trimmed_name = tag_name.trim();
4236

@@ -62,13 +56,9 @@ impl Service {
6256
/// * The user does not have the required permissions.
6357
/// * There is a database error.
6458
pub async fn delete_tag(&self, tag_id: &TagId, user_id: &UserId) -> Result<(), ServiceError> {
65-
let user = self.user_repository.get_compact(user_id).await?;
66-
67-
// Check if user is administrator
68-
// todo: extract authorization service
69-
if !user.administrator {
70-
return Err(ServiceError::Unauthorized);
71-
}
59+
self.authorization_service
60+
.authorize(ACTION::DeleteTag, Some(*user_id))
61+
.await?;
7262

7363
match self.tag_repository.delete(tag_id).await {
7464
Ok(()) => Ok(()),

src/services/torrent.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use serde_derive::{Deserialize, Serialize};
66
use url::Url;
77

88
use super::category::DbCategoryRepository;
9-
use super::user::DbUserRepository;
109
use crate::config::{Configuration, TrackerMode};
1110
use crate::databases::database::{Database, Error, Sorting};
1211
use crate::errors::ServiceError;
@@ -17,6 +16,7 @@ use crate::models::torrent::{Metadata, TorrentId, TorrentListing};
1716
use crate::models::torrent_file::{DbTorrent, Torrent, TorrentFile};
1817
use crate::models::torrent_tag::{TagId, TorrentTag};
1918
use crate::models::user::UserId;
19+
use crate::services::user::Repository;
2020
use crate::tracker::statistics_importer::StatisticsImporter;
2121
use crate::utils::parse_torrent::decode_and_validate_torrent_file;
2222
use crate::{tracker, AsCSV};
@@ -25,7 +25,7 @@ pub struct Index {
2525
configuration: Arc<Configuration>,
2626
tracker_statistics_importer: Arc<StatisticsImporter>,
2727
tracker_service: Arc<tracker::service::Service>,
28-
user_repository: Arc<DbUserRepository>,
28+
user_repository: Arc<Box<dyn Repository>>,
2929
category_repository: Arc<DbCategoryRepository>,
3030
torrent_repository: Arc<DbTorrentRepository>,
3131
torrent_info_hash_repository: Arc<DbCanonicalInfoHashGroupRepository>,
@@ -81,7 +81,7 @@ impl Index {
8181
configuration: Arc<Configuration>,
8282
tracker_statistics_importer: Arc<StatisticsImporter>,
8383
tracker_service: Arc<tracker::service::Service>,
84-
user_repository: Arc<DbUserRepository>,
84+
user_repository: Arc<Box<dyn Repository>>,
8585
category_repository: Arc<DbCategoryRepository>,
8686
torrent_repository: Arc<DbTorrentRepository>,
8787
torrent_info_hash_repository: Arc<DbCanonicalInfoHashGroupRepository>,

0 commit comments

Comments
 (0)