X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi%2Fsrc%2Flocal_user%2Fsave_settings.rs;h=e3c95a3d3f4c1025ff59bee27b490ae34d4b7cf7;hb=1dba94c9cbdb7af838bbd13d6c81d349a603c623;hp=f3f7a8478d480d35ea91c205eb570bfcce4f5ccb;hpb=985fe24669d3fdeecc0aa76cc74dd6570cbad5c8;p=lemmy.git diff --git a/crates/api/src/local_user/save_settings.rs b/crates/api/src/local_user/save_settings.rs index f3f7a847..e3c95a3d 100644 --- a/crates/api/src/local_user/save_settings.rs +++ b/crates/api/src/local_user/save_settings.rs @@ -8,17 +8,22 @@ use lemmy_api_common::{ use lemmy_db_schema::{ source::{ actor_language::LocalUserLanguage, - local_site::LocalSite, local_user::{LocalUser, LocalUserUpdateForm}, person::{Person, PersonUpdateForm}, }, traits::Crud, utils::{diesel_option_overwrite, diesel_option_overwrite_to_url}, }; +use lemmy_db_views::structs::SiteView; use lemmy_utils::{ claims::Claims, error::LemmyError, - utils::validation::{is_valid_display_name, is_valid_matrix_id}, + utils::validation::{ + build_totp_2fa, + generate_totp_2fa_secret, + is_valid_display_name, + is_valid_matrix_id, + }, ConnectionId, }; @@ -35,14 +40,13 @@ impl Perform for SaveUserSettings { let data: &SaveUserSettings = self; let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; - let local_site = LocalSite::read(context.pool()).await?; + let site_view = SiteView::read_local(context.pool()).await?; let avatar = diesel_option_overwrite_to_url(&data.avatar)?; let banner = diesel_option_overwrite_to_url(&data.banner)?; let bio = diesel_option_overwrite(&data.bio); let display_name = diesel_option_overwrite(&data.display_name); let matrix_user_id = diesel_option_overwrite(&data.matrix_user_id); - let bot_account = data.bot_account; let email_deref = data.email.as_deref().map(str::to_lowercase); let email = diesel_option_overwrite(&email_deref); @@ -57,7 +61,7 @@ impl Perform for SaveUserSettings { // When the site requires email, make sure email is not Some(None). IE, an overwrite to a None value if let Some(email) = &email { - if email.is_none() && local_site.require_email_verification { + if email.is_none() && site_view.local_site.require_email_verification { return Err(LemmyError::from_message("email_required")); } } @@ -71,7 +75,7 @@ impl Perform for SaveUserSettings { if let Some(Some(display_name)) = &display_name { if !is_valid_display_name( display_name.trim(), - local_site.actor_name_max_length as usize, + site_view.local_site.actor_name_max_length as usize, ) { return Err(LemmyError::from_message("invalid_username")); } @@ -92,7 +96,7 @@ impl Perform for SaveUserSettings { .display_name(display_name) .bio(bio) .matrix_user_id(matrix_user_id) - .bot_account(bot_account) + .bot_account(data.bot_account) .avatar(avatar) .banner(banner) .build(); @@ -105,6 +109,20 @@ impl Perform for SaveUserSettings { LocalUserLanguage::update(context.pool(), discussion_languages, local_user_id).await?; } + // If generate_totp is Some(false), this will clear it out from the database. + let (totp_2fa_secret, totp_2fa_url) = if let Some(generate) = data.generate_totp_2fa { + if generate { + let secret = generate_totp_2fa_secret(); + let url = + build_totp_2fa(&site_view.site.name, &local_user_view.person.name, &secret)?.get_url(); + (Some(Some(secret)), Some(Some(url))) + } else { + (Some(None), Some(None)) + } + } else { + (None, None) + }; + let local_user_form = LocalUserUpdateForm::builder() .email(email) .show_avatars(data.show_avatars) @@ -118,6 +136,8 @@ impl Perform for SaveUserSettings { .default_listing_type(default_listing_type) .theme(data.theme.clone()) .interface_language(data.interface_language.clone()) + .totp_2fa_secret(totp_2fa_secret) + .totp_2fa_url(totp_2fa_url) .build(); let local_user_res = LocalUser::update(context.pool(), local_user_id, &local_user_form).await;