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 311 additions and 296 deletions

473
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ version.workspace = true
[dependencies] [dependencies]
build-info = "0.0.41" 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" regex = "1.11.1"
serde = { version = "1.0.219", features = ["derive"] } serde = { version = "1.0.219", features = ["derive"] }
sqlx = "0.8.5" sqlx = "0.8.5"

View File

@ -33,7 +33,7 @@ wasm-bindgen = "=0.2.100"
uuid = { version = "1.16.0", features = [ uuid = { version = "1.16.0", features = [
"js", "js",
] } # direct dep to set js feature, prevents Rng issues ] } # 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" } seed_hooks = { version = "0.4.1", registry = "xinu" }
strum_macros = "0.27.1" strum_macros = "0.27.1"
gloo-console = "0.3.0" gloo-console = "0.3.0"

View File

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