Compare commits

..

4 Commits

Author SHA1 Message Date
94d70cd259 chore(deps): lock file maintenance
Some checks failed
Continuous integration / Check (push) Has been cancelled
Continuous integration / Test Suite (push) Has been cancelled
Continuous integration / Trunk (push) Has been cancelled
Continuous integration / Rustfmt (push) Has been cancelled
Continuous integration / build (push) Has been cancelled
Continuous integration / Disallow unused dependencies (push) Has been cancelled
2025-08-22 00:02:34 +00:00
0140fa5efe chore: Release
Some checks failed
Continuous integration / Check (push) Successful in 52s
Continuous integration / Test Suite (push) Successful in 1m9s
Continuous integration / Trunk (push) Successful in 58s
Continuous integration / Rustfmt (push) Failing after 38s
Continuous integration / build (push) Successful in 1m36s
Continuous integration / Disallow unused dependencies (push) Failing after 2m16s
2025-08-21 16:47:03 -07:00
832b322b77 web: much more compact read mail headers 2025-08-21 16:45:35 -07:00
66dbcf2cfd server: style tweak for tls_report summary 2025-08-21 11:21:10 -07:00
7 changed files with 126 additions and 114 deletions

106
Cargo.lock generated
View File

@ -854,7 +854,7 @@ dependencies = [
"rusoto_s3 0.48.0",
"serde",
"sqlx",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tracing",
"urlencoding",
@ -906,7 +906,7 @@ dependencies = [
"semver 1.0.26",
"serde",
"serde_json",
"thiserror 2.0.15",
"thiserror 2.0.16",
]
[[package]]
@ -1876,9 +1876,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "form_urlencoded"
version = "1.2.1"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
@ -2918,9 +2918,9 @@ dependencies = [
[[package]]
name = "icalendar"
version = "0.17.2"
version = "0.17.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "557f23d5e90d205464cfc9e2f3d7c117b0c3e963830a2a623aa8d69a186041a3"
checksum = "b0aece6c6edc66265bb0e797dbc9893d63115e448433505f3f685c02a43d0111"
dependencies = [
"chrono",
"iso8601",
@ -3023,9 +3023,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
version = "1.0.3"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
"idna_adapter",
"smallvec 1.15.1",
@ -3239,7 +3239,7 @@ dependencies = [
[[package]]
name = "letterbox-notmuch"
version = "0.17.36"
version = "0.17.37"
dependencies = [
"itertools",
"log",
@ -3248,32 +3248,32 @@ dependencies = [
"rayon",
"serde",
"serde_json",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tracing",
]
[[package]]
name = "letterbox-notmuch"
version = "0.17.36"
version = "0.17.37"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "01c3d8a5789032da625c854c019358c504dde49d08ff1261676d6e708de1cc88"
checksum = "5dedc9bde0d1f42696b25f607de426a1ca3c1dd1834fe259ba1b680ff46b74c7"
dependencies = [
"log",
"mailparse",
"serde",
"serde_json",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tracing",
]
[[package]]
name = "letterbox-procmail2notmuch"
version = "0.17.36"
version = "0.17.37"
dependencies = [
"anyhow",
"clap",
"letterbox-notmuch 0.17.36 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"letterbox-shared 0.17.36 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"letterbox-notmuch 0.17.37 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"letterbox-shared 0.17.37 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"serde",
"sqlx",
"tokio 1.47.1",
@ -3281,7 +3281,7 @@ dependencies = [
[[package]]
name = "letterbox-server"
version = "0.17.36"
version = "0.17.37"
dependencies = [
"ammonia",
"anyhow",
@ -3305,8 +3305,8 @@ dependencies = [
"html2text",
"ical",
"icalendar",
"letterbox-notmuch 0.17.36",
"letterbox-shared 0.17.36",
"letterbox-notmuch 0.17.37",
"letterbox-shared 0.17.37",
"linkify",
"lol_html",
"mailparse",
@ -3320,7 +3320,7 @@ dependencies = [
"serde_json",
"sqlx",
"tantivy",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tower-http",
"tracing",
@ -3332,10 +3332,10 @@ dependencies = [
[[package]]
name = "letterbox-shared"
version = "0.17.36"
version = "0.17.37"
dependencies = [
"build-info",
"letterbox-notmuch 0.17.36",
"letterbox-notmuch 0.17.37",
"regex",
"serde",
"sqlx",
@ -3345,12 +3345,12 @@ dependencies = [
[[package]]
name = "letterbox-shared"
version = "0.17.36"
version = "0.17.37"
source = "sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/"
checksum = "bef8e6e8a604f2c6c0d0d802ab4935051a830c5346cf8b573f246b7253ffc74a"
checksum = "be81d4db41b6b6e4fd63be488bece639f52e5f5ed1d7d49b09c554cf2263ee3b"
dependencies = [
"build-info",
"letterbox-notmuch 0.17.36 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"letterbox-notmuch 0.17.37 (sparse+https://git.z.xinu.tv/api/packages/wathiede/cargo/)",
"regex",
"serde",
"sqlx",
@ -3360,7 +3360,7 @@ dependencies = [
[[package]]
name = "letterbox-web"
version = "0.17.36"
version = "0.17.37"
dependencies = [
"build-info",
"build-info-build",
@ -3372,14 +3372,14 @@ dependencies = [
"graphql_client",
"human_format",
"itertools",
"letterbox-shared 0.17.36",
"letterbox-shared 0.17.37",
"log",
"seed",
"seed_hooks",
"serde",
"serde_json",
"strum_macros 0.27.2",
"thiserror 2.0.15",
"thiserror 2.0.16",
"uuid",
"wasm-bindgen",
"wasm-bindgen-test",
@ -3552,7 +3552,7 @@ dependencies = [
"mime",
"precomputed-hash",
"selectors 0.30.0",
"thiserror 2.0.15",
"thiserror 2.0.16",
]
[[package]]
@ -4163,7 +4163,7 @@ dependencies = [
"futures-sink",
"js-sys",
"pin-project-lite",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tracing",
]
@ -4195,7 +4195,7 @@ dependencies = [
"opentelemetry_sdk",
"prost",
"reqwest",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tonic",
"tracing",
@ -4227,7 +4227,7 @@ dependencies = [
"percent-encoding",
"rand 0.9.2",
"serde_json",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tokio-stream",
"tracing",
@ -4382,9 +4382,9 @@ dependencies = [
[[package]]
name = "percent-encoding"
version = "2.3.1"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pest"
@ -4393,7 +4393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
dependencies = [
"memchr",
"thiserror 2.0.15",
"thiserror 2.0.16",
"ucd-trie",
]
@ -4755,7 +4755,7 @@ dependencies = [
"rustc-hash",
"rustls",
"socket2 0.5.10",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tracing",
"web-time",
@ -4776,7 +4776,7 @@ dependencies = [
"rustls",
"rustls-pki-types",
"slab",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tinyvec",
"tracing",
"web-time",
@ -5935,7 +5935,7 @@ dependencies = [
"serde_json",
"sha2 0.10.9",
"smallvec 1.15.1",
"thiserror 2.0.15",
"thiserror 2.0.16",
"time 0.3.41",
"tokio 1.47.1",
"tokio-stream",
@ -6018,7 +6018,7 @@ dependencies = [
"smallvec 1.15.1",
"sqlx-core",
"stringprep",
"thiserror 2.0.15",
"thiserror 2.0.16",
"time 0.3.41",
"tracing",
"whoami",
@ -6056,7 +6056,7 @@ dependencies = [
"smallvec 1.15.1",
"sqlx-core",
"stringprep",
"thiserror 2.0.15",
"thiserror 2.0.16",
"time 0.3.41",
"tracing",
"whoami",
@ -6081,7 +6081,7 @@ dependencies = [
"serde",
"serde_urlencoded",
"sqlx-core",
"thiserror 2.0.15",
"thiserror 2.0.16",
"time 0.3.41",
"tracing",
"url",
@ -6311,7 +6311,7 @@ dependencies = [
"tantivy-stacker",
"tantivy-tokenizer-api",
"tempfile",
"thiserror 2.0.15",
"thiserror 2.0.16",
"time 0.3.41",
"uuid",
"winapi 0.3.9",
@ -6446,11 +6446,11 @@ dependencies = [
[[package]]
name = "thiserror"
version = "2.0.15"
version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850"
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
dependencies = [
"thiserror-impl 2.0.15",
"thiserror-impl 2.0.16",
]
[[package]]
@ -6466,9 +6466,9 @@ dependencies = [
[[package]]
name = "thiserror-impl"
version = "2.0.15"
version = "2.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0"
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
dependencies = [
"proc-macro2",
"quote",
@ -7143,7 +7143,7 @@ dependencies = [
"log",
"rand 0.9.2",
"sha1",
"thiserror 2.0.15",
"thiserror 2.0.16",
"utf-8",
]
@ -7230,9 +7230,9 @@ checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
[[package]]
name = "url"
version = "2.5.4"
version = "2.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
checksum = "137a3c834eaf7139b73688502f3f1141a0337c5d8e4d9b536f9b8c796e26a7c4"
dependencies = [
"form_urlencoded",
"idna",
@ -7934,7 +7934,7 @@ dependencies = [
"opentelemetry",
"opentelemetry-otlp",
"opentelemetry_sdk",
"thiserror 2.0.15",
"thiserror 2.0.16",
"tokio 1.47.1",
"tracing",
"tracing-appender",
@ -8070,9 +8070,9 @@ dependencies = [
[[package]]
name = "zip"
version = "4.3.0"
version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b"
checksum = "8835eb39822904d39cb19465de1159e05d371973f0c6df3a365ad50565ddc8b9"
dependencies = [
"aes",
"arbitrary",

View File

@ -8,7 +8,7 @@ authors = ["Bill Thiede <git@xinu.tv>"]
edition = "2021"
license = "UNLICENSED"
publish = ["xinu"]
version = "0.17.36"
version = "0.17.37"
repository = "https://git.z.xinu.tv/wathiede/letterbox"
[profile.dev]

View File

@ -33,8 +33,8 @@ headers = "0.4.0"
html-escape = "0.2.13"
icalendar = "0.17.1"
ical = "0.10"
letterbox-notmuch = { path = "../notmuch", version = "0.17.36", registry = "xinu" }
letterbox-shared = { path = "../shared", version = "0.17.36", registry = "xinu" }
letterbox-notmuch = { path = "../notmuch", version = "0.17.37", registry = "xinu" }
letterbox-shared = { path = "../shared", version = "0.17.37", registry = "xinu" }
linkify = "0.10.0"
lol_html = "2.3.0"
mailparse = "0.16.1"

View File

@ -1,8 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title>TLS Report</title>
</head>
<body>
<h3>TLS Report Summary:</h3>
<p>Organization: {{ report.organization_name }}</p>
@ -10,34 +12,37 @@
<p>Contact: {{ report.contact_info }}</p>
<p>Report ID: {{ report.report_id }}</p>
<h4>Policies:</h4>
<h4><b>Policies:</b></h4>
{% for policy in report.policies %}
<h5>Policy Domain: {{ policy.policy.policy_domain }}</h5>
<ul>
<li>Policy Type: {{ policy.policy.policy_type }}</li>
<li>Policy String: {{ policy.policy.policy_string | join(", ") }}</li>
<li>Successful Sessions: {{ policy.summary.total_successful_session_count }}</li>
<li>Failed Sessions: {{ policy.summary.total_failure_session_count }}</li>
</ul>
<h5><b>Policy Domain:</b> {{ policy.policy.policy_domain }}</h5>
<ul>
<li><b>Policy Type:</b> {{ policy.policy.policy_type }}</li>
<li><b>Policy String:</b> {{ policy.policy.policy_string | join(", ") }}</li>
<li><b>Successful Sessions:</b> {{ policy.summary.total_successful_session_count }}</li>
<li><b>Failed Sessions:</b> {{ policy.summary.total_failure_session_count }}</li>
</ul>
<ul>
{% for mx_host in policy.policy.mx_host %}
<li>Hostname: {{ mx_host.hostname }}, Failures: {{ mx_host.failure_count }}, Result: {{ mx_host.result_type }}</li>
{% endfor %}
</ul>
<ul>
{% for mx_host in policy.policy.mx_host %}
<li><b>Hostname:</b> {{ mx_host.hostname }}, <b>Failures:</b> {{ mx_host.failure_count }}, <b>Result:</b> {{
mx_host.result_type }}</li>
{% endfor %}
</ul>
<ul>
{% for detail in policy.failure_details %}
<li>Result: {{ detail.result_type }}, Sending IP: {{ detail.sending_mta_ip }}, Failed Sessions: {{ detail.failed_session_count }}
{% if detail.failure_reason_code != "" %}
(Reason: {{ detail.failure_reason_code }})
{% endif %}
</li>
(Receiving IP: {{ detail.receiving_ip }})
(Receiving MX: {{ detail.receiving_mx_hostname }})
(Additional Info: {{ detail.additional_info }})
{% endfor %}
</ul>
<ul>
{% for detail in policy.failure_details %}
<li><b>Result:</b> {{ detail.result_type }}, <b>Sending IP:</b> {{ detail.sending_mta_ip }}, <b>Failed
Sessions:</b> {{ detail.failed_session_count }}
{% if detail.failure_reason_code != "" %}
(<b>Reason:</b> {{ detail.failure_reason_code }})
{% endif %}
</li>
(<b>Receiving IP:</b> {{ detail.receiving_ip }})
(<b>Receiving MX:</b> {{ detail.receiving_mx_hostname }})
(<b>Additional Info:</b> {{ detail.additional_info }})
{% endfor %}
</ul>
{% endfor %}
</body>
</html>

View File

@ -12,7 +12,7 @@ version.workspace = true
[dependencies]
build-info = "0.0.41"
letterbox-notmuch = { path = "../notmuch", version = "0.17.36", registry = "xinu" }
letterbox-notmuch = { path = "../notmuch", version = "0.17.37", registry = "xinu" }
regex = "1.11.1"
serde = { version = "1.0.219", features = ["derive"] }
sqlx = "0.8.5"

View File

@ -33,7 +33,7 @@ wasm-bindgen = "=0.2.100"
uuid = { version = "1.16.0", features = [
"js",
] } # direct dep to set js feature, prevents Rng issues
letterbox-shared = { path = "../shared/", version = "0.17.36", registry = "xinu" }
letterbox-shared = { path = "../shared/", version = "0.17.37", registry = "xinu" }
seed_hooks = { version = "0.4.1", registry = "xinu" }
strum_macros = "0.27.1"
gloo-console = "0.3.0"

View File

@ -901,13 +901,22 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
.collect();
let show_x_original_to = !*to_xinu.borrow() && msg.x_original_to.is_some();
let show_delivered_to = !*to_xinu.borrow() && !show_x_original_to && msg.delivered_to.is_some();
let common_style = C!["text-sm", "pr-2", "text-gray-500"];
div![
C!["flex", "p-4", "bg-neutral-800"],
div![avatar],
C!["flex", "bg-neutral-800"],
div![C!["self-center"], avatar],
div![
C!["px-4", "mr-auto"],
span![
C!["font-semibold", "text-sm"],
C![
"mx-2",
"flex-1",
"flex",
"flex-nowrap",
"items-center",
"truncate",
],
div![
C!["font-semibold", "text-white"],
&common_style,
from_detail.as_ref().map(|addr| attrs! {
At::Title => addr
}),
@ -915,7 +924,7 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
],
" ",
IF!(!msg.to.is_empty() => div![
C!["text-xs"],
&common_style,
span![
C!["font-semibold"],
"To: "
@ -926,7 +935,7 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
" "
]),
IF!(!msg.cc.is_empty() => div![
C!["text-xs", "max-w-full", "overflow-clip", "text-ellipsis"],
&common_style,
span![
C!["font-semibold"],
"CC: "
@ -934,7 +943,7 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
cc_addrs
]),
IF!(show_x_original_to => div![
C!["text-xs"],
&common_style,
span![
C!["font-semibold"],
"Original To: "
@ -953,7 +962,7 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
]
]),
IF!(show_delivered_to => div![
C!["text-xs"],
&common_style,
span![
C!["font-semibold"],
"Delivered To: "
@ -972,27 +981,25 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod
]
]),
],
span![
C!["text-right"],
msg.timestamp
.map(|ts| div![C!["text-xs", "text-nowrap"], human_age(ts)]),
div![
C!["p-2"],
i![C![
"mx-4",
"read-status",
"far",
if is_unread {
"fa-envelope"
} else {
"fa-envelope-open"
},
]],
ev(Ev::Click, move |e| {
e.stop_propagation();
Msg::SetUnread(id, !is_unread)
})
],
msg.timestamp.map(|ts| div![
C!["text-xs", "text-nowrap", "justify-self-end", "self-center"],
human_age(ts)
]),
div![
i![C![
"m-2",
"read-status",
"far",
if is_unread {
"fa-envelope"
} else {
"fa-envelope-open"
},
]],
ev(Ev::Click, move |e| {
e.stop_propagation();
Msg::SetUnread(id, !is_unread)
})
]
]
}
@ -1007,7 +1014,7 @@ fn message_render(msg: &ShowThreadQueryThreadOnEmailThreadMessages, open: bool)
};
let from = from.map(|f| f.replace('.', "-").replace('@', "-"));
div![
C!["lg:mb-4"],
C!["pb-1"],
div![
if open {
render_open_header(&msg)