From 6335e216a9100307b32c6a7b51c2661032062376 Mon Sep 17 00:00:00 2001 From: silverpill Date: Fri, 3 Mar 2023 18:14:00 +0000 Subject: [PATCH] Add registration.default_role configuration option --- CHANGELOG.md | 5 +++++ contrib/mitra_config.yaml | 2 ++ mitra-config/src/lib.rs | 2 +- mitra-config/src/loader.rs | 10 +++++++++- mitra-config/src/registration.rs | 28 +++++++++++++++++++++++++++- src/mastodon_api/accounts/views.rs | 9 ++++----- 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffa2fe7..cdcc4d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Allow to add notes to generated invite codes. +- Added `registration.default_role` configuration option. + +### Deprecated + +- Deprecated `default_role_read_only_user` configuration option (replaced by `registration.default_role`). ## [1.15.0] - 2023-02-27 diff --git a/contrib/mitra_config.yaml b/contrib/mitra_config.yaml index 534796e..b3819f1 100644 --- a/contrib/mitra_config.yaml +++ b/contrib/mitra_config.yaml @@ -25,6 +25,8 @@ instance_description: my instance registration: # Possible values: open, invite type: invite + # Possible values: user, read_only_user + default_role: user # EIP-4361 login message #login_message: 'Do not sign this message on other sites!' diff --git a/mitra-config/src/lib.rs b/mitra-config/src/lib.rs index 79fabdd..12c25f1 100644 --- a/mitra-config/src/lib.rs +++ b/mitra-config/src/lib.rs @@ -15,7 +15,7 @@ pub use blockchain::{ pub use config::{Config, Instance}; pub use environment::Environment; pub use loader::parse_config; -pub use registration::RegistrationType; +pub use registration::{DefaultRole, RegistrationType}; pub const MITRA_VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/mitra-config/src/loader.rs b/mitra-config/src/loader.rs index ecc7b31..767b0c3 100644 --- a/mitra-config/src/loader.rs +++ b/mitra-config/src/loader.rs @@ -15,7 +15,7 @@ use mitra_utils::{ use super::config::Config; use super::environment::Environment; -use super::registration::RegistrationType; +use super::registration::{DefaultRole, RegistrationType}; struct EnvConfig { config_path: String, @@ -124,6 +124,14 @@ pub fn parse_config() -> (Config, Vec<&'static str>) { config.registration.registration_type = RegistrationType::Invite; }; }; + if let Some(read_only_user) = config.registration.default_role_read_only_user { + warnings.push("'default_role_read_only_user' setting is deprecated, use 'registration.default_role' instead"); + if read_only_user { + config.registration.default_role = DefaultRole::ReadOnlyUser; + } else { + config.registration.default_role = DefaultRole::NormalUser; + }; + }; if let Some(post_character_limit) = config.post_character_limit { warnings.push("'post_character_limit' setting is deprecated, use 'limits.posts.character_limit' instead"); config.limits.posts.character_limit = post_character_limit; diff --git a/mitra-config/src/registration.rs b/mitra-config/src/registration.rs index 4258aad..b0de7ee 100644 --- a/mitra-config/src/registration.rs +++ b/mitra-config/src/registration.rs @@ -28,11 +28,37 @@ impl<'de> Deserialize<'de> for RegistrationType { } } +#[derive(Clone)] +pub enum DefaultRole { + NormalUser, + ReadOnlyUser, +} + +impl Default for DefaultRole { + fn default() -> Self { Self::NormalUser } +} + +impl<'de> Deserialize<'de> for DefaultRole { + fn deserialize(deserializer: D) -> Result + where D: Deserializer<'de> + { + let role_str = String::deserialize(deserializer)?; + let role = match role_str.as_str() { + "user" => Self::NormalUser, + "read_only_user" => Self::ReadOnlyUser, + _ => return Err(DeserializerError::custom("unknown role name")), + }; + Ok(role) + } +} + #[derive(Clone, Default, Deserialize)] pub struct RegistrationConfig { #[serde(rename = "type")] pub registration_type: RegistrationType, + pub(super) default_role_read_only_user: Option, // deprecated + #[serde(default)] - pub default_role_read_only_user: bool, // default is false + pub default_role: DefaultRole, } diff --git a/src/mastodon_api/accounts/views.rs b/src/mastodon_api/accounts/views.rs index 7d4912c..3899579 100644 --- a/src/mastodon_api/accounts/views.rs +++ b/src/mastodon_api/accounts/views.rs @@ -11,7 +11,7 @@ use actix_web::{ use actix_web_httpauth::extractors::bearer::BearerAuth; use uuid::Uuid; -use mitra_config::{Config, RegistrationType}; +use mitra_config::{Config, DefaultRole, RegistrationType}; use mitra_utils::{ caip2::ChainId, canonicalization::canonicalize_object, @@ -184,10 +184,9 @@ pub async fn create_account( let AccountCreateData { username, invite_code, .. } = account_data.into_inner(); - let role = if config.registration.default_role_read_only_user { - Role::ReadOnlyUser - } else { - Role::NormalUser + let role = match config.registration.default_role { + DefaultRole::NormalUser => Role::NormalUser, + DefaultRole::ReadOnlyUser => Role::ReadOnlyUser, }; let user_data = UserCreateData { username,