|
@@ -26,14 +26,18 @@ pub struct Info {
|
|
|
|
|
|
impl std::fmt::Debug for Info {
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
- let mnemonic_hash = sha256::Hash::from_slice(&self.mnemonic.clone().into_bytes())
|
|
|
- .map_err(|_| std::fmt::Error)?;
|
|
|
+ // Use a fallback approach that won't panic
|
|
|
+ let mnemonic_display = match sha256::Hash::hash(self.mnemonic.clone().into_bytes().as_ref())
|
|
|
+ {
|
|
|
+ Ok(hash) => format!("<hashed: {}>", hash),
|
|
|
+ Err(_) => String::from("<protected>"), // Fallback if hashing fails
|
|
|
+ };
|
|
|
|
|
|
f.debug_struct("Info")
|
|
|
.field("url", &self.url)
|
|
|
.field("listen_host", &self.listen_host)
|
|
|
.field("listen_port", &self.listen_port)
|
|
|
- .field("mnemonic", &format!("<hashed: {}>", mnemonic_hash))
|
|
|
+ .field("mnemonic", &mnemonic_display)
|
|
|
.field("input_fee_ppk", &self.input_fee_ppk)
|
|
|
.field("http_cache", &self.http_cache)
|
|
|
.field("enable_swagger_ui", &self.enable_swagger_ui)
|
|
@@ -361,3 +365,76 @@ impl Settings {
|
|
|
Ok(settings)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#[cfg(test)]
|
|
|
+mod tests {
|
|
|
+
|
|
|
+ use super::*;
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_info_debug_impl() {
|
|
|
+ // Create a sample Info struct with test data
|
|
|
+ let info = Info {
|
|
|
+ url: "http://example.com".to_string(),
|
|
|
+ listen_host: "127.0.0.1".to_string(),
|
|
|
+ listen_port: 8080,
|
|
|
+ mnemonic: "test secret mnemonic phrase".to_string(),
|
|
|
+ input_fee_ppk: Some(100),
|
|
|
+ ..Default::default()
|
|
|
+ };
|
|
|
+
|
|
|
+ // Convert the Info struct to a debug string
|
|
|
+ let debug_output = format!("{:?}", info);
|
|
|
+
|
|
|
+ // Verify the debug output contains expected fields
|
|
|
+ assert!(debug_output.contains("url: \"http://example.com\""));
|
|
|
+ assert!(debug_output.contains("listen_host: \"127.0.0.1\""));
|
|
|
+ assert!(debug_output.contains("listen_port: 8080"));
|
|
|
+
|
|
|
+ // The mnemonic should be hashed, not displayed in plaintext
|
|
|
+ assert!(!debug_output.contains("test secret mnemonic phrase"));
|
|
|
+ assert!(debug_output.contains("<hashed: "));
|
|
|
+
|
|
|
+ assert!(debug_output.contains("input_fee_ppk: 100"));
|
|
|
+ assert!(debug_output.contains("http_cache: true"));
|
|
|
+ assert!(debug_output.contains("enable_swagger_ui: false"));
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_info_debug_with_empty_mnemonic() {
|
|
|
+ // Test with an empty mnemonic to ensure it doesn't panic
|
|
|
+ let info = Info {
|
|
|
+ url: "http://example.com".to_string(),
|
|
|
+ listen_host: "127.0.0.1".to_string(),
|
|
|
+ listen_port: 8080,
|
|
|
+ mnemonic: "".to_string(), // Empty mnemonic
|
|
|
+ enable_swagger_ui: Some(false),
|
|
|
+ ..Default::default()
|
|
|
+ };
|
|
|
+
|
|
|
+ // This should not panic
|
|
|
+ let debug_output = format!("{:?}", info);
|
|
|
+
|
|
|
+ // The empty mnemonic should still be hashed
|
|
|
+ assert!(debug_output.contains("<hashed: "));
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_info_debug_with_special_chars() {
|
|
|
+ // Test with a mnemonic containing special characters
|
|
|
+ let info = Info {
|
|
|
+ url: "http://example.com".to_string(),
|
|
|
+ listen_host: "127.0.0.1".to_string(),
|
|
|
+ listen_port: 8080,
|
|
|
+ mnemonic: "特殊字符 !@#$%^&*()".to_string(), // Special characters
|
|
|
+ ..Default::default()
|
|
|
+ };
|
|
|
+
|
|
|
+ // This should not panic
|
|
|
+ let debug_output = format!("{:?}", info);
|
|
|
+
|
|
|
+ // The mnemonic with special chars should be hashed
|
|
|
+ assert!(!debug_output.contains("特殊字符 !@#$%^&*()"));
|
|
|
+ assert!(debug_output.contains("<hashed: "));
|
|
|
+ }
|
|
|
+}
|