diff --git a/src/qr.rs b/src/qr.rs index f75f32ff9..afc6013c7 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -261,6 +261,13 @@ pub enum Qr { }, } +// hack around the changed JSON accidentally used by an iroh upgrade, see #6518 for more details and for code snippet. +// this hack is mainly needed to give ppl time to upgrade and can be removed after some months (added 2025-02) +fn fix_add_second_device_qr(qr: &str) -> String { + qr.replacen(r#","info":{"relay_url":"#, r#","relay_url":"#, 1) + .replacen(r#""]}}"#, r#""]}"#, 1) +} + fn starts_with_ignore_case(string: &str, pattern: &str) -> bool { string.to_lowercase().starts_with(&pattern.to_lowercase()) } @@ -290,7 +297,8 @@ pub async fn check_qr(context: &Context, qr: &str) -> Result { } else if qr.starts_with(SHADOWSOCKS_SCHEME) { decode_shadowsocks_proxy(qr)? } else if starts_with_ignore_case(qr, DCBACKUP2_SCHEME) { - decode_backup2(qr)? + let qr_fixed = fix_add_second_device_qr(qr); + decode_backup2(&qr_fixed)? } else if qr.starts_with(MAILTO_SCHEME) { decode_mailto(context, qr).await? } else if qr.starts_with(SMTP_SCHEME) { diff --git a/src/qr/qr_tests.rs b/src/qr/qr_tests.rs index 51d20b8fd..a7f6cbedf 100644 --- a/src/qr/qr_tests.rs +++ b/src/qr/qr_tests.rs @@ -914,5 +914,8 @@ async fn test_decode_backup() -> Result<()> { let qr = check_qr(&ctx, r#"DCBACKUP2:TWSv6ZjDPa5eoxkocj7xMi8r&{"node_id":"9afc1ea5b4f543e5cdd7b7a21cd26aee7c0b1e1c2af26790896fbd8932a06e1e","relay_url":null,"direct_addresses":["192.168.1.10:12345"]}"#).await?; assert!(matches!(qr, Qr::Backup2 { .. })); + let qr = check_qr(&ctx, r#"DCBACKUP2:AIvFjRFBt_aMiisSZ8P33JqY&{"node_id":"buzkyd4x76w66qtanjk5fm6ikeuo4quletajowsl3a3p7l6j23pa","info":{"relay_url":null,"direct_addresses":["192.168.1.5:12345"]}}"#).await?; + assert!(matches!(qr, Qr::Backup2 { .. })); + Ok(()) }