From a21ab5c2a8d35cfc737c353a5ec868847a9e300a Mon Sep 17 00:00:00 2001 From: GrO2Bl Date: Wed, 12 Jun 2024 20:21:23 +0330 Subject: [PATCH 1/5] Add moderation link to the footer #1156 --- templates/base.rs.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/base.rs.html b/templates/base.rs.html index 564c1f84..3940bf4d 100644 --- a/templates/base.rs.html +++ b/templates/base.rs.html @@ -87,6 +87,10 @@ @i18n!(ctx.1, "Privacy policy") @if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) { @i18n!(ctx.1, "Administration") + } else { + @if ctx.2.clone().map(|u| u.is_moderator()).unwrap_or(false) { + @i18n!(ctx.1, "Moderation") + } }
From d004a7047b7fc8a68d6c03baca4581ba8d2b0d4d Mon Sep 17 00:00:00 2001 From: GrO2Bl Date: Wed, 12 Jun 2024 20:24:43 +0330 Subject: [PATCH 2/5] Add an admin inclusive request guard #1156 --- plume-models/src/admin.rs | 19 ++++++++++++++++++- src/routes/instance.rs | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/plume-models/src/admin.rs b/plume-models/src/admin.rs index a4fa0455..37a34584 100644 --- a/plume-models/src/admin.rs +++ b/plume-models/src/admin.rs @@ -5,7 +5,7 @@ use rocket::{ Outcome, }; -/// Wrapper around User to use as a request guard on pages reserved to admins. +/// Wrapper around User to use as a request guard on pages exclusively reserved to admins. pub struct Admin(pub User); impl<'a, 'r> FromRequest<'a, 'r> for Admin { @@ -21,6 +21,23 @@ impl<'a, 'r> FromRequest<'a, 'r> for Admin { } } +/// Same as `Admin` but it forwards to next guard if the user is not an admin. +/// It's useful when there are multiple implementations of routes for admin and moderator. +pub struct InclusiveAdmin(pub User); + +impl<'a, 'r> FromRequest<'a, 'r> for InclusiveAdmin { + type Error = (); + + fn from_request(request: &'a Request<'r>) -> request::Outcome { + let user = request.guard::()?; + if user.is_admin() { + Outcome::Success(InclusiveAdmin(user)) + } else { + Outcome::Forward(()) + } + } +} + /// Same as `Admin` but for moderators. pub struct Moderator(pub User); diff --git a/src/routes/instance.rs b/src/routes/instance.rs index 9de9fee0..e05e069c 100644 --- a/src/routes/instance.rs +++ b/src/routes/instance.rs @@ -51,7 +51,7 @@ pub fn index(conn: DbConn, rockets: PlumeRocket) -> Result { } #[get("/admin")] -pub fn admin(_admin: Admin, conn: DbConn, rockets: PlumeRocket) -> Result { +pub fn admin(_admin: InclusiveAdmin, conn: DbConn, rockets: PlumeRocket) -> Result { let local_inst = Instance::get_local()?; Ok(render!(instance::admin( &(&conn, &rockets).to_context(), From d950a34b6bec7c50ffb9c12167b3d5e39a6558f0 Mon Sep 17 00:00:00 2001 From: GrO2Bl Date: Wed, 12 Jun 2024 20:24:59 +0330 Subject: [PATCH 3/5] Add admin_header template to organize tabs #1156 --- templates/instance/admin.rs.html | 11 ++--------- templates/instance/admin_header.rs.html | 23 +++++++++++++++++++++++ templates/instance/admin_mod.rs.html | 11 ++--------- templates/instance/emailblocklist.rs.html | 12 +++--------- templates/instance/list.rs.html | 11 ++--------- templates/instance/users.rs.html | 11 ++--------- 6 files changed, 34 insertions(+), 45 deletions(-) create mode 100644 templates/instance/admin_header.rs.html diff --git a/templates/instance/admin.rs.html b/templates/instance/admin.rs.html index 7ff3750d..8261bb1a 100644 --- a/templates/instance/admin.rs.html +++ b/templates/instance/admin.rs.html @@ -1,6 +1,6 @@ @use plume_models::instance::Instance; @use validator::ValidationErrors; -@use crate::templates::base; +@use crate::templates::{base, instance::admin_header}; @use crate::template_utils::*; @use crate::routes::instance::InstanceSettingsForm; @use crate::routes::*; @@ -8,14 +8,7 @@ @(ctx: BaseContext, instance: Instance, form: InstanceSettingsForm, errors: ValidationErrors) @:base(ctx, i18n!(ctx.1, "Administration of {0}"; instance.name.clone()), {}, {}, { -

@i18n!(ctx.1, "Administration")

- - @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), true), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false) - ]) + @:admin_header(ctx, "Administration", 1)
@(Input::new("name", i18n!(ctx.1, "Name")) diff --git a/templates/instance/admin_header.rs.html b/templates/instance/admin_header.rs.html new file mode 100644 index 00000000..21e0d070 --- /dev/null +++ b/templates/instance/admin_header.rs.html @@ -0,0 +1,23 @@ +@use crate::template_utils::*; +@use crate::routes::*; + +@(ctx: BaseContext, title: &str, selectedTab: u8) + +@if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) { +

@i18n!(ctx.1, title)

+ + @tabs(&[ + (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), if selectedTab == 1 {true} else {false}), + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selectedTab == 2 {true} else {false}), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selectedTab == 3 {true} else {false}), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selectedTab == 4 {true} else {false}) + ]) +} else { +

@i18n!(ctx.1, "Moderation")

+ + @tabs(&[ + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selectedTab == 1 {true} else {false}), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selectedTab == 2 {true} else {false}), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selectedTab == 3 {true} else {false}) + ]) +} diff --git a/templates/instance/admin_mod.rs.html b/templates/instance/admin_mod.rs.html index e215d7e1..fc1cb0a9 100644 --- a/templates/instance/admin_mod.rs.html +++ b/templates/instance/admin_mod.rs.html @@ -1,15 +1,8 @@ -@use crate::templates::base; +@use crate::templates::{base, instance::admin_header}; @use crate::template_utils::*; -@use crate::routes::*; @(ctx: BaseContext) @:base(ctx, i18n!(ctx.1, "Moderation"), {}, {}, { -

@i18n!(ctx.1, "Moderation")

- - @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Home"), true), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), - ]) + @:admin_header(ctx, "Moderation", 0) }) diff --git a/templates/instance/emailblocklist.rs.html b/templates/instance/emailblocklist.rs.html index fe9729fc..32c7ea6e 100644 --- a/templates/instance/emailblocklist.rs.html +++ b/templates/instance/emailblocklist.rs.html @@ -1,17 +1,11 @@ @use plume_models::blocklisted_emails::BlocklistedEmail; -@use crate::templates::base; +@use crate::templates::{base, instance::admin_header}; @use crate::template_utils::*; @use crate::routes::*; @(ctx:BaseContext, emails: Vec, page:i32, n_pages:i32) - @:base(ctx, i18n!(ctx.1, "Blocklisted Emails"), {}, {}, { -

@i18n!(ctx.1,"Blocklisted Emails")

- @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), - (&uri!(instance::admin_email_blocklist:page=_).to_string(), i18n!(ctx.1, "Email blocklist"), true), - ]) +@:base(ctx, i18n!(ctx.1, "Blocklisted Emails"), {}, {}, { + @:admin_header(ctx, "Blocklisted Emails", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {4} else {3})) @(Input::new("email_address", i18n!(ctx.1, "Email address")) .details(i18n!(ctx.1, "The email address you wish to block. In order to block domains, you can use globbing syntax, for example '*@example.com' blocks all addresses from example.com")) diff --git a/templates/instance/list.rs.html b/templates/instance/list.rs.html index 619689f7..af545e2c 100644 --- a/templates/instance/list.rs.html +++ b/templates/instance/list.rs.html @@ -1,19 +1,12 @@ @use plume_models::instance::Instance; -@use crate::templates::base; +@use crate::templates::{base, instance::admin_header}; @use crate::template_utils::*; @use crate::routes::*; @(ctx: BaseContext, instance: Instance, instances: Vec, page: i32, n_pages: i32) @:base(ctx, i18n!(ctx.1, "Administration of {0}"; instance.name), {}, {}, { -

@i18n!(ctx.1, "Instances")

- - @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), true), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), false), - (&uri!(instance::admin_email_blocklist:page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false), - ]) + @:admin_header(ctx, "Instances", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {2} else {1}))
@for instance in instances { diff --git a/templates/instance/users.rs.html b/templates/instance/users.rs.html index 1499fb52..7de2e4cb 100644 --- a/templates/instance/users.rs.html +++ b/templates/instance/users.rs.html @@ -1,19 +1,12 @@ @use plume_models::users::User; -@use crate::templates::base; +@use crate::templates::{base, instance::admin_header}; @use crate::template_utils::*; @use crate::routes::*; @(ctx: BaseContext, users: Vec, user: Option<&str>, page: i32, n_pages: i32) @:base(ctx, i18n!(ctx.1, "Users"), {}, {}, { -

@i18n!(ctx.1, "Users")

- - @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), false), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), false), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), true), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), false) - ]) + @:admin_header(ctx, "Users", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {3} else {2}))
From 0dd6377967038cc4aebb893acc8271be12d83b7b Mon Sep 17 00:00:00 2001 From: GrO2Bl Date: Wed, 12 Jun 2024 20:39:29 +0330 Subject: [PATCH 4/5] Fix argument name to fit in the convention --- templates/instance/admin_header.rs.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/templates/instance/admin_header.rs.html b/templates/instance/admin_header.rs.html index 21e0d070..299ef565 100644 --- a/templates/instance/admin_header.rs.html +++ b/templates/instance/admin_header.rs.html @@ -1,23 +1,23 @@ @use crate::template_utils::*; @use crate::routes::*; -@(ctx: BaseContext, title: &str, selectedTab: u8) +@(ctx: BaseContext, title: &str, selected_tab: u8) @if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) {

@i18n!(ctx.1, title)

@tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), if selectedTab == 1 {true} else {false}), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selectedTab == 2 {true} else {false}), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selectedTab == 3 {true} else {false}), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selectedTab == 4 {true} else {false}) + (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), if selected_tab == 1 {true} else {false}), + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selected_tab == 2 {true} else {false}), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selected_tab == 3 {true} else {false}), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selected_tab == 4 {true} else {false}) ]) } else {

@i18n!(ctx.1, "Moderation")

@tabs(&[ - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selectedTab == 1 {true} else {false}), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selectedTab == 2 {true} else {false}), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selectedTab == 3 {true} else {false}) + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selected_tab == 1 {true} else {false}), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selected_tab == 2 {true} else {false}), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selected_tab == 3 {true} else {false}) ]) } From 33b65a1a7584d08b741b3e9dc5435fec36192100 Mon Sep 17 00:00:00 2001 From: GrO2Bl Date: Thu, 4 Jul 2024 22:08:43 +0330 Subject: [PATCH 5/5] Apply requested changes --- templates/base.rs.html | 6 ++---- templates/instance/admin_header.rs.html | 20 +++++++++----------- templates/instance/emailblocklist.rs.html | 2 +- templates/instance/list.rs.html | 2 +- templates/instance/users.rs.html | 2 +- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/templates/base.rs.html b/templates/base.rs.html index 3940bf4d..711ed238 100644 --- a/templates/base.rs.html +++ b/templates/base.rs.html @@ -87,10 +87,8 @@ @i18n!(ctx.1, "Privacy policy") @if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) { @i18n!(ctx.1, "Administration") - } else { - @if ctx.2.clone().map(|u| u.is_moderator()).unwrap_or(false) { - @i18n!(ctx.1, "Moderation") - } + } else if ctx.2.clone().map(|u| u.is_moderator()).unwrap_or(false) { + @i18n!(ctx.1, "Moderation") }
diff --git a/templates/instance/admin_header.rs.html b/templates/instance/admin_header.rs.html index 299ef565..7794f39f 100644 --- a/templates/instance/admin_header.rs.html +++ b/templates/instance/admin_header.rs.html @@ -3,21 +3,19 @@ @(ctx: BaseContext, title: &str, selected_tab: u8) -@if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) { -

@i18n!(ctx.1, title)

+

@i18n!(ctx.1, title)

+@if ctx.2.clone().map(|u| u.is_admin()).unwrap_or(false) { @tabs(&[ - (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), if selected_tab == 1 {true} else {false}), - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selected_tab == 2 {true} else {false}), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selected_tab == 3 {true} else {false}), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selected_tab == 4 {true} else {false}) + (&uri!(instance::admin).to_string(), i18n!(ctx.1, "Configuration"), selected_tab == 1), + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), selected_tab == 2), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), selected_tab == 3), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), selected_tab == 4) ]) } else { -

@i18n!(ctx.1, "Moderation")

- @tabs(&[ - (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), if selected_tab == 1 {true} else {false}), - (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), if selected_tab == 2 {true} else {false}), - (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), if selected_tab == 3 {true} else {false}) + (&uri!(instance::admin_instances: page = _).to_string(), i18n!(ctx.1, "Instances"), selected_tab == 2), + (&uri!(instance::admin_users: page = _).to_string(), i18n!(ctx.1, "Users"), selected_tab == 3), + (&uri!(instance::admin_email_blocklist: page=_).to_string(), i18n!(ctx.1, "Email blocklist"), selected_tab == 4) ]) } diff --git a/templates/instance/emailblocklist.rs.html b/templates/instance/emailblocklist.rs.html index 32c7ea6e..7e82cea4 100644 --- a/templates/instance/emailblocklist.rs.html +++ b/templates/instance/emailblocklist.rs.html @@ -5,7 +5,7 @@ @(ctx:BaseContext, emails: Vec, page:i32, n_pages:i32) @:base(ctx, i18n!(ctx.1, "Blocklisted Emails"), {}, {}, { - @:admin_header(ctx, "Blocklisted Emails", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {4} else {3})) + @:admin_header(ctx, "Blocklisted Emails", 4) @(Input::new("email_address", i18n!(ctx.1, "Email address")) .details(i18n!(ctx.1, "The email address you wish to block. In order to block domains, you can use globbing syntax, for example '*@example.com' blocks all addresses from example.com")) diff --git a/templates/instance/list.rs.html b/templates/instance/list.rs.html index af545e2c..baeb11a0 100644 --- a/templates/instance/list.rs.html +++ b/templates/instance/list.rs.html @@ -6,7 +6,7 @@ @(ctx: BaseContext, instance: Instance, instances: Vec, page: i32, n_pages: i32) @:base(ctx, i18n!(ctx.1, "Administration of {0}"; instance.name), {}, {}, { - @:admin_header(ctx, "Instances", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {2} else {1})) + @:admin_header(ctx, "Instances", 2))
@for instance in instances { diff --git a/templates/instance/users.rs.html b/templates/instance/users.rs.html index 7de2e4cb..38299f37 100644 --- a/templates/instance/users.rs.html +++ b/templates/instance/users.rs.html @@ -6,7 +6,7 @@ @(ctx: BaseContext, users: Vec, user: Option<&str>, page: i32, n_pages: i32) @:base(ctx, i18n!(ctx.1, "Users"), {}, {}, { - @:admin_header(ctx, "Users", (if ctx.2.clone().map(|u| u.is_admin()).unwrap() {3} else {2})) + @:admin_header(ctx, "Users", 3))