|  | @ -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)) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | 
 |