From 5b717513916f8b201af37b960b1b50f6a13567b4 Mon Sep 17 00:00:00 2001 From: marin postma Date: Wed, 23 Jun 2021 19:35:26 +0200 Subject: [PATCH] policies macros --- .../src/extractors/authentication/mod.rs | 64 +++++++++++++++++-- meilisearch-http/src/extractors/mod.rs | 1 + meilisearch-http/src/lib.rs | 4 ++ meilisearch-http/src/routes/search.rs | 2 +- 4 files changed, 64 insertions(+), 7 deletions(-) diff --git a/meilisearch-http/src/extractors/authentication/mod.rs b/meilisearch-http/src/extractors/authentication/mod.rs index a31847945..315461578 100644 --- a/meilisearch-http/src/extractors/authentication/mod.rs +++ b/meilisearch-http/src/extractors/authentication/mod.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::marker::PhantomData; use std::ops::Deref; use std::any::{Any, TypeId}; @@ -9,12 +9,59 @@ use futures::future::{Ready, ok}; use crate::error::{AuthenticationError, ResponseError}; -pub struct Public; +macro_rules! create_policies { + ($($name:ident), *) => { + $( + pub struct $name { + inner: HashSet> + } -impl Policy for Public { - fn authenticate(&self, _token: &[u8]) -> bool { - true - } + impl $name { + pub fn new() -> Self { + Self { inner: HashSet::new() } + } + + pub fn add(&mut self, token: Vec) { + self.inner.insert(token); + } + } + + impl Policy for $name { + fn authenticate(&self, token: &[u8]) -> bool { + self.inner.contains(token) + } + } + )* + }; +} + +create_policies!(Public, Private, Admin); + +/// Instanciate a `Policies`, filled with the given policies. +macro_rules! init_policies { + ($($name:ident), *) => { + { + let mut policies = Policies::new(); + $( + let policy = $name::new(); + policies.insert(policy); + )* + policies + } + }; +} + +/// Adds user to all specified policies. +macro_rules! create_users { + ($policies:ident, $($user:literal => { $($policy:ty), * }), *) => { + { + $( + $( + $policies.get_mut::<$policy>().map(|p| p.add($user.to_owned())) + )* + )* + } + }; } pub struct GuardedData { @@ -52,6 +99,11 @@ impl Policies { .get(&TypeId::of::()) .and_then(|p| p.downcast_ref::()) } + + pub fn get_mut(&mut self) -> Option<&mut S> { + self.inner.get_mut(&TypeId::of::()) + .and_then(|p| p.downcast_mut::()) + } } impl Default for Policies { diff --git a/meilisearch-http/src/extractors/mod.rs b/meilisearch-http/src/extractors/mod.rs index 8d2942f1d..09a56e4a0 100644 --- a/meilisearch-http/src/extractors/mod.rs +++ b/meilisearch-http/src/extractors/mod.rs @@ -1,2 +1,3 @@ pub mod payload; +#[macro_use] pub mod authentication; diff --git a/meilisearch-http/src/lib.rs b/meilisearch-http/src/lib.rs index 46fea718c..0ee1fb4c2 100644 --- a/meilisearch-http/src/lib.rs +++ b/meilisearch-http/src/lib.rs @@ -35,6 +35,10 @@ pub fn configure_data(config: &mut web::ServiceConfig, data: Data) { ); } +pub fn configure_auth(config: &mut web::ServiceConfig, opt: &Options) { + todo!() +} + #[cfg(feature = "mini-dashboard")] pub fn dashboard(config: &mut web::ServiceConfig, enable_frontend: bool) { use actix_web_static_files::Resource; diff --git a/meilisearch-http/src/routes/search.rs b/meilisearch-http/src/routes/search.rs index 0d3184ca9..160660daf 100644 --- a/meilisearch-http/src/routes/search.rs +++ b/meilisearch-http/src/routes/search.rs @@ -13,7 +13,7 @@ use crate::extractors::authentication::{Policies, AuthConfig, Public, GuardedDat pub fn services(cfg: &mut web::ServiceConfig) { let mut policies = Policies::new(); - policies.insert(Public); + policies.insert(Public::new()); cfg.service( web::resource("/indexes/{index_uid}/search") .app_data(AuthConfig::Auth(policies))