diff --git a/crates/meilisearch-auth/src/lib.rs b/crates/meilisearch-auth/src/lib.rs index 27d163192..388d0f21b 100644 --- a/crates/meilisearch-auth/src/lib.rs +++ b/crates/meilisearch-auth/src/lib.rs @@ -3,6 +3,7 @@ pub mod error; mod store; use std::collections::{HashMap, HashSet}; +use std::ops::BitAnd; use error::{AuthControllerError, Result}; use maplit::hashset; diff --git a/crates/meilisearch/src/extractors/authentication/mod.rs b/crates/meilisearch/src/extractors/authentication/mod.rs index 86614f153..2afbf7962 100644 --- a/crates/meilisearch/src/extractors/authentication/mod.rs +++ b/crates/meilisearch/src/extractors/authentication/mod.rs @@ -138,7 +138,7 @@ pub trait Policy { auth: Data, token: &str, index: Option<&str>, - ) -> Result; + ) -> Result where Self: Sized; } pub mod policies { @@ -340,6 +340,24 @@ pub mod policies { } } + pub struct DoubleActionPolicy { + policy_a: ActionPolicy, + policy_b: ActionPolicy, + } + + impl Policy for DoubleActionPolicy { + fn authenticate( + auth: Data, + token: &str, + index: Option<&str>, + ) -> Result { + let filter_a = ActionPolicy::::authenticate(auth.clone(), token, index)?; + let _filter_b = ActionPolicy::::authenticate(auth, token, index)?; + + Ok(filter_a) + } + } + #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct Claims { diff --git a/crates/meilisearch/src/routes/indexes/render.rs b/crates/meilisearch/src/routes/indexes/render.rs index c513218ae..d5c284f42 100644 --- a/crates/meilisearch/src/routes/indexes/render.rs +++ b/crates/meilisearch/src/routes/indexes/render.rs @@ -23,6 +23,7 @@ use utoipa::{IntoParams, OpenApi, ToSchema}; use super::ActionPolicy; use crate::analytics::Analytics; use crate::error::MeilisearchHttpError; +use crate::extractors::authentication::policies::DoubleActionPolicy; use crate::extractors::authentication::GuardedData; use crate::extractors::sequential_extractor::SeqHandler; use crate::routes::indexes::similar_analytics::{SimilarAggregator, SimilarGET, SimilarPOST}; @@ -79,7 +80,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) { ) )] pub async fn render_post( - index_scheduler: GuardedData, Data>, + index_scheduler: GuardedData, Data>, index_uid: web::Path, params: AwebJson, req: HttpRequest,