From f2b0b61545fd5734c397b9957ac0e2ed18151a94 Mon Sep 17 00:00:00 2001 From: Nicolas Polomack Date: Wed, 7 Jun 2023 18:01:37 +0200 Subject: [PATCH] feat(frontend): private crate browsing feat(frontend): added `login_required` configuration option --- alexandrie.toml | 1 + crates/alexandrie/src/config/frontend/mod.rs | 2 ++ crates/alexandrie/src/config/mod.rs | 8 ++++++++ crates/alexandrie/src/frontend/index.rs | 4 ++++ crates/alexandrie/src/frontend/krate.rs | 4 ++++ crates/alexandrie/src/frontend/last_updated.rs | 4 ++++ crates/alexandrie/src/frontend/most_downloaded.rs | 4 ++++ crates/alexandrie/src/frontend/search.rs | 4 ++++ docker/mysql/alexandrie.toml | 1 + docker/postgres/alexandrie.toml | 1 + docker/sqlite/alexandrie.toml | 1 + 11 files changed, 34 insertions(+) diff --git a/alexandrie.toml b/alexandrie.toml index 7aa06f62..b28f4caf 100644 --- a/alexandrie.toml +++ b/alexandrie.toml @@ -11,6 +11,7 @@ links = [ { name = "Github repository", href = "https://github.com/Hirevo/alexandrie" }, { name = "User documentation", href = "https://hirevo.github.io/alexandrie" }, ] +login_required = false [frontend.sessions] cookie_name = "alexandrie.sid" diff --git a/crates/alexandrie/src/config/frontend/mod.rs b/crates/alexandrie/src/config/frontend/mod.rs index 866967dc..52f594b9 100644 --- a/crates/alexandrie/src/config/frontend/mod.rs +++ b/crates/alexandrie/src/config/frontend/mod.rs @@ -60,6 +60,8 @@ pub struct FrontendConfig { pub favicon: Option, /// Some related links. pub links: Option>, + /// Whether to disallow anonymous browsing of the registry. + pub login_required: bool, /// Assets configuration options. pub assets: AssetsConfig, /// Templates configuration options. diff --git a/crates/alexandrie/src/config/mod.rs b/crates/alexandrie/src/config/mod.rs index ef1b58ec..642ef246 100644 --- a/crates/alexandrie/src/config/mod.rs +++ b/crates/alexandrie/src/config/mod.rs @@ -94,3 +94,11 @@ impl From for State { } } } + +impl State { + /// Returns whether we require users to log in to browse crates. + #[cfg(feature = "frontend")] + pub fn is_login_required(&self) -> bool { + self.frontend.config.login_required + } +} diff --git a/crates/alexandrie/src/frontend/index.rs b/crates/alexandrie/src/frontend/index.rs index 18b76051..f98ae1dd 100644 --- a/crates/alexandrie/src/frontend/index.rs +++ b/crates/alexandrie/src/frontend/index.rs @@ -13,6 +13,10 @@ use crate::State; pub(crate) async fn get(req: Request) -> tide::Result { let user = req.get_author(); + if req.state().is_login_required() && user.is_none() { + return Ok(utils::response::redirect("/account/login")); + } + let state = req.state().clone(); let db = &state.db; diff --git a/crates/alexandrie/src/frontend/krate.rs b/crates/alexandrie/src/frontend/krate.rs index a90d7800..cd20f3ce 100644 --- a/crates/alexandrie/src/frontend/krate.rs +++ b/crates/alexandrie/src/frontend/krate.rs @@ -27,6 +27,10 @@ pub(crate) async fn get(req: Request) -> tide::Result { let canon_name = utils::canonical_name(name); let user = req.get_author(); + if req.state().is_login_required() && user.is_none() { + return Ok(utils::response::redirect("/account/login")); + } + let state = req.state().clone(); let db = &state.db; diff --git a/crates/alexandrie/src/frontend/last_updated.rs b/crates/alexandrie/src/frontend/last_updated.rs index 7916b154..5c737a4a 100644 --- a/crates/alexandrie/src/frontend/last_updated.rs +++ b/crates/alexandrie/src/frontend/last_updated.rs @@ -27,6 +27,10 @@ pub(crate) async fn get(req: Request) -> tide::Result { let page_number = params.page.map_or_else(|| 1, |page| page.get()); let user = req.get_author(); + if req.state().is_login_required() && user.is_none() { + return Ok(utils::response::redirect("/account/login")); + } + let state = req.state().clone(); let db = &state.db; diff --git a/crates/alexandrie/src/frontend/most_downloaded.rs b/crates/alexandrie/src/frontend/most_downloaded.rs index 03b67e1d..e3f90599 100644 --- a/crates/alexandrie/src/frontend/most_downloaded.rs +++ b/crates/alexandrie/src/frontend/most_downloaded.rs @@ -27,6 +27,10 @@ pub(crate) async fn get(req: Request) -> tide::Result { let page_number = params.page.map_or_else(|| 1, |page| page.get()); let user = req.get_author(); + if req.state().is_login_required() && user.is_none() { + return Ok(utils::response::redirect("/account/login")); + } + let state = req.state().clone(); let db = &state.db; diff --git a/crates/alexandrie/src/frontend/search.rs b/crates/alexandrie/src/frontend/search.rs index 3438674b..f4f8004c 100644 --- a/crates/alexandrie/src/frontend/search.rs +++ b/crates/alexandrie/src/frontend/search.rs @@ -34,6 +34,10 @@ pub(crate) async fn get(req: Request) -> tide::Result { let page_number = params.page.map_or_else(|| 1, |page| page.get()); let user = req.get_author(); + if req.state().is_login_required() && user.is_none() { + return Ok(utils::response::redirect("/account/login")); + } + let state = req.state().clone(); let db = &state.db; diff --git a/docker/mysql/alexandrie.toml b/docker/mysql/alexandrie.toml index 595408ad..af326f60 100644 --- a/docker/mysql/alexandrie.toml +++ b/docker/mysql/alexandrie.toml @@ -13,6 +13,7 @@ max_crate_size = "50 MB" enabled = true title = "Alexandrie" description = "An alternative crate registry for Cargo, the Rust package manager." +login_required = false [frontend.sessions] cookie_name = "alexandrie.sid" diff --git a/docker/postgres/alexandrie.toml b/docker/postgres/alexandrie.toml index ae992796..44d98ad1 100644 --- a/docker/postgres/alexandrie.toml +++ b/docker/postgres/alexandrie.toml @@ -13,6 +13,7 @@ max_crate_size = "50 MB" enabled = true title = "Alexandrie" description = "An alternative crate registry for Cargo, the Rust package manager." +login_required = false [frontend.sessions] cookie_name = "alexandrie.sid" diff --git a/docker/sqlite/alexandrie.toml b/docker/sqlite/alexandrie.toml index 5d880a39..1c82fe19 100644 --- a/docker/sqlite/alexandrie.toml +++ b/docker/sqlite/alexandrie.toml @@ -13,6 +13,7 @@ max_crate_size = "50 MB" enabled = true title = "Alexandrie" description = "An alternative crate registry for Cargo, the Rust package manager." +login_required = false [frontend.sessions] cookie_name = "alexandrie.sid"