mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 22:36:30 +03:00
ci: update Rust to 1.95.0
This commit is contained in:
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -20,7 +20,7 @@ permissions: {}
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
RUSTFLAGS: -Dwarnings
|
RUSTFLAGS: -Dwarnings
|
||||||
RUST_VERSION: 1.94.0
|
RUST_VERSION: 1.95.0
|
||||||
|
|
||||||
# Minimum Supported Rust Version
|
# Minimum Supported Rust Version
|
||||||
MSRV: 1.88.0
|
MSRV: 1.88.0
|
||||||
|
|||||||
@@ -1188,7 +1188,6 @@ SELECT id, rfc724_mid, pre_rfc724_mid, timestamp, ?, 1 FROM msgs WHERE chat_id=?
|
|||||||
/// prefer plaintext emails.
|
/// prefer plaintext emails.
|
||||||
///
|
///
|
||||||
/// To get more verbose summary for a contact, including its key fingerprint, use [`Contact::get_encrinfo`].
|
/// To get more verbose summary for a contact, including its key fingerprint, use [`Contact::get_encrinfo`].
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub async fn get_encryption_info(self, context: &Context) -> Result<String> {
|
pub async fn get_encryption_info(self, context: &Context) -> Result<String> {
|
||||||
let chat = Chat::load_from_db(context, self).await?;
|
let chat = Chat::load_from_db(context, self).await?;
|
||||||
if !chat.is_encrypted(context).await? {
|
if !chat.is_encrypted(context).await? {
|
||||||
@@ -1752,7 +1751,6 @@ impl Chat {
|
|||||||
///
|
///
|
||||||
/// If `update_msg_id` is set, that record is reused;
|
/// If `update_msg_id` is set, that record is reused;
|
||||||
/// if `update_msg_id` is None, a new record is created.
|
/// if `update_msg_id` is None, a new record is created.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
async fn prepare_msg_raw(
|
async fn prepare_msg_raw(
|
||||||
&mut self,
|
&mut self,
|
||||||
context: &Context,
|
context: &Context,
|
||||||
@@ -3023,7 +3021,6 @@ pub async fn send_text_msg(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Sends chat members a request to edit the given message's text.
|
/// Sends chat members a request to edit the given message's text.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub async fn send_edit_request(context: &Context, msg_id: MsgId, new_text: String) -> Result<()> {
|
pub async fn send_edit_request(context: &Context, msg_id: MsgId, new_text: String) -> Result<()> {
|
||||||
let mut original_msg = Message::load_from_db(context, msg_id).await?;
|
let mut original_msg = Message::load_from_db(context, msg_id).await?;
|
||||||
ensure!(
|
ensure!(
|
||||||
@@ -4612,7 +4609,6 @@ pub async fn save_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> {
|
|||||||
/// the copy contains a reference to the original message
|
/// the copy contains a reference to the original message
|
||||||
/// as well as to the original chat in case the original message gets deleted.
|
/// as well as to the original chat in case the original message gets deleted.
|
||||||
/// Returns data needed to add a `SaveMessage` sync item.
|
/// Returns data needed to add a `SaveMessage` sync item.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub(crate) async fn save_copy_in_self_talk(
|
pub(crate) async fn save_copy_in_self_talk(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
src_msg_id: MsgId,
|
src_msg_id: MsgId,
|
||||||
|
|||||||
@@ -2068,7 +2068,6 @@ pub(crate) async fn mark_contact_id_as_verified(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn cat_fingerprint(ret: &mut String, name: &str, addr: &str, fingerprint: &str) {
|
fn cat_fingerprint(ret: &mut String, name: &str, addr: &str, fingerprint: &str) {
|
||||||
*ret += &format!("\n\n{name} ({addr}):\n{fingerprint}");
|
*ret += &format!("\n\n{name} ({addr}):\n{fingerprint}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,13 +89,9 @@ mod test_chatlist_events {
|
|||||||
.get_matching(|evt| match evt {
|
.get_matching(|evt| match evt {
|
||||||
EventType::ChatlistItemChanged {
|
EventType::ChatlistItemChanged {
|
||||||
chat_id: Some(ev_chat_id),
|
chat_id: Some(ev_chat_id),
|
||||||
} => {
|
} if ev_chat_id == &chat_id => {
|
||||||
if ev_chat_id == &chat_id {
|
first_event_is_item.store(true, Ordering::Relaxed);
|
||||||
first_event_is_item.store(true, Ordering::Relaxed);
|
true
|
||||||
true
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EventType::ChatlistChanged => true,
|
EventType::ChatlistChanged => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
|
|||||||
@@ -86,7 +86,6 @@ impl HtmlMsgParser {
|
|||||||
/// Function takes a raw mime-message string,
|
/// Function takes a raw mime-message string,
|
||||||
/// searches for the main-text part
|
/// searches for the main-text part
|
||||||
/// and returns that as parser.html
|
/// and returns that as parser.html
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub fn from_bytes<'a>(
|
pub fn from_bytes<'a>(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
rawmime: &'a [u8],
|
rawmime: &'a [u8],
|
||||||
@@ -120,7 +119,6 @@ impl HtmlMsgParser {
|
|||||||
/// Usually, there is at most one plain-text and one HTML-text part,
|
/// Usually, there is at most one plain-text and one HTML-text part,
|
||||||
/// multiple plain-text parts might be used for mailinglist-footers,
|
/// multiple plain-text parts might be used for mailinglist-footers,
|
||||||
/// therefore we use the first one.
|
/// therefore we use the first one.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn collect_texts_recursive<'a>(
|
fn collect_texts_recursive<'a>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
context: &'a Context,
|
context: &'a Context,
|
||||||
|
|||||||
@@ -199,7 +199,6 @@ SELECT ?1, rfc724_mid, pre_rfc724_mid, timestamp, ?, ? FROM msgs WHERE id=?1
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns detailed message information in a multi-line text form.
|
/// Returns detailed message information in a multi-line text form.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub async fn get_info(self, context: &Context) -> Result<String> {
|
pub async fn get_info(self, context: &Context) -> Result<String> {
|
||||||
let msg = Message::load_from_db(context, self).await?;
|
let msg = Message::load_from_db(context, self).await?;
|
||||||
|
|
||||||
@@ -825,7 +824,6 @@ impl Message {
|
|||||||
///
|
///
|
||||||
/// Currently this includes `additional_text`, but this may change in future, when the UIs show
|
/// Currently this includes `additional_text`, but this may change in future, when the UIs show
|
||||||
/// the necessary info themselves.
|
/// the necessary info themselves.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub fn get_text(&self) -> String {
|
pub fn get_text(&self) -> String {
|
||||||
self.text.clone() + &self.additional_text
|
self.text.clone() + &self.additional_text
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1887,7 +1887,6 @@ impl MimeFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render an MDN
|
/// Render an MDN
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn render_mdn(&mut self) -> Result<MimePart<'static>> {
|
fn render_mdn(&mut self) -> Result<MimePart<'static>> {
|
||||||
// RFC 6522, this also requires the `report-type` parameter which is equal
|
// RFC 6522, this also requires the `report-type` parameter which is equal
|
||||||
// to the MIME subtype of the second body part of the multipart/report
|
// to the MIME subtype of the second body part of the multipart/report
|
||||||
|
|||||||
@@ -269,7 +269,6 @@ impl MimeMessage {
|
|||||||
///
|
///
|
||||||
/// This method has some side-effects,
|
/// This method has some side-effects,
|
||||||
/// such as saving blobs and saving found public keys to the database.
|
/// such as saving blobs and saving found public keys to the database.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub(crate) async fn from_bytes(context: &Context, body: &[u8]) -> Result<Self> {
|
pub(crate) async fn from_bytes(context: &Context, body: &[u8]) -> Result<Self> {
|
||||||
let mail = mailparse::parse_mail(body)?;
|
let mail = mailparse::parse_mail(body)?;
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,6 @@ pub enum ProxyConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs HTTP/1.1 `CONNECT` request for HTTP(S) proxy.
|
/// Constructs HTTP/1.1 `CONNECT` request for HTTP(S) proxy.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn http_connect_request(host: &str, port: u16, auth: Option<(&str, &str)>) -> String {
|
fn http_connect_request(host: &str, port: u16, auth: Option<(&str, &str)>) -> String {
|
||||||
// According to <https://datatracker.ietf.org/doc/html/rfc7230#section-5.4>
|
// According to <https://datatracker.ietf.org/doc/html/rfc7230#section-5.4>
|
||||||
// clients MUST send `Host:` header in HTTP/1.1 requests,
|
// clients MUST send `Host:` header in HTTP/1.1 requests,
|
||||||
@@ -320,7 +319,6 @@ impl ProxyConfig {
|
|||||||
/// config into `proxy_url` if `proxy_url` is unset or empty.
|
/// config into `proxy_url` if `proxy_url` is unset or empty.
|
||||||
///
|
///
|
||||||
/// Unsets `socks5_host`, `socks5_port`, `socks5_user` and `socks5_password` in any case.
|
/// Unsets `socks5_host`, `socks5_port`, `socks5_user` and `socks5_password` in any case.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
async fn migrate_socks_config(sql: &Sql) -> Result<()> {
|
async fn migrate_socks_config(sql: &Sql) -> Result<()> {
|
||||||
if sql.get_raw_config("proxy_url").await?.is_none() {
|
if sql.get_raw_config("proxy_url").await?.is_none() {
|
||||||
// Load legacy SOCKS5 settings.
|
// Load legacy SOCKS5 settings.
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ pub struct PlainText {
|
|||||||
impl PlainText {
|
impl PlainText {
|
||||||
/// Convert plain text to HTML.
|
/// Convert plain text to HTML.
|
||||||
/// The function handles quotes, links, fixed and floating text paragraphs.
|
/// The function handles quotes, links, fixed and floating text paragraphs.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub fn to_html(&self) -> String {
|
pub fn to_html(&self) -> String {
|
||||||
static LINKIFY_MAIL_RE: LazyLock<regex::Regex> =
|
static LINKIFY_MAIL_RE: LazyLock<regex::Regex> =
|
||||||
LazyLock::new(|| regex::Regex::new(r"\b([\w.\-+]+@[\w.\-]+)\b").unwrap());
|
LazyLock::new(|| regex::Regex::new(r"\b([\w.\-+]+@[\w.\-]+)\b").unwrap());
|
||||||
|
|||||||
@@ -714,7 +714,6 @@ fn decode_account(qr: &str) -> Result<Qr> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// scheme: `https://t.me/socks?server=foo&port=123` or `https://t.me/socks?server=1.2.3.4&port=123`
|
/// scheme: `https://t.me/socks?server=foo&port=123` or `https://t.me/socks?server=1.2.3.4&port=123`
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn decode_tg_socks_proxy(_context: &Context, qr: &str) -> Result<Qr> {
|
fn decode_tg_socks_proxy(_context: &Context, qr: &str) -> Result<Qr> {
|
||||||
let url = url::Url::parse(qr).context("Invalid t.me/socks url")?;
|
let url = url::Url::parse(qr).context("Invalid t.me/socks url")?;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ use crate::securejoin;
|
|||||||
use crate::stock_str::{self, backup_transfer_qr};
|
use crate::stock_str::{self, backup_transfer_qr};
|
||||||
|
|
||||||
/// Create a QR code from any input data.
|
/// Create a QR code from any input data.
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub fn create_qr_svg(qrcode_content: &str) -> Result<String> {
|
pub fn create_qr_svg(qrcode_content: &str) -> Result<String> {
|
||||||
let all_size = 512.0;
|
let all_size = 512.0;
|
||||||
let qr_code_size = 416.0;
|
let qr_code_size = 416.0;
|
||||||
@@ -176,7 +175,6 @@ async fn self_info(context: &Context) -> Result<(Option<Vec<u8>>, String, String
|
|||||||
Ok((avatar, displayname, addr, color))
|
Ok((avatar, displayname, addr, color))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
fn inner_generate_secure_join_qr_code(
|
fn inner_generate_secure_join_qr_code(
|
||||||
qrcode_description: &str,
|
qrcode_description: &str,
|
||||||
qrcode_content: &str,
|
qrcode_content: &str,
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ use crate::tools::IsNoneOrEmpty;
|
|||||||
/// This escapes a bit more than actually needed by delta (e.g. also lines as "-- footer"),
|
/// This escapes a bit more than actually needed by delta (e.g. also lines as "-- footer"),
|
||||||
/// but for non-delta-compatibility, that seems to be better.
|
/// but for non-delta-compatibility, that seems to be better.
|
||||||
/// (to be only compatible with delta, only "[\r\n|\n]-- {0,2}[\r\n|\n]" needs to be replaced)
|
/// (to be only compatible with delta, only "[\r\n|\n]-- {0,2}[\r\n|\n]" needs to be replaced)
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub fn escape_message_footer_marks(text: &str) -> String {
|
pub fn escape_message_footer_marks(text: &str) -> String {
|
||||||
if let Some(text) = text.strip_prefix("--") {
|
if let Some(text) = text.strip_prefix("--") {
|
||||||
"-\u{200B}-".to_string() + &text.replace("\n--", "\n-\u{200B}-")
|
"-\u{200B}-".to_string() + &text.replace("\n--", "\n-\u{200B}-")
|
||||||
|
|||||||
@@ -687,7 +687,6 @@ fn extract_address_from_receive_header<'a>(header: &'a str, start: &str) -> Opti
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[expect(clippy::arithmetic_side_effects)]
|
|
||||||
pub(crate) fn parse_receive_header(header: &str) -> String {
|
pub(crate) fn parse_receive_header(header: &str) -> String {
|
||||||
let header = header.replace(&['\r', '\n'][..], "");
|
let header = header.replace(&['\r', '\n'][..], "");
|
||||||
let mut hop_info = String::from("Hop: ");
|
let mut hop_info = String::from("Hop: ");
|
||||||
|
|||||||
Reference in New Issue
Block a user