@ -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 = Local Site::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 ;