Public release release-e47f9c27bbeb
Source commit: e47f9c27bbebe6759f6b6fe7b12fd00bb20d116d Public tree identity: sha256:4c1af1dfd67d3f2b5088531ea8727b11124b013d2251a4d5088f51a6424c0196
This commit is contained in:
parent
3a4d4fa7ae
commit
9223c54939
30 changed files with 4195 additions and 434 deletions
|
|
@ -189,6 +189,11 @@ fn authorize_client_request(
|
|||
|
||||
#[cfg(test)]
|
||||
mod transport_boundary_tests {
|
||||
use std::io::{BufRead as _, BufReader};
|
||||
|
||||
use clusterflux_core::{coordinator_wire_request, ProjectId, TenantId, UserId};
|
||||
use serde_json::json;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
|
|
@ -197,4 +202,96 @@ mod transport_boundary_tests {
|
|||
let error = CoordinatorService::new(1).serve_tcp(listener).unwrap_err();
|
||||
assert!(error.to_string().contains("restricted to loopback"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn malformed_identifiers_are_rejected_before_the_shared_service_lock_and_do_not_poison_it() {
|
||||
let (listener, addr) = bind_listener("127.0.0.1:0").unwrap();
|
||||
let mut coordinator = CoordinatorService::new(11);
|
||||
coordinator
|
||||
.issue_cli_session(
|
||||
TenantId::from("tenant"),
|
||||
ProjectId::from("project"),
|
||||
UserId::from("user"),
|
||||
"healthy-session",
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
let shared = Arc::new(Mutex::new(coordinator));
|
||||
let server_shared = Arc::clone(&shared);
|
||||
let server = std::thread::spawn(move || {
|
||||
let (stream, _) = listener.accept().unwrap();
|
||||
handle_shared_stream(server_shared, stream, ClientAuthorityMode::Strict).unwrap();
|
||||
});
|
||||
|
||||
let mut stream = TcpStream::connect(addr).unwrap();
|
||||
let mut reader = BufReader::new(stream.try_clone().unwrap());
|
||||
for (index, malformed_process) in [
|
||||
String::new(),
|
||||
" ".to_owned(),
|
||||
"bad\0process".to_owned(),
|
||||
"bad process!".to_owned(),
|
||||
"x".repeat(clusterflux_core::MAX_EXTERNAL_ID_BYTES + 1),
|
||||
]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
{
|
||||
let malformed = coordinator_wire_request(
|
||||
format!("malformed-{index}"),
|
||||
json!({
|
||||
"type": "authenticated",
|
||||
"session_secret": "healthy-session",
|
||||
"request": {
|
||||
"type": "abort_process",
|
||||
"process": malformed_process,
|
||||
"launch_attempt": "valid-attempt"
|
||||
}
|
||||
}),
|
||||
);
|
||||
serde_json::to_writer(&mut stream, &malformed).unwrap();
|
||||
stream.write_all(b"\n").unwrap();
|
||||
stream.flush().unwrap();
|
||||
|
||||
let mut line = String::new();
|
||||
reader.read_line(&mut line).unwrap();
|
||||
let CoordinatorResponse::Error { message } =
|
||||
serde_json::from_str::<CoordinatorResponse>(&line).unwrap()
|
||||
else {
|
||||
panic!("malformed identifier request unexpectedly succeeded");
|
||||
};
|
||||
assert!(
|
||||
message.contains("malformed external identifier")
|
||||
&& message.contains("request.request.process"),
|
||||
"unexpected malformed identifier response: {message}"
|
||||
);
|
||||
|
||||
let valid = coordinator_wire_request(
|
||||
format!("healthy-{index}"),
|
||||
json!({
|
||||
"type": "authenticated",
|
||||
"session_secret": "healthy-session",
|
||||
"request": { "type": "auth_status" }
|
||||
}),
|
||||
);
|
||||
serde_json::to_writer(&mut stream, &valid).unwrap();
|
||||
stream.write_all(b"\n").unwrap();
|
||||
stream.flush().unwrap();
|
||||
|
||||
line.clear();
|
||||
reader.read_line(&mut line).unwrap();
|
||||
assert!(
|
||||
matches!(
|
||||
serde_json::from_str::<CoordinatorResponse>(&line).unwrap(),
|
||||
CoordinatorResponse::AuthStatus {
|
||||
authenticated: true,
|
||||
..
|
||||
}
|
||||
),
|
||||
"valid authenticated traffic failed after malformed request {index}"
|
||||
);
|
||||
}
|
||||
|
||||
stream.shutdown(std::net::Shutdown::Both).unwrap();
|
||||
server.join().unwrap();
|
||||
assert!(!shared.is_poisoned());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue