mirror of
https://github.com/cubixle/radius-rs.git
synced 2026-04-30 18:28:40 +01:00
Support to generate code for concat-able octets
This commit is contained in:
@@ -17,6 +17,7 @@ const RADIUS_VALUE_TYPE: &str = "u32";
|
|||||||
const USER_PASSWORD_TYPE_OPT: &str = "encrypt=1";
|
const USER_PASSWORD_TYPE_OPT: &str = "encrypt=1";
|
||||||
const TUNNEL_PASSWORD_TYPE_OPT: &str = "encrypt=2";
|
const TUNNEL_PASSWORD_TYPE_OPT: &str = "encrypt=2";
|
||||||
const HAS_TAG_TYPE_OPT: &str = "has_tag";
|
const HAS_TAG_TYPE_OPT: &str = "has_tag";
|
||||||
|
const CONCAT_TYPE_OPT: &str = "concat";
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum EncryptionType {
|
enum EncryptionType {
|
||||||
@@ -30,6 +31,7 @@ struct RadiusAttribute {
|
|||||||
typ: u8,
|
typ: u8,
|
||||||
value_type: RadiusAttributeValueType,
|
value_type: RadiusAttributeValueType,
|
||||||
fixed_octets_length: Option<usize>,
|
fixed_octets_length: Option<usize>,
|
||||||
|
concat_octets: bool,
|
||||||
has_tag: bool,
|
has_tag: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +212,16 @@ fn generate_attribute_code(
|
|||||||
&type_identifier,
|
&type_identifier,
|
||||||
fixed_octets_length,
|
fixed_octets_length,
|
||||||
),
|
),
|
||||||
None => generate_octets_attribute_code(w, &method_identifier, &type_identifier),
|
None => match attr.concat_octets {
|
||||||
|
true => generate_concat_octets_attribute_code(
|
||||||
|
w,
|
||||||
|
&method_identifier,
|
||||||
|
&type_identifier,
|
||||||
|
),
|
||||||
|
false => {
|
||||||
|
generate_octets_attribute_code(w, &method_identifier, &type_identifier)
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
RadiusAttributeValueType::IpAddr => match attr.has_tag {
|
RadiusAttributeValueType::IpAddr => match attr.has_tag {
|
||||||
@@ -405,6 +416,37 @@ pub fn lookup_all_{method_identifier}(packet: &Packet) -> Vec<Vec<u8>> {{
|
|||||||
w.write_all(code.as_bytes()).unwrap();
|
w.write_all(code.as_bytes()).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_concat_octets_attribute_code(
|
||||||
|
w: &mut BufWriter<File>,
|
||||||
|
method_identifier: &str,
|
||||||
|
type_identifier: &str,
|
||||||
|
) {
|
||||||
|
let code = format!(
|
||||||
|
"pub fn add_{method_identifier}(packet: &mut Packet, value: &[u8]) {{
|
||||||
|
packet.extend(
|
||||||
|
value
|
||||||
|
.chunks(253)
|
||||||
|
.map(|chunk| AVP::from_bytes({type_identifier}, chunk))
|
||||||
|
.collect(),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
pub fn lookup_{method_identifier}(packet: &Packet) -> Option<Vec<u8>> {{
|
||||||
|
let avps = packet.lookup_all({type_identifier});
|
||||||
|
match avps.is_empty() {{
|
||||||
|
true => None,
|
||||||
|
false => Some(avps.into_iter().fold(Vec::new(), |mut acc, v| {{
|
||||||
|
acc.extend(v.encode_bytes());
|
||||||
|
acc
|
||||||
|
}})),
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
",
|
||||||
|
method_identifier = method_identifier,
|
||||||
|
type_identifier = type_identifier,
|
||||||
|
);
|
||||||
|
w.write_all(code.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
fn generate_fixed_length_octets_attribute_code(
|
fn generate_fixed_length_octets_attribute_code(
|
||||||
w: &mut BufWriter<File>,
|
w: &mut BufWriter<File>,
|
||||||
method_identifier: &str,
|
method_identifier: &str,
|
||||||
@@ -635,6 +677,7 @@ fn parse_dict_file(dict_file_path: &Path) -> Result<DictParsed, String> {
|
|||||||
ATTRIBUTE_KIND => {
|
ATTRIBUTE_KIND => {
|
||||||
let mut encryption_type: Option<EncryptionType> = None;
|
let mut encryption_type: Option<EncryptionType> = None;
|
||||||
let mut has_tag = false;
|
let mut has_tag = false;
|
||||||
|
let mut concat_octets = false;
|
||||||
if items.len() >= 5 {
|
if items.len() >= 5 {
|
||||||
// TODO consider to extract to a method
|
// TODO consider to extract to a method
|
||||||
for type_opt in items[4].split(',') {
|
for type_opt in items[4].split(',') {
|
||||||
@@ -650,6 +693,10 @@ fn parse_dict_file(dict_file_path: &Path) -> Result<DictParsed, String> {
|
|||||||
has_tag = true;
|
has_tag = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if type_opt == CONCAT_TYPE_OPT {
|
||||||
|
concat_octets = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -696,6 +743,7 @@ fn parse_dict_file(dict_file_path: &Path) -> Result<DictParsed, String> {
|
|||||||
typ: items[2].parse().unwrap(),
|
typ: items[2].parse().unwrap(),
|
||||||
value_type: typ,
|
value_type: typ,
|
||||||
fixed_octets_length,
|
fixed_octets_length,
|
||||||
|
concat_octets,
|
||||||
has_tag,
|
has_tag,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user