diff --git a/CHANGELOG.md b/CHANGELOG.md index 8edd9f065..9db270c67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Validate signatures in try_decrypt() even if the message isn't encrypted #3859 - Don't parse the message again after detached signatures validation #3862 - Move format=flowed support to a separate crate #3869 +- cargo: bump quick-xml from 0.23.0 to 0.26.0 #3722 ### API-Changes - jsonrpc: add python API for webxdc updates #3872 diff --git a/Cargo.lock b/Cargo.lock index 198ae37eb..33f9f9eda 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2739,9 +2739,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.23.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9279fbdacaad3baf559d8cabe0acc3d06e30ea14931af31af79578ac0946decc" +checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 9fbd387e3..a76e6d5c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ once_cell = "1.16.0" percent-encoding = "2.2" pgp = { version = "0.9", default-features = false } pretty_env_logger = { version = "0.4", optional = true } -quick-xml = "0.23" +quick-xml = "0.26" r2d2 = "0.8" r2d2_sqlite = "0.20" rand = "0.8" diff --git a/src/configure/auto_mozilla.rs b/src/configure/auto_mozilla.rs index bc7b69712..2f5ca45b2 100644 --- a/src/configure/auto_mozilla.rs +++ b/src/configure/auto_mozilla.rs @@ -62,7 +62,7 @@ fn parse_server( reader: &mut quick_xml::Reader, server_event: &BytesStart, ) -> Result, quick_xml::Error> { - let end_tag = String::from_utf8_lossy(server_event.name()) + let end_tag = String::from_utf8_lossy(server_event.name().as_ref()) .trim() .to_lowercase(); @@ -70,12 +70,17 @@ fn parse_server( .attributes() .find(|attr| { attr.as_ref() - .map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "type") + .map(|a| { + String::from_utf8_lossy(a.key.as_ref()) + .trim() + .to_lowercase() + == "type" + }) .unwrap_or_default() }) .map(|typ| { typ.unwrap() - .unescape_and_decode_value(reader) + .decode_and_unescape_value(reader) .unwrap_or_default() .to_lowercase() }) @@ -89,25 +94,23 @@ fn parse_server( let mut tag_config = MozConfigTag::Undefined; let mut buf = Vec::new(); loop { - match reader.read_event(&mut buf)? { + match reader.read_event_into(&mut buf)? { Event::Start(ref event) => { - tag_config = String::from_utf8_lossy(event.name()) + tag_config = String::from_utf8_lossy(event.name().as_ref()) .parse() .unwrap_or_default(); } Event::End(ref event) => { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); if tag == end_tag { break; } } Event::Text(ref event) => { - let val = event - .unescape_and_decode(reader) - .unwrap_or_default() - .trim() - .to_owned(); + let val = event.unescape().unwrap_or_default().trim().to_owned(); match tag_config { MozConfigTag::Hostname => hostname = Some(val), @@ -150,9 +153,11 @@ fn parse_xml_reader( let mut buf = Vec::new(); loop { - match reader.read_event(&mut buf)? { + match reader.read_event_into(&mut buf)? { Event::Start(ref event) => { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); if tag == "incomingserver" { if let Some(incoming_server) = parse_server(reader, event)? { diff --git a/src/configure/auto_outlook.rs b/src/configure/auto_outlook.rs index 0be2f520a..d374f7016 100644 --- a/src/configure/auto_outlook.rs +++ b/src/configure/auto_outlook.rs @@ -59,12 +59,18 @@ fn parse_protocol( let mut current_tag: Option = None; loop { - match reader.read_event(&mut buf)? { + match reader.read_event_into(&mut buf)? { Event::Start(ref event) => { - current_tag = Some(String::from_utf8_lossy(event.name()).trim().to_lowercase()); + current_tag = Some( + String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(), + ); } Event::End(ref event) => { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); if tag == "protocol" { break; } @@ -73,7 +79,7 @@ fn parse_protocol( } } Event::Text(ref e) => { - let val = e.unescape_and_decode(reader).unwrap_or_default(); + let val = e.unescape().unwrap_or_default(); if let Some(ref tag) = current_tag { match tag.as_str() { @@ -115,9 +121,9 @@ fn parse_redirecturl( reader: &mut quick_xml::Reader, ) -> Result { let mut buf = Vec::new(); - match reader.read_event(&mut buf)? { + match reader.read_event_into(&mut buf)? { Event::Text(ref e) => { - let val = e.unescape_and_decode(reader).unwrap_or_default(); + let val = e.unescape().unwrap_or_default(); Ok(val.trim().to_string()) } _ => Ok("".to_string()), @@ -131,9 +137,11 @@ fn parse_xml_reader( let mut buf = Vec::new(); loop { - match reader.read_event(&mut buf)? { + match reader.read_event_into(&mut buf)? { Event::Start(ref e) => { - let tag = String::from_utf8_lossy(e.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(e.name().as_ref()) + .trim() + .to_lowercase(); if tag == "protocol" { if let Some(protocol) = parse_protocol(reader)? { diff --git a/src/dehtml.rs b/src/dehtml.rs index 20075dbab..30c96e366 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -88,18 +88,30 @@ fn dehtml_quick_xml(buf: &str) -> String { let mut buf = Vec::new(); loop { - match reader.read_event(&mut buf) { + match reader.read_event_into(&mut buf) { Ok(quick_xml::events::Event::Start(ref e)) => { dehtml_starttag_cb(e, &mut dehtml, &reader) } Ok(quick_xml::events::Event::End(ref e)) => dehtml_endtag_cb(e, &mut dehtml), Ok(quick_xml::events::Event::Text(ref e)) => dehtml_text_cb(e, &mut dehtml), - Ok(quick_xml::events::Event::CData(e)) => dehtml_text_cb(&e.escape(), &mut dehtml), + Ok(quick_xml::events::Event::CData(e)) => match e.escape() { + Ok(e) => dehtml_text_cb(&e, &mut dehtml), + Err(e) => { + eprintln!( + "CDATA escape error at position {}: {:?}", + reader.buffer_position(), + e, + ); + } + }, Ok(quick_xml::events::Event::Empty(ref e)) => { // Handle empty tags as a start tag immediately followed by end tag. // For example, `

` is treated as `

`. dehtml_starttag_cb(e, &mut dehtml, &reader); - dehtml_endtag_cb(&BytesEnd::borrowed(e.name()), &mut dehtml); + dehtml_endtag_cb( + &BytesEnd::new(String::from_utf8_lossy(e.name().as_ref())), + &mut dehtml, + ); } Err(e) => { eprintln!( @@ -121,7 +133,7 @@ fn dehtml_text_cb(event: &BytesText, dehtml: &mut Dehtml) { if dehtml.get_add_text() == AddText::YesPreserveLineEnds || dehtml.get_add_text() == AddText::YesRemoveLineEnds { - let last_added = escaper::decode_html_buf_sloppy(event.escaped()).unwrap_or_default(); + let last_added = escaper::decode_html_buf_sloppy(event as &[_]).unwrap_or_default(); if dehtml.get_add_text() == AddText::YesRemoveLineEnds { dehtml.strbuilder += LINE_RE.replace_all(&last_added, "\r").as_ref(); @@ -135,7 +147,9 @@ fn dehtml_text_cb(event: &BytesText, dehtml: &mut Dehtml) { } fn dehtml_endtag_cb(event: &BytesEnd, dehtml: &mut Dehtml) { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); match tag.as_str() { "p" | "table" | "td" | "style" | "script" | "title" | "pre" => { @@ -176,7 +190,9 @@ fn dehtml_starttag_cb( dehtml: &mut Dehtml, reader: &quick_xml::Reader, ) { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); match tag.as_str() { "p" | "table" | "td" => { @@ -206,10 +222,15 @@ fn dehtml_starttag_cb( if let Some(href) = event .html_attributes() .filter_map(|attr| attr.ok()) - .find(|attr| String::from_utf8_lossy(attr.key).trim().to_lowercase() == "href") + .find(|attr| { + String::from_utf8_lossy(attr.key.as_ref()) + .trim() + .to_lowercase() + == "href" + }) { let href = href - .unescape_and_decode_value(reader) + .decode_and_unescape_value(reader) .unwrap_or_default() .to_lowercase(); @@ -258,7 +279,7 @@ fn maybe_push_tag( fn tag_contains_attr(event: &BytesStart, reader: &Reader, name: &str) -> bool { event.attributes().any(|r| { r.map(|a| { - a.unescape_and_decode_value(reader) + a.decode_and_unescape_value(reader) .map(|v| v == name) .unwrap_or(false) }) diff --git a/src/location.rs b/src/location.rs index 9e83ebd7b..bff558912 100644 --- a/src/location.rs +++ b/src/location.rs @@ -109,7 +109,7 @@ impl Kml { let mut buf = Vec::new(); loop { - match reader.read_event(&mut buf).with_context(|| { + match reader.read_event_into(&mut buf).with_context(|| { format!( "location parsing error at position {}", reader.buffer_position() @@ -117,7 +117,7 @@ impl Kml { })? { quick_xml::events::Event::Start(ref e) => kml.starttag_cb(e, &reader), quick_xml::events::Event::End(ref e) => kml.endtag_cb(e), - quick_xml::events::Event::Text(ref e) => kml.text_cb(e, &reader), + quick_xml::events::Event::Text(ref e) => kml.text_cb(e), quick_xml::events::Event::Eof => break, _ => (), } @@ -127,9 +127,9 @@ impl Kml { Ok(kml) } - fn text_cb(&mut self, event: &BytesText, reader: &quick_xml::Reader) { + fn text_cb(&mut self, event: &BytesText) { if self.tag.contains(KmlTag::WHEN) || self.tag.contains(KmlTag::COORDINATES) { - let val = event.unescape_and_decode(reader).unwrap_or_default(); + let val = event.unescape().unwrap_or_default(); let val = val.replace(['\n', '\r', '\t', ' '], ""); @@ -158,7 +158,9 @@ impl Kml { } fn endtag_cb(&mut self, event: &BytesEnd) { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); if tag == "placemark" { if self.tag.contains(KmlTag::PLACEMARK) @@ -178,14 +180,20 @@ impl Kml { event: &BytesStart, reader: &quick_xml::Reader, ) { - let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase(); + let tag = String::from_utf8_lossy(event.name().as_ref()) + .trim() + .to_lowercase(); if tag == "document" { - if let Some(addr) = event - .attributes() - .filter_map(|a| a.ok()) - .find(|attr| String::from_utf8_lossy(attr.key).trim().to_lowercase() == "addr") - { - self.addr = addr.unescape_and_decode_value(reader).ok(); + if let Some(addr) = event.attributes().filter_map(|a| a.ok()).find(|attr| { + String::from_utf8_lossy(attr.key.as_ref()) + .trim() + .to_lowercase() + == "addr" + }) { + self.addr = addr + .decode_and_unescape_value(reader) + .ok() + .map(|a| a.into_owned()); } } else if tag == "placemark" { self.tag = KmlTag::PLACEMARK; @@ -203,12 +211,17 @@ impl Kml { self.tag = KmlTag::PLACEMARK | KmlTag::POINT | KmlTag::COORDINATES; if let Some(acc) = event.attributes().find(|attr| { attr.as_ref() - .map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "accuracy") + .map(|a| { + String::from_utf8_lossy(a.key.as_ref()) + .trim() + .to_lowercase() + == "accuracy" + }) .unwrap_or_default() }) { let v = acc .unwrap() - .unescape_and_decode_value(reader) + .decode_and_unescape_value(reader) .unwrap_or_default(); self.curr.accuracy = v.trim().parse().unwrap_or_default();