@ -107,7 +107,7 @@ async fn _refresh_login(data: ConnectData, conn: &mut DbConn) -> JsonResult { 
			
		
	
		
		
			
				
					     let   ( access_token ,   expires_in )   =   device . refresh_tokens ( & user ,   orgs ,   scope_vec ) ;      let   ( access_token ,   expires_in )   =   device . refresh_tokens ( & user ,   orgs ,   scope_vec ) ;  
			
		
	
		
		
			
				
					     device . save ( conn ) . await ? ;      device . save ( conn ) . await ? ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					     let   mut   result   =   json ! ( {      let   result   =   json ! ( {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					         "access_token" : access_token ,          "access_token" : access_token ,  
			
		
	
		
		
			
				
					         "expires_in" : expires_in ,          "expires_in" : expires_in ,  
			
		
	
		
		
			
				
					         "token_type" : "Bearer" ,          "token_type" : "Bearer" ,  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -117,18 +117,13 @@ async fn _refresh_login(data: ConnectData, conn: &mut DbConn) -> JsonResult { 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					         "Kdf" : user . client_kdf_type ,          "Kdf" : user . client_kdf_type ,  
			
		
	
		
		
			
				
					         "KdfIterations" : user . client_kdf_iter ,          "KdfIterations" : user . client_kdf_iter ,  
			
		
	
		
		
			
				
					         "KdfMemory" : user . client_kdf_memory ,  
			
		
	
		
		
			
				
					         "KdfParallelism" : user . client_kdf_parallelism ,  
			
		
	
		
		
			
				
					         "ResetMasterPassword" : false ,   // TODO: according to official server seems something like: user.password_hash.is_empty(), but would need testing
          "ResetMasterPassword" : false ,   // TODO: according to official server seems something like: user.password_hash.is_empty(), but would need testing
  
			
		
	
		
		
			
				
					         "scope" : scope ,          "scope" : scope ,  
			
		
	
		
		
			
				
					         "unofficialServer" : true ,          "unofficialServer" : true ,  
			
		
	
		
		
			
				
					     } ) ;      } ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     if   user . client_kdf_type   = =   UserKdfType ::Argon2id   as   i32   {  
			
		
	
		
		
			
				
					         result [ "KdfMemory" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_memory . expect ( "Argon2 memory parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					         result [ "KdfParallelism" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_parallelism . expect ( "Argon2 parallelism parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					     }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     Ok ( Json ( result ) )      Ok ( Json ( result ) )  
			
		
	
		
		
			
				
					} }  
			
		
	
		
		
			
				
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -260,6 +255,8 @@ async fn _password_login( 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					         "Kdf" : user . client_kdf_type ,          "Kdf" : user . client_kdf_type ,  
			
		
	
		
		
			
				
					         "KdfIterations" : user . client_kdf_iter ,          "KdfIterations" : user . client_kdf_iter ,  
			
		
	
		
		
			
				
					         "KdfMemory" : user . client_kdf_memory ,  
			
		
	
		
		
			
				
					         "KdfParallelism" : user . client_kdf_parallelism ,  
			
		
	
		
		
			
				
					         "ResetMasterPassword" : false , // TODO: Same as above
          "ResetMasterPassword" : false , // TODO: Same as above
  
			
		
	
		
		
			
				
					         "scope" : scope ,          "scope" : scope ,  
			
		
	
		
		
			
				
					         "unofficialServer" : true ,          "unofficialServer" : true ,  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -269,13 +266,6 @@ async fn _password_login( 
			
		
	
		
		
			
				
					         result [ "TwoFactorToken" ]   =   Value ::String ( token ) ;          result [ "TwoFactorToken" ]   =   Value ::String ( token ) ;  
			
		
	
		
		
			
				
					     }      }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     if   user . client_kdf_type   = =   UserKdfType ::Argon2id   as   i32   {  
			
		
	
		
		
			
				
					         result [ "KdfMemory" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_memory . expect ( "Argon2 memory parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					         result [ "KdfParallelism" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_parallelism . expect ( "Argon2 parallelism parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					     }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     info ! ( "User {} logged in successfully. IP: {}" ,   username ,   ip . ip ) ;      info ! ( "User {} logged in successfully. IP: {}" ,   username ,   ip . ip ) ;  
			
		
	
		
		
			
				
					     Ok ( Json ( result ) )      Ok ( Json ( result ) )  
			
		
	
		
		
			
				
					} }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -360,7 +350,7 @@ async fn _api_key_login( 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     // Note: No refresh_token is returned. The CLI just repeats the
      // Note: No refresh_token is returned. The CLI just repeats the
  
			
		
	
		
		
			
				
					     // client_credentials login flow when the existing token expires.
      // client_credentials login flow when the existing token expires.
  
			
		
	
		
		
			
				
					
					     let   mut   result   =   json ! ( {      let   result   =   json ! ( {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					         "access_token" : access_token ,          "access_token" : access_token ,  
			
		
	
		
		
			
				
					         "expires_in" : expires_in ,          "expires_in" : expires_in ,  
			
		
	
		
		
			
				
					         "token_type" : "Bearer" ,          "token_type" : "Bearer" ,  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -369,18 +359,13 @@ async fn _api_key_login( 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					         "Kdf" : user . client_kdf_type ,          "Kdf" : user . client_kdf_type ,  
			
		
	
		
		
			
				
					         "KdfIterations" : user . client_kdf_iter ,          "KdfIterations" : user . client_kdf_iter ,  
			
		
	
		
		
			
				
					         "KdfMemory" : user . client_kdf_memory ,  
			
		
	
		
		
			
				
					         "KdfParallelism" : user . client_kdf_parallelism ,  
			
		
	
		
		
			
				
					         "ResetMasterPassword" : false ,   // TODO: Same as above
          "ResetMasterPassword" : false ,   // TODO: Same as above
  
			
		
	
		
		
			
				
					         "scope" : scope ,          "scope" : scope ,  
			
		
	
		
		
			
				
					         "unofficialServer" : true ,          "unofficialServer" : true ,  
			
		
	
		
		
			
				
					     } ) ;      } ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     if   user . client_kdf_type   = =   UserKdfType ::Argon2id   as   i32   {  
			
		
	
		
		
			
				
					         result [ "KdfMemory" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_memory . expect ( "Argon2 memory parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					         result [ "KdfParallelism" ]   =  
			
		
	
		
		
			
				
					             Value ::Number ( user . client_kdf_parallelism . expect ( "Argon2 parallelism parameter is required." ) . into ( ) ) ;  
			
		
	
		
		
			
				
					     }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					     Ok ( Json ( result ) )      Ok ( Json ( result ) )  
			
		
	
		
		
			
				
					} }