From ffad9a864e382b5c05966de5b085d15e83169949 Mon Sep 17 00:00:00 2001 From: replydev Date: Mon, 7 Apr 2025 21:38:24 +0200 Subject: [PATCH 1/2] test: add test with expected behaviour --- src/otp/otp_element.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/otp/otp_element.rs b/src/otp/otp_element.rs index a914d16..7d10612 100644 --- a/src/otp/otp_element.rs +++ b/src/otp/otp_element.rs @@ -423,4 +423,34 @@ mod test { result.unwrap_err().to_string() ); } + + #[test] + fn gh_issue_548_invalid_otp_uri_label_url_encoded() { + // Arrange + let otp_uri = "otpauth://totp/foo%3abar?issuer=foo&secret=JBSWY3DPEHPK3PXP"; + + // Act + let result = OTPElement::from_otp_uri(otp_uri); + + // Assert + assert!(result.is_ok()); + let actual = result.unwrap(); + assert_eq!("foo", actual.issuer.as_str()); + assert_eq!("bar", actual.label.as_str()); + } + + #[test] + fn gh_issue_548_invalid_otp_uri_label_non_url_encoded() { + // Arrange + let otp_uri = "otpauth://totp/foo:bar?issuer=foo&secret=JBSWY3DPEHPK3PXP"; + + // Act + let result = OTPElement::from_otp_uri(otp_uri); + + // Assert + assert!(result.is_ok()); + let actual = result.unwrap(); + assert_eq!("foo", actual.issuer.as_str()); + assert_eq!("bar", actual.label.as_str()); + } } From f5f974dc767a84350e6b5610615f71c948711fd4 Mon Sep 17 00:00:00 2001 From: replydev Date: Mon, 7 Apr 2025 21:46:34 +0200 Subject: [PATCH 2/2] fix: decode otp uri before parsing --- src/otp/from_otp_uri.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/otp/from_otp_uri.rs b/src/otp/from_otp_uri.rs index 6b23c39..04400ff 100644 --- a/src/otp/from_otp_uri.rs +++ b/src/otp/from_otp_uri.rs @@ -9,7 +9,8 @@ pub trait FromOtpUri: Sized { impl FromOtpUri for OTPElement { fn from_otp_uri(otp_uri: &str) -> color_eyre::Result { - let parsed_uri = Url::parse(otp_uri).map_err(ErrReport::from)?; + let decoded = urlencoding::decode(otp_uri).map_err(ErrReport::from)?; + let parsed_uri = Url::parse(&decoded).map_err(ErrReport::from)?; let otp_type = parsed_uri .host_str()