mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
Merge pull request #397 from deltachat/move_autoconfig_to_dedicated_file
Move moz- and outlk-autoconfig to dedicated files
This commit is contained in:
@@ -173,7 +173,7 @@ pub unsafe extern "C" fn dc_configure(context: *mut dc_context_t) {
|
|||||||
assert!(!context.is_null());
|
assert!(!context.is_null());
|
||||||
let context = &*context;
|
let context = &*context;
|
||||||
|
|
||||||
dc_configure::dc_configure(context)
|
configure::configure(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@@ -181,7 +181,7 @@ pub unsafe extern "C" fn dc_is_configured(context: *mut dc_context_t) -> libc::c
|
|||||||
assert!(!context.is_null());
|
assert!(!context.is_null());
|
||||||
let context = &*context;
|
let context = &*context;
|
||||||
|
|
||||||
dc_configure::dc_is_configured(context)
|
configure::dc_is_configured(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@@ -989,7 +989,7 @@ pub unsafe extern "C" fn dc_stop_ongoing_process(context: *mut dc_context_t) {
|
|||||||
assert!(!context.is_null());
|
assert!(!context.is_null());
|
||||||
let context = &*context;
|
let context = &*context;
|
||||||
|
|
||||||
dc_configure::dc_stop_ongoing_process(context)
|
configure::dc_stop_ongoing_process(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ use std::str::FromStr;
|
|||||||
use deltachat::chat::{self, Chat};
|
use deltachat::chat::{self, Chat};
|
||||||
use deltachat::chatlist::*;
|
use deltachat::chatlist::*;
|
||||||
use deltachat::config;
|
use deltachat::config;
|
||||||
|
use deltachat::configure::*;
|
||||||
use deltachat::constants::*;
|
use deltachat::constants::*;
|
||||||
use deltachat::contact::*;
|
use deltachat::contact::*;
|
||||||
use deltachat::context::*;
|
use deltachat::context::*;
|
||||||
use deltachat::dc_configure::*;
|
|
||||||
use deltachat::dc_imex::*;
|
use deltachat::dc_imex::*;
|
||||||
use deltachat::dc_location::*;
|
use deltachat::dc_location::*;
|
||||||
use deltachat::dc_receive_imf::*;
|
use deltachat::dc_receive_imf::*;
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ use std::sync::atomic::{AtomicBool, Ordering};
|
|||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
|
|
||||||
use deltachat::config;
|
use deltachat::config;
|
||||||
|
use deltachat::configure::*;
|
||||||
use deltachat::constants::*;
|
use deltachat::constants::*;
|
||||||
use deltachat::context::*;
|
use deltachat::context::*;
|
||||||
use deltachat::dc_configure::*;
|
|
||||||
use deltachat::dc_securejoin::*;
|
use deltachat::dc_securejoin::*;
|
||||||
use deltachat::dc_tools::*;
|
use deltachat::dc_tools::*;
|
||||||
use deltachat::job::*;
|
use deltachat::job::*;
|
||||||
@@ -495,7 +495,7 @@ unsafe fn handle_cmd(line: &str, ctx: Arc<RwLock<Context>>) -> Result<ExitResult
|
|||||||
}
|
}
|
||||||
"configure" => {
|
"configure" => {
|
||||||
start_threads(ctx.clone());
|
start_threads(ctx.clone());
|
||||||
dc_configure(&ctx.read().unwrap());
|
configure(&ctx.read().unwrap());
|
||||||
}
|
}
|
||||||
"oauth2" => {
|
"oauth2" => {
|
||||||
if let Some(addr) = ctx.read().unwrap().get_config(config::Config::Addr) {
|
if let Some(addr) = ctx.read().unwrap().get_config(config::Config::Addr) {
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ use tempfile::tempdir;
|
|||||||
use deltachat::chat;
|
use deltachat::chat;
|
||||||
use deltachat::chatlist::*;
|
use deltachat::chatlist::*;
|
||||||
use deltachat::config;
|
use deltachat::config;
|
||||||
|
use deltachat::configure::*;
|
||||||
use deltachat::constants::Event;
|
use deltachat::constants::Event;
|
||||||
use deltachat::contact::*;
|
use deltachat::contact::*;
|
||||||
use deltachat::context::*;
|
use deltachat::context::*;
|
||||||
use deltachat::dc_configure::*;
|
|
||||||
use deltachat::job::{
|
use deltachat::job::{
|
||||||
perform_imap_fetch, perform_imap_idle, perform_imap_jobs, perform_smtp_idle, perform_smtp_jobs,
|
perform_imap_fetch, perform_imap_idle, perform_imap_jobs, perform_smtp_idle, perform_smtp_jobs,
|
||||||
};
|
};
|
||||||
@@ -87,7 +87,7 @@ fn main() {
|
|||||||
ctx.set_config(config::Config::Addr, Some("d@testrun.org"))
|
ctx.set_config(config::Config::Addr, Some("d@testrun.org"))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ctx.set_config(config::Config::MailPw, Some(&pw)).unwrap();
|
ctx.set_config(config::Config::MailPw, Some(&pw)).unwrap();
|
||||||
dc_configure(&ctx);
|
configure(&ctx);
|
||||||
|
|
||||||
thread::sleep(duration);
|
thread::sleep(duration);
|
||||||
|
|
||||||
|
|||||||
224
src/configure/auto_mozilla.rs
Normal file
224
src/configure/auto_mozilla.rs
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
use quick_xml;
|
||||||
|
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
|
||||||
|
|
||||||
|
use crate::context::Context;
|
||||||
|
use crate::dc_loginparam::*;
|
||||||
|
use crate::dc_tools::*;
|
||||||
|
use crate::x::*;
|
||||||
|
|
||||||
|
use super::read_autoconf_file;
|
||||||
|
/* ******************************************************************************
|
||||||
|
* Thunderbird's Autoconfigure
|
||||||
|
******************************************************************************/
|
||||||
|
/* documentation: https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Autoconfiguration */
|
||||||
|
#[repr(C)]
|
||||||
|
struct moz_autoconfigure_t<'a> {
|
||||||
|
pub in_0: &'a dc_loginparam_t,
|
||||||
|
pub in_emaildomain: *mut libc::c_char,
|
||||||
|
pub in_emaillocalpart: *mut libc::c_char,
|
||||||
|
pub out: dc_loginparam_t,
|
||||||
|
pub out_imap_set: libc::c_int,
|
||||||
|
pub out_smtp_set: libc::c_int,
|
||||||
|
pub tag_server: libc::c_int,
|
||||||
|
pub tag_config: libc::c_int,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn moz_autoconfigure(
|
||||||
|
context: &Context,
|
||||||
|
url: &str,
|
||||||
|
param_in: &dc_loginparam_t,
|
||||||
|
) -> Option<dc_loginparam_t> {
|
||||||
|
let mut moz_ac = moz_autoconfigure_t {
|
||||||
|
in_0: param_in,
|
||||||
|
in_emaildomain: std::ptr::null_mut(),
|
||||||
|
in_emaillocalpart: std::ptr::null_mut(),
|
||||||
|
out: dc_loginparam_new(),
|
||||||
|
out_imap_set: 0,
|
||||||
|
out_smtp_set: 0,
|
||||||
|
tag_server: 0,
|
||||||
|
tag_config: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let url_c = url.strdup();
|
||||||
|
let xml_raw = read_autoconf_file(context, url_c);
|
||||||
|
free(url_c as *mut libc::c_void);
|
||||||
|
if xml_raw.is_null() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
moz_ac.in_emaillocalpart = param_in.addr.strdup();
|
||||||
|
let p = strchr(moz_ac.in_emaillocalpart, '@' as i32);
|
||||||
|
|
||||||
|
if p.is_null() {
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p = 0 as libc::c_char;
|
||||||
|
moz_ac.in_emaildomain = dc_strdup(p.offset(1isize));
|
||||||
|
|
||||||
|
let mut reader = quick_xml::Reader::from_str(as_str(xml_raw));
|
||||||
|
reader.trim_text(true);
|
||||||
|
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match reader.read_event(&mut buf) {
|
||||||
|
Ok(quick_xml::events::Event::Start(ref e)) => {
|
||||||
|
moz_autoconfigure_starttag_cb(e, &mut moz_ac, &reader)
|
||||||
|
}
|
||||||
|
Ok(quick_xml::events::Event::End(ref e)) => moz_autoconfigure_endtag_cb(e, &mut moz_ac),
|
||||||
|
Ok(quick_xml::events::Event::Text(ref e)) => {
|
||||||
|
moz_autoconfigure_text_cb(e, &mut moz_ac, &reader)
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!(
|
||||||
|
context,
|
||||||
|
0,
|
||||||
|
"Configure xml: Error at position {}: {:?}",
|
||||||
|
reader.buffer_position(),
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(quick_xml::events::Event::Eof) => break,
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
buf.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if moz_ac.out.mail_server.is_empty()
|
||||||
|
|| moz_ac.out.mail_port == 0
|
||||||
|
|| moz_ac.out.send_server.is_empty()
|
||||||
|
|| moz_ac.out.send_port == 0
|
||||||
|
{
|
||||||
|
let r = dc_loginparam_get_readable(&moz_ac.out);
|
||||||
|
warn!(context, 0, "Bad or incomplete autoconfig: {}", r,);
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
||||||
|
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
||||||
|
Some(moz_ac.out)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn moz_autoconfigure_text_cb<B: std::io::BufRead>(
|
||||||
|
event: &BytesText,
|
||||||
|
moz_ac: &mut moz_autoconfigure_t,
|
||||||
|
reader: &quick_xml::Reader<B>,
|
||||||
|
) {
|
||||||
|
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
||||||
|
|
||||||
|
let addr = &moz_ac.in_0.addr;
|
||||||
|
let email_local = as_str(moz_ac.in_emaillocalpart);
|
||||||
|
let email_domain = as_str(moz_ac.in_emaildomain);
|
||||||
|
|
||||||
|
let val = val
|
||||||
|
.trim()
|
||||||
|
.replace("%EMAILADDRESS%", addr)
|
||||||
|
.replace("%EMAILLOCALPART%", email_local)
|
||||||
|
.replace("%EMAILDOMAIN%", email_domain);
|
||||||
|
|
||||||
|
if moz_ac.tag_server == 1 {
|
||||||
|
match moz_ac.tag_config {
|
||||||
|
10 => moz_ac.out.mail_server = val,
|
||||||
|
11 => moz_ac.out.mail_port = val.parse().unwrap_or_default(),
|
||||||
|
12 => moz_ac.out.mail_user = val,
|
||||||
|
13 => {
|
||||||
|
let val_lower = val.to_lowercase();
|
||||||
|
if val_lower == "ssl" {
|
||||||
|
moz_ac.out.server_flags |= 0x200
|
||||||
|
}
|
||||||
|
if val_lower == "starttls" {
|
||||||
|
moz_ac.out.server_flags |= 0x100
|
||||||
|
}
|
||||||
|
if val_lower == "plain" {
|
||||||
|
moz_ac.out.server_flags |= 0x400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
} else if moz_ac.tag_server == 2 {
|
||||||
|
match moz_ac.tag_config {
|
||||||
|
10 => moz_ac.out.send_server = val,
|
||||||
|
11 => moz_ac.out.send_port = val.parse().unwrap_or_default(),
|
||||||
|
12 => moz_ac.out.send_user = val,
|
||||||
|
13 => {
|
||||||
|
let val_lower = val.to_lowercase();
|
||||||
|
if val_lower == "ssl" {
|
||||||
|
moz_ac.out.server_flags |= 0x20000
|
||||||
|
}
|
||||||
|
if val_lower == "starttls" {
|
||||||
|
moz_ac.out.server_flags |= 0x10000
|
||||||
|
}
|
||||||
|
if val_lower == "plain" {
|
||||||
|
moz_ac.out.server_flags |= 0x40000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn moz_autoconfigure_endtag_cb(event: &BytesEnd, moz_ac: &mut moz_autoconfigure_t) {
|
||||||
|
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
||||||
|
|
||||||
|
if tag == "incomingserver" {
|
||||||
|
moz_ac.tag_server = 0;
|
||||||
|
moz_ac.tag_config = 0;
|
||||||
|
moz_ac.out_imap_set = 1;
|
||||||
|
} else if tag == "outgoingserver" {
|
||||||
|
moz_ac.tag_server = 0;
|
||||||
|
moz_ac.tag_config = 0;
|
||||||
|
moz_ac.out_smtp_set = 1;
|
||||||
|
} else {
|
||||||
|
moz_ac.tag_config = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn moz_autoconfigure_starttag_cb<B: std::io::BufRead>(
|
||||||
|
event: &BytesStart,
|
||||||
|
moz_ac: &mut moz_autoconfigure_t,
|
||||||
|
reader: &quick_xml::Reader<B>,
|
||||||
|
) {
|
||||||
|
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
||||||
|
|
||||||
|
if tag == "incomingserver" {
|
||||||
|
moz_ac.tag_server = if let Some(typ) = event.attributes().find(|attr| {
|
||||||
|
attr.as_ref()
|
||||||
|
.map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "type")
|
||||||
|
.unwrap_or_default()
|
||||||
|
}) {
|
||||||
|
let typ = typ
|
||||||
|
.unwrap()
|
||||||
|
.unescape_and_decode_value(reader)
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_lowercase();
|
||||||
|
|
||||||
|
if typ == "imap" && moz_ac.out_imap_set == 0 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
moz_ac.tag_config = 0;
|
||||||
|
} else if tag == "outgoingserver" {
|
||||||
|
moz_ac.tag_server = if moz_ac.out_smtp_set == 0 { 2 } else { 0 };
|
||||||
|
moz_ac.tag_config = 0;
|
||||||
|
} else if tag == "hostname" {
|
||||||
|
moz_ac.tag_config = 10;
|
||||||
|
} else if tag == "port" {
|
||||||
|
moz_ac.tag_config = 11;
|
||||||
|
} else if tag == "sockettype" {
|
||||||
|
moz_ac.tag_config = 13;
|
||||||
|
} else if tag == "username" {
|
||||||
|
moz_ac.tag_config = 12;
|
||||||
|
}
|
||||||
|
}
|
||||||
213
src/configure/auto_outlook.rs
Normal file
213
src/configure/auto_outlook.rs
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
use quick_xml;
|
||||||
|
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
|
||||||
|
|
||||||
|
use crate::context::Context;
|
||||||
|
use crate::dc_loginparam::*;
|
||||||
|
use crate::dc_tools::*;
|
||||||
|
use crate::x::*;
|
||||||
|
use std::ptr;
|
||||||
|
|
||||||
|
use super::read_autoconf_file;
|
||||||
|
/* ******************************************************************************
|
||||||
|
* Outlook's Autodiscover
|
||||||
|
******************************************************************************/
|
||||||
|
#[repr(C)]
|
||||||
|
struct outlk_autodiscover_t<'a> {
|
||||||
|
pub in_0: &'a dc_loginparam_t,
|
||||||
|
pub out: dc_loginparam_t,
|
||||||
|
pub out_imap_set: libc::c_int,
|
||||||
|
pub out_smtp_set: libc::c_int,
|
||||||
|
pub tag_config: libc::c_int,
|
||||||
|
pub config: [*mut libc::c_char; 6],
|
||||||
|
pub redirect: *mut libc::c_char,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub unsafe fn outlk_autodiscover(
|
||||||
|
context: &Context,
|
||||||
|
url__: &str,
|
||||||
|
param_in: &dc_loginparam_t,
|
||||||
|
) -> Option<dc_loginparam_t> {
|
||||||
|
let mut xml_raw: *mut libc::c_char = ptr::null_mut();
|
||||||
|
let mut url = url__.strdup();
|
||||||
|
let mut outlk_ad = outlk_autodiscover_t {
|
||||||
|
in_0: param_in,
|
||||||
|
out: dc_loginparam_new(),
|
||||||
|
out_imap_set: 0,
|
||||||
|
out_smtp_set: 0,
|
||||||
|
tag_config: 0,
|
||||||
|
config: [ptr::null_mut(); 6],
|
||||||
|
redirect: ptr::null_mut(),
|
||||||
|
};
|
||||||
|
let ok_to_continue;
|
||||||
|
let mut i = 0;
|
||||||
|
loop {
|
||||||
|
if !(i < 10) {
|
||||||
|
ok_to_continue = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memset(
|
||||||
|
&mut outlk_ad as *mut outlk_autodiscover_t as *mut libc::c_void,
|
||||||
|
0,
|
||||||
|
::std::mem::size_of::<outlk_autodiscover_t>(),
|
||||||
|
);
|
||||||
|
xml_raw = read_autoconf_file(context, url);
|
||||||
|
if xml_raw.is_null() {
|
||||||
|
ok_to_continue = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut reader = quick_xml::Reader::from_str(as_str(xml_raw));
|
||||||
|
reader.trim_text(true);
|
||||||
|
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match reader.read_event(&mut buf) {
|
||||||
|
Ok(quick_xml::events::Event::Start(ref e)) => {
|
||||||
|
outlk_autodiscover_starttag_cb(e, &mut outlk_ad)
|
||||||
|
}
|
||||||
|
Ok(quick_xml::events::Event::End(ref e)) => {
|
||||||
|
outlk_autodiscover_endtag_cb(e, &mut outlk_ad)
|
||||||
|
}
|
||||||
|
Ok(quick_xml::events::Event::Text(ref e)) => {
|
||||||
|
outlk_autodiscover_text_cb(e, &mut outlk_ad, &reader)
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!(
|
||||||
|
context,
|
||||||
|
0,
|
||||||
|
"Configure xml: Error at position {}: {:?}",
|
||||||
|
reader.buffer_position(),
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(quick_xml::events::Event::Eof) => break,
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
buf.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if !(!outlk_ad.config[5].is_null()
|
||||||
|
&& 0 != *outlk_ad.config[5usize].offset(0isize) as libc::c_int)
|
||||||
|
{
|
||||||
|
ok_to_continue = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free(url as *mut libc::c_void);
|
||||||
|
url = dc_strdup(outlk_ad.config[5usize]);
|
||||||
|
|
||||||
|
outlk_clean_config(&mut outlk_ad);
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
xml_raw = ptr::null_mut();
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ok_to_continue {
|
||||||
|
if outlk_ad.out.mail_server.is_empty()
|
||||||
|
|| outlk_ad.out.mail_port == 0
|
||||||
|
|| outlk_ad.out.send_server.is_empty()
|
||||||
|
|| outlk_ad.out.send_port == 0
|
||||||
|
{
|
||||||
|
let r = dc_loginparam_get_readable(&outlk_ad.out);
|
||||||
|
warn!(context, 0, "Bad or incomplete autoconfig: {}", r,);
|
||||||
|
free(url as *mut libc::c_void);
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
outlk_clean_config(&mut outlk_ad);
|
||||||
|
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(url as *mut libc::c_void);
|
||||||
|
free(xml_raw as *mut libc::c_void);
|
||||||
|
outlk_clean_config(&mut outlk_ad);
|
||||||
|
Some(outlk_ad.out)
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn outlk_clean_config(mut outlk_ad: *mut outlk_autodiscover_t) {
|
||||||
|
for i in 0..6 {
|
||||||
|
free((*outlk_ad).config[i] as *mut libc::c_void);
|
||||||
|
(*outlk_ad).config[i] = 0 as *mut libc::c_char;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn outlk_autodiscover_text_cb<B: std::io::BufRead>(
|
||||||
|
event: &BytesText,
|
||||||
|
outlk_ad: &mut outlk_autodiscover_t,
|
||||||
|
reader: &quick_xml::Reader<B>,
|
||||||
|
) {
|
||||||
|
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
free(outlk_ad.config[outlk_ad.tag_config as usize].cast());
|
||||||
|
outlk_ad.config[outlk_ad.tag_config as usize] = val.trim().strdup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe fn outlk_autodiscover_endtag_cb(event: &BytesEnd, outlk_ad: &mut outlk_autodiscover_t) {
|
||||||
|
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
||||||
|
|
||||||
|
if tag == "protocol" {
|
||||||
|
if !outlk_ad.config[1].is_null() {
|
||||||
|
let port = dc_atoi_null_is_0(outlk_ad.config[3]);
|
||||||
|
let ssl_on = (!outlk_ad.config[4].is_null()
|
||||||
|
&& strcasecmp(
|
||||||
|
outlk_ad.config[4],
|
||||||
|
b"on\x00" as *const u8 as *const libc::c_char,
|
||||||
|
) == 0) as libc::c_int;
|
||||||
|
let ssl_off = (!outlk_ad.config[4].is_null()
|
||||||
|
&& strcasecmp(
|
||||||
|
outlk_ad.config[4],
|
||||||
|
b"off\x00" as *const u8 as *const libc::c_char,
|
||||||
|
) == 0) as libc::c_int;
|
||||||
|
if strcasecmp(
|
||||||
|
outlk_ad.config[1],
|
||||||
|
b"imap\x00" as *const u8 as *const libc::c_char,
|
||||||
|
) == 0
|
||||||
|
&& outlk_ad.out_imap_set == 0
|
||||||
|
{
|
||||||
|
outlk_ad.out.mail_server = to_string(outlk_ad.config[2]);
|
||||||
|
outlk_ad.out.mail_port = port;
|
||||||
|
if 0 != ssl_on {
|
||||||
|
outlk_ad.out.server_flags |= 0x200
|
||||||
|
} else if 0 != ssl_off {
|
||||||
|
outlk_ad.out.server_flags |= 0x400
|
||||||
|
}
|
||||||
|
outlk_ad.out_imap_set = 1
|
||||||
|
} else if strcasecmp(
|
||||||
|
outlk_ad.config[1usize],
|
||||||
|
b"smtp\x00" as *const u8 as *const libc::c_char,
|
||||||
|
) == 0
|
||||||
|
&& outlk_ad.out_smtp_set == 0
|
||||||
|
{
|
||||||
|
outlk_ad.out.send_server = to_string(outlk_ad.config[2]);
|
||||||
|
outlk_ad.out.send_port = port;
|
||||||
|
if 0 != ssl_on {
|
||||||
|
outlk_ad.out.server_flags |= 0x20000
|
||||||
|
} else if 0 != ssl_off {
|
||||||
|
outlk_ad.out.server_flags |= 0x40000
|
||||||
|
}
|
||||||
|
outlk_ad.out_smtp_set = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outlk_clean_config(outlk_ad);
|
||||||
|
}
|
||||||
|
outlk_ad.tag_config = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn outlk_autodiscover_starttag_cb(event: &BytesStart, outlk_ad: &mut outlk_autodiscover_t) {
|
||||||
|
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
||||||
|
|
||||||
|
if tag == "protocol" {
|
||||||
|
unsafe { outlk_clean_config(outlk_ad) };
|
||||||
|
} else if tag == "type" {
|
||||||
|
outlk_ad.tag_config = 1
|
||||||
|
} else if tag == "server" {
|
||||||
|
outlk_ad.tag_config = 2
|
||||||
|
} else if tag == "port" {
|
||||||
|
outlk_ad.tag_config = 3
|
||||||
|
} else if tag == "ssl" {
|
||||||
|
outlk_ad.tag_config = 4
|
||||||
|
} else if tag == "redirecturl" {
|
||||||
|
outlk_ad.tag_config = 5
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
|
use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
|
||||||
use quick_xml;
|
|
||||||
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
|
|
||||||
|
|
||||||
use crate::constants::Event;
|
use crate::constants::Event;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
@@ -12,8 +10,11 @@ use crate::job::*;
|
|||||||
use crate::oauth2::*;
|
use crate::oauth2::*;
|
||||||
use crate::param::Params;
|
use crate::param::Params;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
use crate::x::*;
|
|
||||||
use std::ptr;
|
mod auto_outlook;
|
||||||
|
use auto_outlook::outlk_autodiscover;
|
||||||
|
mod auto_mozilla;
|
||||||
|
use auto_mozilla::moz_autoconfigure;
|
||||||
|
|
||||||
macro_rules! progress {
|
macro_rules! progress {
|
||||||
($context:tt, $progress:expr) => {
|
($context:tt, $progress:expr) => {
|
||||||
@@ -29,47 +30,8 @@ macro_rules! progress {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ******************************************************************************
|
|
||||||
* Configure folders
|
|
||||||
******************************************************************************/
|
|
||||||
#[derive(Copy, Clone)]
|
|
||||||
#[repr(C)]
|
|
||||||
struct dc_imapfolder_t {
|
|
||||||
pub name_to_select: *mut libc::c_char,
|
|
||||||
pub name_utf8: *mut libc::c_char,
|
|
||||||
pub meaning: libc::c_int,
|
|
||||||
}
|
|
||||||
/* ******************************************************************************
|
|
||||||
* Thunderbird's Autoconfigure
|
|
||||||
******************************************************************************/
|
|
||||||
/* documentation: https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Autoconfiguration */
|
|
||||||
#[repr(C)]
|
|
||||||
struct moz_autoconfigure_t<'a> {
|
|
||||||
pub in_0: &'a dc_loginparam_t,
|
|
||||||
pub in_emaildomain: *mut libc::c_char,
|
|
||||||
pub in_emaillocalpart: *mut libc::c_char,
|
|
||||||
pub out: dc_loginparam_t,
|
|
||||||
pub out_imap_set: libc::c_int,
|
|
||||||
pub out_smtp_set: libc::c_int,
|
|
||||||
pub tag_server: libc::c_int,
|
|
||||||
pub tag_config: libc::c_int,
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ******************************************************************************
|
|
||||||
* Outlook's Autodiscover
|
|
||||||
******************************************************************************/
|
|
||||||
#[repr(C)]
|
|
||||||
struct outlk_autodiscover_t<'a> {
|
|
||||||
pub in_0: &'a dc_loginparam_t,
|
|
||||||
pub out: dc_loginparam_t,
|
|
||||||
pub out_imap_set: libc::c_int,
|
|
||||||
pub out_smtp_set: libc::c_int,
|
|
||||||
pub tag_config: libc::c_int,
|
|
||||||
pub config: [*mut libc::c_char; 6],
|
|
||||||
pub redirect: *mut libc::c_char,
|
|
||||||
}
|
|
||||||
// connect
|
// connect
|
||||||
pub unsafe fn dc_configure(context: &Context) {
|
pub unsafe fn configure(context: &Context) {
|
||||||
if 0 != dc_has_ongoing(context) {
|
if 0 != dc_has_ongoing(context) {
|
||||||
warn!(
|
warn!(
|
||||||
context,
|
context,
|
||||||
@@ -692,413 +654,6 @@ pub unsafe fn dc_free_ongoing(context: &Context) {
|
|||||||
s.shall_stop_ongoing = true;
|
s.shall_stop_ongoing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn moz_autoconfigure(
|
|
||||||
context: &Context,
|
|
||||||
url: &str,
|
|
||||||
param_in: &dc_loginparam_t,
|
|
||||||
) -> Option<dc_loginparam_t> {
|
|
||||||
let mut moz_ac = moz_autoconfigure_t {
|
|
||||||
in_0: param_in,
|
|
||||||
in_emaildomain: std::ptr::null_mut(),
|
|
||||||
in_emaillocalpart: std::ptr::null_mut(),
|
|
||||||
out: dc_loginparam_new(),
|
|
||||||
out_imap_set: 0,
|
|
||||||
out_smtp_set: 0,
|
|
||||||
tag_server: 0,
|
|
||||||
tag_config: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
let url_c = url.strdup();
|
|
||||||
let xml_raw = read_autoconf_file(context, url_c);
|
|
||||||
free(url_c as *mut libc::c_void);
|
|
||||||
if xml_raw.is_null() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
moz_ac.in_emaillocalpart = param_in.addr.strdup();
|
|
||||||
let p = strchr(moz_ac.in_emaillocalpart, '@' as i32);
|
|
||||||
|
|
||||||
if p.is_null() {
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = 0 as libc::c_char;
|
|
||||||
moz_ac.in_emaildomain = dc_strdup(p.offset(1isize));
|
|
||||||
|
|
||||||
let mut reader = quick_xml::Reader::from_str(as_str(xml_raw));
|
|
||||||
reader.trim_text(true);
|
|
||||||
|
|
||||||
let mut buf = Vec::new();
|
|
||||||
|
|
||||||
loop {
|
|
||||||
match reader.read_event(&mut buf) {
|
|
||||||
Ok(quick_xml::events::Event::Start(ref e)) => {
|
|
||||||
moz_autoconfigure_starttag_cb(e, &mut moz_ac, &reader)
|
|
||||||
}
|
|
||||||
Ok(quick_xml::events::Event::End(ref e)) => moz_autoconfigure_endtag_cb(e, &mut moz_ac),
|
|
||||||
Ok(quick_xml::events::Event::Text(ref e)) => {
|
|
||||||
moz_autoconfigure_text_cb(e, &mut moz_ac, &reader)
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
error!(
|
|
||||||
context,
|
|
||||||
0,
|
|
||||||
"Configure xml: Error at position {}: {:?}",
|
|
||||||
reader.buffer_position(),
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Ok(quick_xml::events::Event::Eof) => break,
|
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
buf.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if moz_ac.out.mail_server.is_empty()
|
|
||||||
|| moz_ac.out.mail_port == 0
|
|
||||||
|| moz_ac.out.send_server.is_empty()
|
|
||||||
|| moz_ac.out.send_port == 0
|
|
||||||
{
|
|
||||||
let r = dc_loginparam_get_readable(&moz_ac.out);
|
|
||||||
warn!(context, 0, "Bad or incomplete autoconfig: {}", r,);
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaildomain as *mut libc::c_void);
|
|
||||||
free(moz_ac.in_emaillocalpart as *mut libc::c_void);
|
|
||||||
Some(moz_ac.out)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moz_autoconfigure_text_cb<B: std::io::BufRead>(
|
|
||||||
event: &BytesText,
|
|
||||||
moz_ac: &mut moz_autoconfigure_t,
|
|
||||||
reader: &quick_xml::Reader<B>,
|
|
||||||
) {
|
|
||||||
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
|
||||||
|
|
||||||
let addr = &moz_ac.in_0.addr;
|
|
||||||
let email_local = as_str(moz_ac.in_emaillocalpart);
|
|
||||||
let email_domain = as_str(moz_ac.in_emaildomain);
|
|
||||||
|
|
||||||
let val = val
|
|
||||||
.trim()
|
|
||||||
.replace("%EMAILADDRESS%", addr)
|
|
||||||
.replace("%EMAILLOCALPART%", email_local)
|
|
||||||
.replace("%EMAILDOMAIN%", email_domain);
|
|
||||||
|
|
||||||
if moz_ac.tag_server == 1 {
|
|
||||||
match moz_ac.tag_config {
|
|
||||||
10 => moz_ac.out.mail_server = val,
|
|
||||||
11 => moz_ac.out.mail_port = val.parse().unwrap_or_default(),
|
|
||||||
12 => moz_ac.out.mail_user = val,
|
|
||||||
13 => {
|
|
||||||
let val_lower = val.to_lowercase();
|
|
||||||
if val_lower == "ssl" {
|
|
||||||
moz_ac.out.server_flags |= 0x200
|
|
||||||
}
|
|
||||||
if val_lower == "starttls" {
|
|
||||||
moz_ac.out.server_flags |= 0x100
|
|
||||||
}
|
|
||||||
if val_lower == "plain" {
|
|
||||||
moz_ac.out.server_flags |= 0x400
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
} else if moz_ac.tag_server == 2 {
|
|
||||||
match moz_ac.tag_config {
|
|
||||||
10 => moz_ac.out.send_server = val,
|
|
||||||
11 => moz_ac.out.send_port = val.parse().unwrap_or_default(),
|
|
||||||
12 => moz_ac.out.send_user = val,
|
|
||||||
13 => {
|
|
||||||
let val_lower = val.to_lowercase();
|
|
||||||
if val_lower == "ssl" {
|
|
||||||
moz_ac.out.server_flags |= 0x20000
|
|
||||||
}
|
|
||||||
if val_lower == "starttls" {
|
|
||||||
moz_ac.out.server_flags |= 0x10000
|
|
||||||
}
|
|
||||||
if val_lower == "plain" {
|
|
||||||
moz_ac.out.server_flags |= 0x40000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moz_autoconfigure_endtag_cb(event: &BytesEnd, moz_ac: &mut moz_autoconfigure_t) {
|
|
||||||
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
|
||||||
|
|
||||||
if tag == "incomingserver" {
|
|
||||||
moz_ac.tag_server = 0;
|
|
||||||
moz_ac.tag_config = 0;
|
|
||||||
moz_ac.out_imap_set = 1;
|
|
||||||
} else if tag == "outgoingserver" {
|
|
||||||
moz_ac.tag_server = 0;
|
|
||||||
moz_ac.tag_config = 0;
|
|
||||||
moz_ac.out_smtp_set = 1;
|
|
||||||
} else {
|
|
||||||
moz_ac.tag_config = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moz_autoconfigure_starttag_cb<B: std::io::BufRead>(
|
|
||||||
event: &BytesStart,
|
|
||||||
moz_ac: &mut moz_autoconfigure_t,
|
|
||||||
reader: &quick_xml::Reader<B>,
|
|
||||||
) {
|
|
||||||
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
|
||||||
|
|
||||||
if tag == "incomingserver" {
|
|
||||||
moz_ac.tag_server = if let Some(typ) = event.attributes().find(|attr| {
|
|
||||||
attr.as_ref()
|
|
||||||
.map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "type")
|
|
||||||
.unwrap_or_default()
|
|
||||||
}) {
|
|
||||||
let typ = typ
|
|
||||||
.unwrap()
|
|
||||||
.unescape_and_decode_value(reader)
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_lowercase();
|
|
||||||
|
|
||||||
if typ == "imap" && moz_ac.out_imap_set == 0 {
|
|
||||||
1
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
moz_ac.tag_config = 0;
|
|
||||||
} else if tag == "outgoingserver" {
|
|
||||||
moz_ac.tag_server = if moz_ac.out_smtp_set == 0 { 2 } else { 0 };
|
|
||||||
moz_ac.tag_config = 0;
|
|
||||||
} else if tag == "hostname" {
|
|
||||||
moz_ac.tag_config = 10;
|
|
||||||
} else if tag == "port" {
|
|
||||||
moz_ac.tag_config = 11;
|
|
||||||
} else if tag == "sockettype" {
|
|
||||||
moz_ac.tag_config = 13;
|
|
||||||
} else if tag == "username" {
|
|
||||||
moz_ac.tag_config = 12;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read_autoconf_file(context: &Context, url: *const libc::c_char) -> *mut libc::c_char {
|
|
||||||
info!(context, 0, "Testing {} ...", to_string(url));
|
|
||||||
|
|
||||||
match reqwest::Client::new()
|
|
||||||
.get(as_str(url))
|
|
||||||
.send()
|
|
||||||
.and_then(|mut res| res.text())
|
|
||||||
{
|
|
||||||
Ok(res) => unsafe { res.strdup() },
|
|
||||||
Err(_err) => {
|
|
||||||
info!(context, 0, "Can\'t read file.",);
|
|
||||||
|
|
||||||
std::ptr::null_mut()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn outlk_autodiscover(
|
|
||||||
context: &Context,
|
|
||||||
url__: &str,
|
|
||||||
param_in: &dc_loginparam_t,
|
|
||||||
) -> Option<dc_loginparam_t> {
|
|
||||||
let mut xml_raw: *mut libc::c_char = ptr::null_mut();
|
|
||||||
let mut url = url__.strdup();
|
|
||||||
let mut outlk_ad = outlk_autodiscover_t {
|
|
||||||
in_0: param_in,
|
|
||||||
out: dc_loginparam_new(),
|
|
||||||
out_imap_set: 0,
|
|
||||||
out_smtp_set: 0,
|
|
||||||
tag_config: 0,
|
|
||||||
config: [ptr::null_mut(); 6],
|
|
||||||
redirect: ptr::null_mut(),
|
|
||||||
};
|
|
||||||
let ok_to_continue;
|
|
||||||
let mut i = 0;
|
|
||||||
loop {
|
|
||||||
if !(i < 10) {
|
|
||||||
ok_to_continue = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
memset(
|
|
||||||
&mut outlk_ad as *mut outlk_autodiscover_t as *mut libc::c_void,
|
|
||||||
0,
|
|
||||||
::std::mem::size_of::<outlk_autodiscover_t>(),
|
|
||||||
);
|
|
||||||
xml_raw = read_autoconf_file(context, url);
|
|
||||||
if xml_raw.is_null() {
|
|
||||||
ok_to_continue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut reader = quick_xml::Reader::from_str(as_str(xml_raw));
|
|
||||||
reader.trim_text(true);
|
|
||||||
|
|
||||||
let mut buf = Vec::new();
|
|
||||||
|
|
||||||
loop {
|
|
||||||
match reader.read_event(&mut buf) {
|
|
||||||
Ok(quick_xml::events::Event::Start(ref e)) => {
|
|
||||||
outlk_autodiscover_starttag_cb(e, &mut outlk_ad)
|
|
||||||
}
|
|
||||||
Ok(quick_xml::events::Event::End(ref e)) => {
|
|
||||||
outlk_autodiscover_endtag_cb(e, &mut outlk_ad)
|
|
||||||
}
|
|
||||||
Ok(quick_xml::events::Event::Text(ref e)) => {
|
|
||||||
outlk_autodiscover_text_cb(e, &mut outlk_ad, &reader)
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
error!(
|
|
||||||
context,
|
|
||||||
0,
|
|
||||||
"Configure xml: Error at position {}: {:?}",
|
|
||||||
reader.buffer_position(),
|
|
||||||
e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Ok(quick_xml::events::Event::Eof) => break,
|
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
buf.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if !(!outlk_ad.config[5].is_null()
|
|
||||||
&& 0 != *outlk_ad.config[5usize].offset(0isize) as libc::c_int)
|
|
||||||
{
|
|
||||||
ok_to_continue = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
free(url as *mut libc::c_void);
|
|
||||||
url = dc_strdup(outlk_ad.config[5usize]);
|
|
||||||
|
|
||||||
outlk_clean_config(&mut outlk_ad);
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
xml_raw = ptr::null_mut();
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ok_to_continue {
|
|
||||||
if outlk_ad.out.mail_server.is_empty()
|
|
||||||
|| outlk_ad.out.mail_port == 0
|
|
||||||
|| outlk_ad.out.send_server.is_empty()
|
|
||||||
|| outlk_ad.out.send_port == 0
|
|
||||||
{
|
|
||||||
let r = dc_loginparam_get_readable(&outlk_ad.out);
|
|
||||||
warn!(context, 0, "Bad or incomplete autoconfig: {}", r,);
|
|
||||||
free(url as *mut libc::c_void);
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
outlk_clean_config(&mut outlk_ad);
|
|
||||||
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(url as *mut libc::c_void);
|
|
||||||
free(xml_raw as *mut libc::c_void);
|
|
||||||
outlk_clean_config(&mut outlk_ad);
|
|
||||||
Some(outlk_ad.out)
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn outlk_clean_config(mut outlk_ad: *mut outlk_autodiscover_t) {
|
|
||||||
for i in 0..6 {
|
|
||||||
free((*outlk_ad).config[i] as *mut libc::c_void);
|
|
||||||
(*outlk_ad).config[i] = 0 as *mut libc::c_char;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn outlk_autodiscover_text_cb<B: std::io::BufRead>(
|
|
||||||
event: &BytesText,
|
|
||||||
outlk_ad: &mut outlk_autodiscover_t,
|
|
||||||
reader: &quick_xml::Reader<B>,
|
|
||||||
) {
|
|
||||||
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
free(outlk_ad.config[outlk_ad.tag_config as usize].cast());
|
|
||||||
outlk_ad.config[outlk_ad.tag_config as usize] = val.trim().strdup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe fn outlk_autodiscover_endtag_cb(event: &BytesEnd, outlk_ad: &mut outlk_autodiscover_t) {
|
|
||||||
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
|
||||||
|
|
||||||
if tag == "protocol" {
|
|
||||||
if !outlk_ad.config[1].is_null() {
|
|
||||||
let port = dc_atoi_null_is_0(outlk_ad.config[3]);
|
|
||||||
let ssl_on = (!outlk_ad.config[4].is_null()
|
|
||||||
&& strcasecmp(
|
|
||||||
outlk_ad.config[4],
|
|
||||||
b"on\x00" as *const u8 as *const libc::c_char,
|
|
||||||
) == 0) as libc::c_int;
|
|
||||||
let ssl_off = (!outlk_ad.config[4].is_null()
|
|
||||||
&& strcasecmp(
|
|
||||||
outlk_ad.config[4],
|
|
||||||
b"off\x00" as *const u8 as *const libc::c_char,
|
|
||||||
) == 0) as libc::c_int;
|
|
||||||
if strcasecmp(
|
|
||||||
outlk_ad.config[1],
|
|
||||||
b"imap\x00" as *const u8 as *const libc::c_char,
|
|
||||||
) == 0
|
|
||||||
&& outlk_ad.out_imap_set == 0
|
|
||||||
{
|
|
||||||
outlk_ad.out.mail_server = to_string(outlk_ad.config[2]);
|
|
||||||
outlk_ad.out.mail_port = port;
|
|
||||||
if 0 != ssl_on {
|
|
||||||
outlk_ad.out.server_flags |= 0x200
|
|
||||||
} else if 0 != ssl_off {
|
|
||||||
outlk_ad.out.server_flags |= 0x400
|
|
||||||
}
|
|
||||||
outlk_ad.out_imap_set = 1
|
|
||||||
} else if strcasecmp(
|
|
||||||
outlk_ad.config[1usize],
|
|
||||||
b"smtp\x00" as *const u8 as *const libc::c_char,
|
|
||||||
) == 0
|
|
||||||
&& outlk_ad.out_smtp_set == 0
|
|
||||||
{
|
|
||||||
outlk_ad.out.send_server = to_string(outlk_ad.config[2]);
|
|
||||||
outlk_ad.out.send_port = port;
|
|
||||||
if 0 != ssl_on {
|
|
||||||
outlk_ad.out.server_flags |= 0x20000
|
|
||||||
} else if 0 != ssl_off {
|
|
||||||
outlk_ad.out.server_flags |= 0x40000
|
|
||||||
}
|
|
||||||
outlk_ad.out_smtp_set = 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
outlk_clean_config(outlk_ad);
|
|
||||||
}
|
|
||||||
outlk_ad.tag_config = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn outlk_autodiscover_starttag_cb(event: &BytesStart, outlk_ad: &mut outlk_autodiscover_t) {
|
|
||||||
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
|
||||||
|
|
||||||
if tag == "protocol" {
|
|
||||||
unsafe { outlk_clean_config(outlk_ad) };
|
|
||||||
} else if tag == "type" {
|
|
||||||
outlk_ad.tag_config = 1
|
|
||||||
} else if tag == "server" {
|
|
||||||
outlk_ad.tag_config = 2
|
|
||||||
} else if tag == "port" {
|
|
||||||
outlk_ad.tag_config = 3
|
|
||||||
} else if tag == "ssl" {
|
|
||||||
outlk_ad.tag_config = 4
|
|
||||||
} else if tag == "redirecturl" {
|
|
||||||
outlk_ad.tag_config = 5
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn dc_alloc_ongoing(context: &Context) -> libc::c_int {
|
pub unsafe fn dc_alloc_ongoing(context: &Context) -> libc::c_int {
|
||||||
if 0 != dc_has_ongoing(context) {
|
if 0 != dc_has_ongoing(context) {
|
||||||
warn!(
|
warn!(
|
||||||
@@ -1139,3 +694,20 @@ pub fn dc_connect_to_configured_imap(context: &Context, imap: &Imap) -> libc::c_
|
|||||||
|
|
||||||
ret_connected
|
ret_connected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn read_autoconf_file(context: &Context, url: *const libc::c_char) -> *mut libc::c_char {
|
||||||
|
info!(context, 0, "Testing {} ...", to_string(url));
|
||||||
|
|
||||||
|
match reqwest::Client::new()
|
||||||
|
.get(as_str(url))
|
||||||
|
.send()
|
||||||
|
.and_then(|mut res| res.text())
|
||||||
|
{
|
||||||
|
Ok(res) => unsafe { res.strdup() },
|
||||||
|
Err(_err) => {
|
||||||
|
info!(context, 0, "Can\'t read file.",);
|
||||||
|
|
||||||
|
std::ptr::null_mut()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -128,7 +128,7 @@ pub const DC_CREATE_MVBOX: usize = 1;
|
|||||||
// via dc_set_config() using the key "server_flags".
|
// via dc_set_config() using the key "server_flags".
|
||||||
|
|
||||||
/// Force OAuth2 authorization. This flag does not skip automatic configuration.
|
/// Force OAuth2 authorization. This flag does not skip automatic configuration.
|
||||||
/// Before calling dc_configure() with DC_LP_AUTH_OAUTH2 set,
|
/// Before calling configure() with DC_LP_AUTH_OAUTH2 set,
|
||||||
/// the user has to confirm access at the URL returned by dc_get_oauth2_url().
|
/// the user has to confirm access at the URL returned by dc_get_oauth2_url().
|
||||||
pub const DC_LP_AUTH_OAUTH2: usize = 0x2;
|
pub const DC_LP_AUTH_OAUTH2: usize = 0x2;
|
||||||
|
|
||||||
@@ -282,7 +282,7 @@ pub enum Event {
|
|||||||
/// As most things are asynchronous, things may go wrong at any time and the user
|
/// As most things are asynchronous, things may go wrong at any time and the user
|
||||||
/// should not be disturbed by a dialog or so. Instead, use a bubble or so.
|
/// should not be disturbed by a dialog or so. Instead, use a bubble or so.
|
||||||
///
|
///
|
||||||
/// However, for ongoing processes (eg. dc_configure())
|
/// However, for ongoing processes (eg. configure())
|
||||||
/// or for functions that are expected to fail (eg. dc_continue_key_transfer())
|
/// or for functions that are expected to fail (eg. dc_continue_key_transfer())
|
||||||
/// it might be better to delay showing these events until the function has really
|
/// it might be better to delay showing these events until the function has really
|
||||||
/// failed (returned false). It should be sufficient to report only the _last_ error
|
/// failed (returned false). It should be sufficient to report only the _last_ error
|
||||||
@@ -400,7 +400,7 @@ pub enum Event {
|
|||||||
/// @return 0
|
/// @return 0
|
||||||
LOCATION_CHANGED = 2035,
|
LOCATION_CHANGED = 2035,
|
||||||
|
|
||||||
/// Inform about the configuration progress started by dc_configure().
|
/// Inform about the configuration progress started by configure().
|
||||||
///
|
///
|
||||||
/// @param data1 (int) 0=error, 1-999=progress in permille, 1000=success and done
|
/// @param data1 (int) 0=error, 1-999=progress in permille, 1000=success and done
|
||||||
/// @param data2 0
|
/// @param data2 0
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ use rand::{thread_rng, Rng};
|
|||||||
|
|
||||||
use crate::chat;
|
use crate::chat;
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
use crate::configure::*;
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::dc_configure::*;
|
|
||||||
use crate::dc_e2ee::*;
|
use crate::dc_e2ee::*;
|
||||||
use crate::dc_tools::*;
|
use crate::dc_tools::*;
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
|
|||||||
|
|
||||||
use crate::aheader::EncryptPreference;
|
use crate::aheader::EncryptPreference;
|
||||||
use crate::chat::{self, Chat};
|
use crate::chat::{self, Chat};
|
||||||
|
use crate::configure::*;
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
use crate::contact::*;
|
use crate::contact::*;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::dc_configure::*;
|
|
||||||
use crate::dc_e2ee::*;
|
use crate::dc_e2ee::*;
|
||||||
use crate::dc_mimeparser::*;
|
use crate::dc_mimeparser::*;
|
||||||
use crate::dc_token::*;
|
use crate::dc_token::*;
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ use deltachat_derive::{FromSql, ToSql};
|
|||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
use crate::chat;
|
use crate::chat;
|
||||||
|
use crate::configure::*;
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::dc_configure::*;
|
|
||||||
use crate::dc_imex::*;
|
use crate::dc_imex::*;
|
||||||
use crate::dc_location::*;
|
use crate::dc_location::*;
|
||||||
use crate::dc_loginparam::*;
|
use crate::dc_loginparam::*;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::sync::{Arc, Condvar, Mutex};
|
use std::sync::{Arc, Condvar, Mutex};
|
||||||
|
|
||||||
|
use crate::configure::*;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::dc_configure::*;
|
|
||||||
use crate::imap::Imap;
|
use crate::imap::Imap;
|
||||||
|
|
||||||
pub struct JobThread {
|
pub struct JobThread {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ mod aheader;
|
|||||||
pub mod chat;
|
pub mod chat;
|
||||||
pub mod chatlist;
|
pub mod chatlist;
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
pub mod configure;
|
||||||
pub mod constants;
|
pub mod constants;
|
||||||
pub mod contact;
|
pub mod contact;
|
||||||
pub mod context;
|
pub mod context;
|
||||||
@@ -48,7 +49,6 @@ pub mod types;
|
|||||||
pub mod x;
|
pub mod x;
|
||||||
|
|
||||||
pub mod dc_array;
|
pub mod dc_array;
|
||||||
pub mod dc_configure;
|
|
||||||
mod dc_dehtml;
|
mod dc_dehtml;
|
||||||
mod dc_e2ee;
|
mod dc_e2ee;
|
||||||
pub mod dc_imex;
|
pub mod dc_imex;
|
||||||
|
|||||||
Reference in New Issue
Block a user