From 059af398ebd6f17aff3f4a6f982d493a7286020e Mon Sep 17 00:00:00 2001 From: Floris Bruynooghe Date: Wed, 1 Feb 2023 17:06:07 +0100 Subject: [PATCH] Allow decoding the QR code --- src/qr.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/qr.rs b/src/qr.rs index a29062f59..349a18244 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -35,6 +35,7 @@ const VCARD_SCHEME: &str = "BEGIN:VCARD"; const SMTP_SCHEME: &str = "SMTP:"; const HTTP_SCHEME: &str = "http://"; const HTTPS_SCHEME: &str = "https://"; +const DCBACKUP_SCHEME: &str = "DCBACKUP:"; #[derive(Debug, Clone, PartialEq, Eq)] pub enum Qr { @@ -137,6 +138,8 @@ pub async fn check_qr(context: &Context, qr: &str) -> Result { dclogin_scheme::decode_login(qr)? } else if starts_with_ignore_case(qr, DCWEBRTC_SCHEME) { decode_webrtc_instance(context, qr)? + } else if starts_with_ignore_case(qr, DCBACKUP_SCHEME) { + decode_backup(qr)? } else if qr.starts_with(MAILTO_SCHEME) { decode_mailto(context, qr).await? } else if qr.starts_with(SMTP_SCHEME) { @@ -364,6 +367,18 @@ fn decode_webrtc_instance(_context: &Context, qr: &str) -> Result { } } +/// Decodes a [`DCBACKUP_SCHEME`] QR code. +/// +/// The format of this scheme is `DCBACKUP:`. The encoding is the +/// [`sendme::provider::Ticket`]'s `Display` impl. +fn decode_backup(qr: &str) -> Result { + let payload = qr + .strip_prefix(DCBACKUP_SCHEME) + .ok_or(anyhow!("invalid DCBACKUP scheme"))?; + let ticket: sendme::provider::Ticket = payload.parse().context("invalid DCBACKUP payload")?; + Ok(Qr::Backup { ticket }) +} + #[derive(Debug, Deserialize)] struct CreateAccountSuccessResponse { email: String,