summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2023-01-04 13:20:28 +0100
committerMatthias Beyer <mail@beyermatthias.de>2023-01-04 13:28:05 +0100
commita4dceed71754d0c1c52b613c75b8b185acd33d2b (patch)
tree6158d0f384b7aeedfbe0f1d0b73441bcd352cffb
parent0d2d89f33c1f4bce425472bf7b205582c281fa01 (diff)
Add check: If username is not set, password is not set
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--mqtt-tester/src/client_report.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/mqtt-tester/src/client_report.rs b/mqtt-tester/src/client_report.rs
index 642d30d..b6057f6 100644
--- a/mqtt-tester/src/client_report.rs
+++ b/mqtt-tester/src/client_report.rs
@@ -52,6 +52,7 @@ pub async fn create_client_report(
check_connect_packet_reserved_flag_zero(&client_exe_path).boxed_local(),
check_connect_flag_username_set_username_present(&client_exe_path).boxed_local(),
check_connect_flag_password_set_password_present(&client_exe_path).boxed_local(),
+ check_connect_flag_username_zero_means_password_zero(&client_exe_path).boxed_local(),
];
futures::stream::iter(reports)
@@ -630,3 +631,44 @@ async fn check_connect_flag_password_set_password_present(
output
})
}
+
+async fn check_connect_flag_username_zero_means_password_zero(
+ client_exe_path: &Path,
+) -> miette::Result<Report> {
+ let output = open_connection_with(client_exe_path)
+ .await
+ .map(crate::command::Command::new)?
+ .wait_for_write([crate::command::ClientCommand::WaitAndCheck(Box::new(
+ |bytes: &[u8]| -> bool {
+ let connect_flags = if let Some(flags) = find_connect_flags(bytes) {
+ flags
+ } else {
+ return false;
+ };
+
+ let username_flag_set = 0 != (connect_flags & 0b1000_0000); // Username flag
+ let password_flag_set = 0 != (connect_flags & 0b0100_0000); // Username flag
+
+ if username_flag_set {
+ !password_flag_set
+ } else {
+ true
+ }
+ },
+ ))]);
+
+ let (result, output) = wait_for_output! {
+ output,
+ timeout_ms: 100,
+ out_success => { ReportResult::Success },
+ out_failure => { ReportResult::Inconclusive }
+ };
+
+ Ok(mk_report! {
+ name: "If the CONNECT packet flag for password is set, a password must be present",
+ desc: "If the Password Flag is set to 1, a password MUST be present in the payload.",
+ normative: "[MQTT-3.1.2-20, MQTT-3.1.2-21]",
+ result,
+ output
+ })
+}