melib: encode header values

closes #102
embed
Manos Pitsidianakis 2019-04-14 23:05:29 +03:00
parent f348cc9a55
commit 499113acd2
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
3 changed files with 47 additions and 5 deletions

View File

@ -203,12 +203,36 @@ impl Draft {
Ok(ret)
}
pub fn finalise(self) -> Result<String> {
pub fn finalise(mut self) -> Result<String> {
let mut ret = String::new();
if self.headers.contains_key("From") && !self.headers.contains_key("Message-ID") {
if let super::parser::IResult::Done(_, addr) =
super::parser::mailbox(self.headers["From"].as_bytes())
{
if let Some(fqdn) = addr.get_fqdn() {
if self
.headers
.insert("Message-ID".into(), random::gen_message_id(&fqdn))
.is_none()
{
let pos = self
.header_order
.iter()
.position(|h| h == "Subject")
.unwrap();
self.header_order.insert(pos, "Message-ID".into());
}
}
}
}
for k in &self.header_order {
let v = &self.headers[k];
ret.extend(format!("{}: {}\n", k, v).chars());
if v.is_ascii() {
ret.extend(format!("{}: {}\n", k, v).chars());
} else {
ret.extend(format!("{}: {}\n", k, mime::encode_header(v)).chars());
}
}
ret.push_str("MIME-Version: 1.0\n");

View File

@ -1 +1,18 @@
//use super::*;
use super::*;
pub fn encode_header(value: &str) -> String {
eprintln!("encoding \"{}\"", value);
let mut ret = String::with_capacity(5 / 3 * value.len());
for word in value.split_whitespace() {
if word.is_ascii() {
ret.push_str(word);
} else {
ret.push_str(
format!("=?UTF-8?B?{}?=", BASE64_MIME.encode(word.as_bytes()).trim()).as_str(),
);
}
ret.push(' ');
}
ret.pop();
ret
}

View File

@ -503,7 +503,7 @@ impl Component for Composer {
if let Err(e) = account.save_draft(draft) {
if cfg!(debug_assertions) {
eprint!("{}:{}_{}: ", file!(), line!(), column!());
eprintln!("{:?} could not save draft", e);
eprintln!("{:?} could not save draft", e);
}
context.replies.push_back(UIEvent::Notification(
Some("Could not save draft.".into()),
@ -547,6 +547,7 @@ eprintln!("{:?} could not save draft", e);
.expect("Failed to start mailer command");
{
let mut stdin = msmtp.stdin.as_mut().expect("failed to open stdin");
self.update_draft();
let draft = self.draft.clone().finalise().unwrap();
stdin
.write_all(draft.as_bytes())
@ -560,7 +561,7 @@ eprintln!("{:?} could not save draft", e);
) {
if cfg!(debug_assertions) {
eprint!("{}:{}_{}: ", file!(), line!(), column!());
eprintln!("{:?} could not save sent msg", e);
eprintln!("{:?} could not save sent msg", e);
}
context.replies.push_back(UIEvent::Notification(
Some("Could not save in 'Sent' folder.".into()),