use crate::ast::*;
use crate::builders::WireContext;
use alloc::vec::Vec;
pub fn build_tacacs_payload(
_ctx: &WireContext,
spec: &TacacsSpec,
payload_bytes: &[u8],
) -> Vec<u8> {
let type_code = match spec.tacacs_type.unwrap_or("AUTHEN").to_ascii_uppercase().as_str() {
"AUTHEN" => 1u8,
"AUTHOR" => 2u8,
"ACCT" => 3u8,
_ => 1u8,
};
let seq_no = spec.seq.unwrap_or(1);
let flags = spec.flags.unwrap_or(0x01); let session_id = spec.session_id.unwrap_or(0x12345678);
let user = spec.user.unwrap_or("admin");
let user_bytes = user.as_bytes();
let data = spec.data.unwrap_or("");
let data_bytes = data.as_bytes();
let mut body = Vec::new();
if type_code == 1 {
body.push(1); body.push(1); body.push(1); body.push(1); body.push(user_bytes.len() as u8); body.push(0); body.push(0); body.push(data_bytes.len() as u8); body.extend_from_slice(user_bytes);
body.extend_from_slice(data_bytes);
}
if !payload_bytes.is_empty() {
body.extend_from_slice(payload_bytes);
}
let length = body.len() as u32;
let mut pkt = Vec::with_capacity(12 + body.len());
pkt.push(0xC0); pkt.push(type_code);
pkt.push(seq_no);
pkt.push(flags);
pkt.extend_from_slice(&session_id.to_be_bytes());
pkt.extend_from_slice(&length.to_be_bytes());
pkt.extend_from_slice(&body);
pkt
}