0.34.13_cleaup_code
This commit is contained in:
1 parent
ec46a96a29
commit
5c2e50ec06
87 files changed
+4890
-1338
No files matched your search
@@ -3,7 +3,8 @@ fn normalize_public_admin_origin(public_origin: &str) -> Result<String> {
|
||||
public_origin.len() <= 255 && !public_origin.chars().any(|c| matches!(c, '@' | '#' | '?' | ',' | '\\')),
|
||||
"administration public_origin must be a single HTTPS origin without userinfo, query or fragment"
|
||||
);
|
||||
let uri = public_origin.parse::<http::Uri>()
|
||||
let uri = public_origin
|
||||
.parse::<http::Uri>()
|
||||
.context("invalid administration public_origin")?;
|
||||
ensure!(
|
||||
uri.scheme_str() == Some("https")
|
||||
@@ -11,7 +12,8 @@ fn normalize_public_admin_origin(public_origin: &str) -> Result<String> {
|
||||
&& matches!(uri.path(), "" | "/"),
|
||||
"administration public_origin must be HTTPS without a path or query"
|
||||
);
|
||||
let authority = uri.authority()
|
||||
let authority = uri
|
||||
.authority()
|
||||
.context("administration public_origin requires an authority")?;
|
||||
let host = crate::config::normalize_host(authority.host())?;
|
||||
ensure!(
|
||||
@@ -19,9 +21,13 @@ fn normalize_public_admin_origin(public_origin: &str) -> Result<String> {
|
||||
"administration public_origin must name a DNS hostname"
|
||||
);
|
||||
let port = if authority.as_str().contains(':') {
|
||||
let port = authority.port_u16()
|
||||
let port = authority
|
||||
.port_u16()
|
||||
.context("invalid administration public_origin port")?;
|
||||
ensure!(port > 0, "administration public_origin port must be nonzero");
|
||||
ensure!(
|
||||
port > 0,
|
||||
"administration public_origin port must be nonzero"
|
||||
);
|
||||
format!(":{port}")
|
||||
} else {
|
||||
String::new()
|
||||
@@ -31,17 +37,26 @@ fn normalize_public_admin_origin(public_origin: &str) -> Result<String> {
|
||||
|
||||
impl Administration {
|
||||
pub fn public_origin_host(&self) -> Option<&str> {
|
||||
self.public_origin.as_deref()
|
||||
self.public_origin
|
||||
.as_deref()
|
||||
.and_then(|url| url.strip_prefix("https://"))
|
||||
.and_then(|authority| authority.split(':').next())
|
||||
}
|
||||
pub fn explicitly_allowed_panel_host(&self, host: &str) -> bool {
|
||||
self.allowed_hosts.iter().any(|allowed| allowed.eq_ignore_ascii_case(host))
|
||||
|| self.public_origin_host().is_some_and(|name| name.eq_ignore_ascii_case(host))
|
||||
self.allowed_hosts
|
||||
.iter()
|
||||
.any(|allowed| allowed.eq_ignore_ascii_case(host))
|
||||
|| self
|
||||
.public_origin_host()
|
||||
.is_some_and(|name| name.eq_ignore_ascii_case(host))
|
||||
}
|
||||
pub fn include_public_origin_host(&mut self) {
|
||||
if let Some(host) = self.public_origin_host().map(str::to_owned) {
|
||||
if !self.allowed_hosts.iter().any(|allowed| allowed.eq_ignore_ascii_case(&host)) {
|
||||
if !self
|
||||
.allowed_hosts
|
||||
.iter()
|
||||
.any(|allowed| allowed.eq_ignore_ascii_case(&host))
|
||||
{
|
||||
self.allowed_hosts.push(host);
|
||||
}
|
||||
}
|
||||
|
||||
+59
-12
@@ -15,11 +15,29 @@ mod tests {
|
||||
};
|
||||
configured.validate().unwrap();
|
||||
assert_eq!(configured.idle_timeout(), Duration::from_secs(45));
|
||||
assert_eq!(configured.max_connection_lifetime(), Some(Duration::from_secs(3_600)));
|
||||
assert_eq!(
|
||||
configured.max_connection_lifetime(),
|
||||
Some(Duration::from_secs(3_600))
|
||||
);
|
||||
assert_eq!(configured.drain_timeout(), Duration::from_secs(20));
|
||||
assert!(Http2Connections { idle_timeout_seconds: 0, ..defaults }.validate().is_err());
|
||||
assert!(Http2Connections { max_connection_lifetime_seconds: 2_592_001, ..defaults }.validate().is_err());
|
||||
assert!(Http2Connections { drain_timeout_seconds: 0, ..defaults }.validate().is_err());
|
||||
assert!(Http2Connections {
|
||||
idle_timeout_seconds: 0,
|
||||
..defaults
|
||||
}
|
||||
.validate()
|
||||
.is_err());
|
||||
assert!(Http2Connections {
|
||||
max_connection_lifetime_seconds: 2_592_001,
|
||||
..defaults
|
||||
}
|
||||
.validate()
|
||||
.is_err());
|
||||
assert!(Http2Connections {
|
||||
drain_timeout_seconds: 0,
|
||||
..defaults
|
||||
}
|
||||
.validate()
|
||||
.is_err());
|
||||
}
|
||||
#[test]
|
||||
fn new_install_server_header_defaults_to_rustproxy_without_changing_legacy_missing_field() {
|
||||
@@ -120,13 +138,29 @@ mod tests {
|
||||
|
||||
locks.ensure_config(&mut config);
|
||||
|
||||
let http = config.listeners.endpoints.iter().find(|item| item.id == "http").unwrap();
|
||||
let https = config.listeners.endpoints.iter().find(|item| item.id == "https").unwrap();
|
||||
let http = config
|
||||
.listeners
|
||||
.endpoints
|
||||
.iter()
|
||||
.find(|item| item.id == "http")
|
||||
.unwrap();
|
||||
let https = config
|
||||
.listeners
|
||||
.endpoints
|
||||
.iter()
|
||||
.find(|item| item.id == "https")
|
||||
.unwrap();
|
||||
assert_eq!(http.binding.address, "0.0.0.0:8181".parse().unwrap());
|
||||
assert!(http.additional_addresses.is_empty());
|
||||
assert_eq!(https.binding.address, "0.0.0.0:8443".parse().unwrap());
|
||||
assert!(https.additional_addresses.is_empty());
|
||||
assert!(!config.listeners.endpoints.iter().filter(|item| item.enabled).flat_map(|item| item.bindings()).any(|binding| binding.address.port() == 80 || binding.address.port() == 443));
|
||||
assert!(!config
|
||||
.listeners
|
||||
.endpoints
|
||||
.iter()
|
||||
.filter(|item| item.enabled)
|
||||
.flat_map(|item| item.bindings())
|
||||
.any(|binding| binding.address.port() == 80 || binding.address.port() == 443));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -264,19 +298,32 @@ mod tests {
|
||||
..Administration::default()
|
||||
};
|
||||
admin.validate(&tls).unwrap();
|
||||
assert_eq!(admin.public_origin.as_deref(), Some("https://panel.example.test:8443"));
|
||||
assert_eq!(
|
||||
admin.public_origin.as_deref(),
|
||||
Some("https://panel.example.test:8443")
|
||||
);
|
||||
assert_eq!(admin.public_origin_host(), Some("panel.example.test"));
|
||||
assert!(admin.allowed_hosts.is_empty(), "pin must not be stored twice");
|
||||
assert!(
|
||||
admin.allowed_hosts.is_empty(),
|
||||
"pin must not be stored twice"
|
||||
);
|
||||
assert!(admin.explicitly_allowed_panel_host("PANEL.EXAMPLE.TEST"));
|
||||
assert!(!admin.explicitly_allowed_panel_host("other.example.test"));
|
||||
let mut runtime = admin.clone();
|
||||
runtime.include_public_origin_host();
|
||||
runtime.include_public_origin_host();
|
||||
assert_eq!(runtime.allowed_hosts, vec!["panel.example.test".to_owned()]);
|
||||
assert!(admin.allowed_hosts.is_empty(), "saved config remains unchanged");
|
||||
let active = Administration { public_origin: None, ..admin.clone() };
|
||||
assert!(
|
||||
admin.allowed_hosts.is_empty(),
|
||||
"saved config remains unchanged"
|
||||
);
|
||||
let active = Administration {
|
||||
public_origin: None,
|
||||
..admin.clone()
|
||||
};
|
||||
assert!(admin.restart_differs(&active));
|
||||
let mut legacy: Administration = serde_json::from_str(r#"{"allowed_hosts":["panel.example.test"]}"#).unwrap();
|
||||
let mut legacy: Administration =
|
||||
serde_json::from_str(r#"{"allowed_hosts":["panel.example.test"]}"#).unwrap();
|
||||
legacy.validate(&tls).unwrap();
|
||||
assert_eq!(legacy.public_origin, None);
|
||||
assert!(legacy.explicitly_allowed_panel_host("panel.example.test"));
|
||||
|
||||
Reference in new issue
Block a user