| 42 |
42 |
|
pub cooldown_secs: u64,
|
| 43 |
43 |
|
/// WAM ticket manager URL (tailnet). When set, alerts also create WAM tickets.
|
| 44 |
44 |
|
pub wam_url: Option<String>,
|
|
45 |
+ |
/// Bearer token for the WAM ticket API. WAM fails closed (`MNW/wam` requires
|
|
46 |
+ |
/// `Authorization: Bearer <token>` on every request), so without this a
|
|
47 |
+ |
/// configured `wam_url` still gets 401s and ticket creation silently falls
|
|
48 |
+ |
/// back to email. Can also be set via the `POM_WAM_TOKEN` env var.
|
|
49 |
+ |
pub wam_token: Option<String>,
|
| 45 |
50 |
|
/// MNW base URL (e.g. "https://makenot.work"). When set together with
|
| 46 |
51 |
|
/// `alerts_ingest_token`, alerts are also pushed to MNW's operator log via
|
| 47 |
52 |
|
/// `POST /api/internal/alerts`. Either unset disables the MNW sink.
|
| 62 |
67 |
|
.field("from", &self.from)
|
| 63 |
68 |
|
.field("cooldown_secs", &self.cooldown_secs)
|
| 64 |
69 |
|
.field("wam_url", &self.wam_url)
|
|
70 |
+ |
.field("wam_token", &self.wam_token.as_ref().map(|_| "***"))
|
| 65 |
71 |
|
.field("mnw_url", &self.mnw_url)
|
| 66 |
72 |
|
.field(
|
| 67 |
73 |
|
"alerts_ingest_token",
|
| 557 |
563 |
|
{
|
| 558 |
564 |
|
alerts.alerts_ingest_token = Some(token);
|
| 559 |
565 |
|
}
|
|
566 |
+ |
if let Ok(token) = std::env::var("POM_WAM_TOKEN")
|
|
567 |
+ |
&& let Some(ref mut alerts) = config.alerts
|
|
568 |
+ |
{
|
|
569 |
+ |
alerts.wam_token = Some(token);
|
|
570 |
+ |
}
|
| 560 |
571 |
|
if let Ok(token) = std::env::var("POM_API_TOKEN") {
|
| 561 |
572 |
|
config.serve.api_token = Some(token);
|
| 562 |
573 |
|
}
|
| 757 |
768 |
|
assert_eq!(alerts.cooldown_secs, 300);
|
| 758 |
769 |
|
}
|
| 759 |
770 |
|
|
|
771 |
+ |
#[test]
|
|
772 |
+ |
fn config_alerts_wam_token() {
|
|
773 |
+ |
let toml = r#"
|
|
774 |
+ |
[alerts]
|
|
775 |
+ |
to = "alerts@example.com"
|
|
776 |
+ |
wam_url = "http://wam.tailnet:9000"
|
|
777 |
+ |
wam_token = "test-wam-token"
|
|
778 |
+ |
"#;
|
|
779 |
+ |
let config: Config = toml::from_str(toml).unwrap();
|
|
780 |
+ |
let alerts = config.alerts.unwrap();
|
|
781 |
+ |
assert_eq!(alerts.wam_url.as_deref(), Some("http://wam.tailnet:9000"));
|
|
782 |
+ |
assert_eq!(alerts.wam_token.as_deref(), Some("test-wam-token"));
|
|
783 |
+ |
}
|
|
784 |
+ |
|
|
785 |
+ |
#[test]
|
|
786 |
+ |
fn config_alerts_wam_token_defaults_to_none() {
|
|
787 |
+ |
let toml = r#"
|
|
788 |
+ |
[alerts]
|
|
789 |
+ |
to = "alerts@example.com"
|
|
790 |
+ |
wam_url = "http://wam.tailnet:9000"
|
|
791 |
+ |
"#;
|
|
792 |
+ |
let config: Config = toml::from_str(toml).unwrap();
|
|
793 |
+ |
assert!(config.alerts.unwrap().wam_token.is_none());
|
|
794 |
+ |
}
|
|
795 |
+ |
|
| 760 |
796 |
|
#[test]
|
| 761 |
797 |
|
fn config_with_tls() {
|
| 762 |
798 |
|
let toml = r#"
|
| 1442 |
1478 |
|
from: "PoM".to_string(),
|
| 1443 |
1479 |
|
cooldown_secs: 300,
|
| 1444 |
1480 |
|
wam_url: None,
|
|
1481 |
+ |
wam_token: Some("super-secret-wam-token".to_string()),
|
| 1445 |
1482 |
|
mnw_url: None,
|
| 1446 |
1483 |
|
alerts_ingest_token: Some("super-secret-ingest-token".to_string()),
|
| 1447 |
1484 |
|
};
|
| 1450 |
1487 |
|
!rendered.contains("super-secret-token"),
|
| 1451 |
1488 |
|
"token must be redacted in Debug"
|
| 1452 |
1489 |
|
);
|
|
1490 |
+ |
assert!(
|
|
1491 |
+ |
!rendered.contains("super-secret-wam-token"),
|
|
1492 |
+ |
"wam token must be redacted in Debug"
|
|
1493 |
+ |
);
|
| 1453 |
1494 |
|
assert!(
|
| 1454 |
1495 |
|
!rendered.contains("super-secret-ingest-token"),
|
| 1455 |
1496 |
|
"ingest token must be redacted in Debug"
|