diff --git a/CHANGELOG.md b/CHANGELOG.md
index c90fa5a..92c18ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
+## [0.1.20] - 2024-12-04
+
+## Added
+- Delivery and DMARC troubleshooting.
+- Azure blob storage.
+- Support for external email addresses on mailing lists.
+
+### Changed
+- LDAP/SQL simplified config.
+
+### Fixed
+
## [0.1.19] - 2024-11-07
## Added
diff --git a/Cargo.lock b/Cargo.lock
index 9fdd920..47a23bc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
[[package]]
name = "adler"
@@ -2387,7 +2387,7 @@ dependencies = [
[[package]]
name = "webadmin"
-version = "0.1.19"
+version = "0.1.20"
dependencies = [
"ahash",
"base64",
diff --git a/Cargo.toml b/Cargo.toml
index 9c70198..f077c61 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,7 +7,7 @@ homepage = "https://stalw.art"
keywords = ["web", "admin", "email", "mail", "server"]
categories = ["email"]
license = "AGPL-3.0-only OR LicenseRef-SEL"
-version = "0.1.19"
+version = "0.1.20"
edition = "2021"
resolver = "2"
diff --git a/src/core/mod.rs b/src/core/mod.rs
index 59c3f23..65186ad 100644
--- a/src/core/mod.rs
+++ b/src/core/mod.rs
@@ -303,6 +303,7 @@ impl Permission {
| Permission::TracingLive
| Permission::MetricsList
| Permission::MetricsLive
+ | Permission::Troubleshoot
)
}
}
diff --git a/src/core/oauth.rs b/src/core/oauth.rs
index 9903bf0..2a790cf 100644
--- a/src/core/oauth.rs
+++ b/src/core/oauth.rs
@@ -320,6 +320,7 @@ impl OAuthCodeResponse {
Permission::MetricsLive,
Permission::ManageEncryption,
Permission::ManagePasswords,
+ Permission::Troubleshoot,
] {
self.permissions.insert(permission);
}
diff --git a/src/pages/config/schema/tracing.rs b/src/pages/config/schema/tracing.rs
index 8944c14..e821048 100644
--- a/src/pages/config/schema/tracing.rs
+++ b/src/pages/config/schema/tracing.rs
@@ -1184,6 +1184,7 @@ pub static EVENT_NAMES: &[&str] = &[
"telemetry.webhook-error",
"tls-rpt.record-fetch",
"tls-rpt.record-fetch-error",
+ "tls-rpt.record-not-found",
"tls.certificate-not-found",
"tls.handshake",
"tls.handshake-error",
diff --git a/src/pages/directory/list.rs b/src/pages/directory/list.rs
index 8c24895..e2a22b1 100644
--- a/src/pages/directory/list.rs
+++ b/src/pages/directory/list.rs
@@ -696,7 +696,7 @@ fn PrincipalItem(principal: Principal, params: Parameters) -> impl IntoView {
class="flex items-center gap-x-3 py-2 px-3 rounded-lg text-sm text-gray-800 hover:bg-gray-100 focus:ring-2 focus:ring-blue-500 dark:text-neutral-400 dark:hover:bg-neutral-700 dark:hover:text-neutral-300"
href=move || {
format!(
- "/manage/troubleshoot/dmarc?target={}",
+ "/manage/troubleshoot/dmarc?target=postmaster@{}",
principal.get_untracked().name().unwrap_or_default(),
)
}
diff --git a/src/pages/directory/mod.rs b/src/pages/directory/mod.rs
index 1d7eb10..3e33589 100644
--- a/src/pages/directory/mod.rs
+++ b/src/pages/directory/mod.rs
@@ -896,4 +896,5 @@ pub static PERMISSIONS: &[(&str, &str)] = &[
("oauth-client-registration", "Register OAuth clients"),
("oauth-client-override", "Override OAuth client settings"),
("ai-model-interact", "Interact with AI models"),
+ ("troubleshoot", "Perform troubleshooting"),
];
diff --git a/src/pages/manage/troubleshoot.rs b/src/pages/manage/troubleshoot.rs
index f2ed9ed..fd924d9 100644
--- a/src/pages/manage/troubleshoot.rs
+++ b/src/pages/manage/troubleshoot.rs
@@ -440,14 +440,14 @@ pub fn TroubleshootDmarc() -> impl IntoView {
/>
-
+
@@ -476,8 +476,8 @@ pub fn TroubleshootDmarc() -> impl IntoView {
.get("mail_from")
.unwrap_or_default()
.to_string(),
- headers: data
- .get("headers")
+ body: data
+ .get("body")
.and_then(|h| {
if h.trim().is_empty() { None } else { Some(h.to_string()) }
}),
@@ -749,7 +749,7 @@ struct DmarcTroubleshootRequest {
ehlo_domain: String,
#[serde(rename = "mailFrom")]
mail_from: String,
- headers: Option,
+ body: Option,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -1295,7 +1295,7 @@ impl Builder {
.input_check([Transformer::Trim], [Validator::Required])
.typ(Type::Input)
.build()
- .new_field("headers")
+ .new_field("body")
.typ(Type::Input)
.build()
.build()