mirror of
https://github.com/chatmail/core.git
synced 2026-05-14 04:16:30 +03:00
implement dc_set_config_from_qr()
This commit is contained in:
committed by
holger krekel
parent
2b7a0a4585
commit
8b4edc46a7
@@ -435,7 +435,13 @@ pub unsafe extern "C" fn dc_set_config_from_qr(
|
|||||||
let qr = to_string_lossy(qr);
|
let qr = to_string_lossy(qr);
|
||||||
let ffi_context = &*context;
|
let ffi_context = &*context;
|
||||||
ffi_context
|
ffi_context
|
||||||
.with_inner(|ctx| qr::set_config_from_qr(ctx, &qr) as libc::c_int)
|
.with_inner(|ctx| match qr::set_config_from_qr(ctx, &qr) {
|
||||||
|
Ok(()) => 1,
|
||||||
|
Err(err) => {
|
||||||
|
error!(ctx, "Failed to create account from QR code: {}", err);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
})
|
||||||
.unwrap_or(0)
|
.unwrap_or(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -967,6 +967,10 @@ pub fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::Error> {
|
|||||||
res.get_text2()
|
res.get_text2()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
"setqr" => {
|
||||||
|
ensure!(!arg1.is_empty(), "Argument <qr-content> missing.");
|
||||||
|
set_config_from_qr(context, arg1);
|
||||||
|
}
|
||||||
"providerinfo" => {
|
"providerinfo" => {
|
||||||
ensure!(!arg1.is_empty(), "Argument <addr> missing.");
|
ensure!(!arg1.is_empty(), "Argument <addr> missing.");
|
||||||
match provider::get_provider_info(arg1) {
|
match provider::get_provider_info(arg1) {
|
||||||
|
|||||||
51
src/qr.rs
51
src/qr.rs
@@ -4,6 +4,7 @@ use lazy_static::lazy_static;
|
|||||||
use percent_encoding::percent_decode_str;
|
use percent_encoding::percent_decode_str;
|
||||||
|
|
||||||
use crate::chat;
|
use crate::chat;
|
||||||
|
use crate::config::*;
|
||||||
use crate::constants::Blocked;
|
use crate::constants::Blocked;
|
||||||
use crate::contact::*;
|
use crate::contact::*;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
@@ -14,6 +15,7 @@ use crate::lot::{Lot, LotState};
|
|||||||
use crate::param::*;
|
use crate::param::*;
|
||||||
use crate::peerstate::*;
|
use crate::peerstate::*;
|
||||||
use reqwest::Url;
|
use reqwest::Url;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase
|
const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase
|
||||||
const DCACCOUNT_SCHEME: &str = "DCACCOUNT:";
|
const DCACCOUNT_SCHEME: &str = "DCACCOUNT:";
|
||||||
@@ -205,12 +207,49 @@ fn decode_account(_context: &Context, qr: &str) -> Lot {
|
|||||||
lot
|
lot
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_config_from_qr(context: &Context, qr: &str) -> bool {
|
#[derive(Debug, Deserialize)]
|
||||||
error!(
|
struct CreateAccountResponse {
|
||||||
context,
|
email: String,
|
||||||
"Setting config from QR is not yet implemented :/ QR code: {}", qr
|
password: String,
|
||||||
);
|
}
|
||||||
false
|
|
||||||
|
/// take a qr of the type DC_QR_ACCOUNT, parse it's parameters,
|
||||||
|
/// download additional information from the contained url and set the parameters.
|
||||||
|
/// on success, a configure::configure() should be able to log in to the account
|
||||||
|
pub fn set_config_from_qr(context: &Context, qr: &str) -> Result<(), Error> {
|
||||||
|
let url_str = &qr[DCACCOUNT_SCHEME.len()..];
|
||||||
|
|
||||||
|
let response = reqwest::blocking::Client::new().post(url_str).send();
|
||||||
|
if response.is_err() {
|
||||||
|
return Err(format_err!(
|
||||||
|
"Cannot create account, request to {} failed",
|
||||||
|
url_str
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let response = response.unwrap();
|
||||||
|
if !response.status().is_success() {
|
||||||
|
return Err(format_err!(
|
||||||
|
"Request to {} unsuccessful: {:?}",
|
||||||
|
url_str,
|
||||||
|
response
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed: reqwest::Result<CreateAccountResponse> = response.json();
|
||||||
|
if parsed.is_err() {
|
||||||
|
return Err(format_err!(
|
||||||
|
"Failed to parse JSON response from {}: error: {:?}",
|
||||||
|
url_str,
|
||||||
|
parsed
|
||||||
|
));
|
||||||
|
}
|
||||||
|
println!("response: {:?}", &parsed);
|
||||||
|
let parsed = parsed.unwrap();
|
||||||
|
|
||||||
|
context.set_config(Config::Addr, Some(&parsed.email))?;
|
||||||
|
context.set_config(Config::MailPw, Some(&parsed.password))?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extract address for the mailto scheme.
|
/// Extract address for the mailto scheme.
|
||||||
|
|||||||
Reference in New Issue
Block a user