mirror of
https://github.com/chatmail/core.git
synced 2026-04-19 22:46:29 +03:00
Add jsonrpc support
This commit is contained in:
@@ -4176,7 +4176,7 @@ pub unsafe extern "C" fn dc_backup_provider_qr_svg(
|
|||||||
let ctx = &*context;
|
let ctx = &*context;
|
||||||
let provider = &*provider;
|
let provider = &*provider;
|
||||||
block_on(async move {
|
block_on(async move {
|
||||||
generate_backup_qr(ctx, provider.qr())
|
generate_backup_qr(ctx, &provider.qr())
|
||||||
.await
|
.await
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.strdup()
|
.strdup()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::{collections::HashMap, str::FromStr};
|
use std::{collections::HashMap, str::FromStr};
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ use deltachat::{
|
|||||||
},
|
},
|
||||||
provider::get_provider_info,
|
provider::get_provider_info,
|
||||||
qr,
|
qr,
|
||||||
qr_code_generator::get_securejoin_qr_svg,
|
qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg},
|
||||||
reaction::send_reaction,
|
reaction::send_reaction,
|
||||||
securejoin,
|
securejoin,
|
||||||
stock_str::StockMessage,
|
stock_str::StockMessage,
|
||||||
@@ -1336,6 +1337,40 @@ impl CommandApi {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Starts to provide the backup for remote devices to retrieve.
|
||||||
|
///
|
||||||
|
/// Can be cancelled by stopping the ongoing process. Success or failure can be tracked
|
||||||
|
/// via the `ImexProgress` event which should either reach `1000` for success or `0` for
|
||||||
|
/// failure.
|
||||||
|
///
|
||||||
|
/// This **stops IO**. After completion `start_io` must be called to restart IO.
|
||||||
|
///
|
||||||
|
/// Returns the QR code as a rendered SVG image.
|
||||||
|
async fn provide_backup(&self, account_id: u32, path: String) -> Result<String> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
ctx.stop_io().await;
|
||||||
|
let provider = imex::BackupProvider::prepare(&ctx, Path::new(&path)).await?;
|
||||||
|
let qr = provider.qr();
|
||||||
|
let svg = match generate_backup_qr(&ctx, &qr).await {
|
||||||
|
Ok(svg) => svg,
|
||||||
|
Err(err) => {
|
||||||
|
ctx.stop_ongoing().await;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Ok(svg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets a backup from a remote provider.
|
||||||
|
///
|
||||||
|
/// Can be cancelled by stopping the ongoing process.
|
||||||
|
async fn get_backup(&self, account_id: u32, qr_text: String) -> Result<()> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
let qr = qr::check_qr(&ctx, &qr_text).await?;
|
||||||
|
imex::get_backup(&ctx, qr).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// connectivity
|
// connectivity
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ pub enum QrObject {
|
|||||||
domain: String,
|
domain: String,
|
||||||
},
|
},
|
||||||
Backup {
|
Backup {
|
||||||
ticket: Vec<u8>,
|
ticket: String,
|
||||||
},
|
},
|
||||||
WebrtcInstance {
|
WebrtcInstance {
|
||||||
domain: String,
|
domain: String,
|
||||||
@@ -130,7 +130,7 @@ impl From<Qr> for QrObject {
|
|||||||
Qr::FprWithoutAddr { fingerprint } => QrObject::FprWithoutAddr { fingerprint },
|
Qr::FprWithoutAddr { fingerprint } => QrObject::FprWithoutAddr { fingerprint },
|
||||||
Qr::Account { domain } => QrObject::Account { domain },
|
Qr::Account { domain } => QrObject::Account { domain },
|
||||||
Qr::Backup { ticket } => QrObject::Backup {
|
Qr::Backup { ticket } => QrObject::Backup {
|
||||||
ticket: ticket.to_bytes(),
|
ticket: ticket.to_string(),
|
||||||
},
|
},
|
||||||
Qr::WebrtcInstance {
|
Qr::WebrtcInstance {
|
||||||
domain,
|
domain,
|
||||||
|
|||||||
@@ -493,7 +493,7 @@ pub async fn cmdline(context: Context, line: &str, chat_id: &mut ChatId) -> Resu
|
|||||||
let dir = tdir.path();
|
let dir = tdir.path();
|
||||||
let provider = BackupProvider::prepare(&context, dir).await?;
|
let provider = BackupProvider::prepare(&context, dir).await?;
|
||||||
let qr = provider.qr();
|
let qr = provider.qr();
|
||||||
let rendered = deltachat::qr_code_generator::generate_backup_qr(&context, qr).await?;
|
let rendered = deltachat::qr_code_generator::generate_backup_qr(&context, &qr).await?;
|
||||||
let file = dir.join("qr.svg");
|
let file = dir.join("qr.svg");
|
||||||
tokio::fs::write(&file, rendered).await?;
|
tokio::fs::write(&file, rendered).await?;
|
||||||
println!("The QR code is at: {}", file.display());
|
println!("The QR code is at: {}", file.display());
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ async fn generate_verification_qr(context: &Context) -> Result<String> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn generate_backup_qr(context: &Context, qr: Qr) -> Result<String> {
|
pub async fn generate_backup_qr(context: &Context, qr: &Qr) -> Result<String> {
|
||||||
let Qr::Backup { ticket } = qr else {
|
let Qr::Backup { ticket } = qr else {
|
||||||
bail!("QR code not a backup");
|
bail!("QR code not a backup");
|
||||||
};
|
};
|
||||||
@@ -325,7 +325,7 @@ mod tests {
|
|||||||
let qr = provider.qr();
|
let qr = provider.qr();
|
||||||
|
|
||||||
println!("{}", format_backup(&qr).unwrap());
|
println!("{}", format_backup(&qr).unwrap());
|
||||||
let rendered = generate_backup_qr(&ctx, qr).await.unwrap();
|
let rendered = generate_backup_qr(&ctx, &qr).await.unwrap();
|
||||||
tokio::fs::write(dir.join("qr.svg"), &rendered)
|
tokio::fs::write(dir.join("qr.svg"), &rendered)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user