From b0fe80d6e3f2731eaf869b7bd5fb09d0686e34e1 Mon Sep 17 00:00:00 2001 From: moznion Date: Mon, 21 Dec 2020 23:17:30 +0900 Subject: [PATCH] feat: make an identifier of a Packet instance configurable through a constructor and a setter method rel: #6 --- radius/src/core/packet.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/radius/src/core/packet.rs b/radius/src/core/packet.rs index d6a39b1..3522d37 100644 --- a/radius/src/core/packet.rs +++ b/radius/src/core/packet.rs @@ -49,12 +49,29 @@ pub struct Packet { impl Packet { /// Constructor for a Packet. + /// + /// By default, this constructor makes an instance with a random identifier value. + /// If you'd like to set an arbitrary identifier, please use `new_with_identifier()` constructor instead or `set_identifier()` method for created instance. pub fn new(code: Code, secret: &[u8]) -> Self { + Self::_new(code, secret, None) + } + + /// Constructor for a Packet with arbitrary identifier value. + /// + /// If you want to make an instance with a random identifier value, please consider using `new()`. + pub fn new_with_identifier(code: Code, secret: &[u8], identifier: u8) -> Self { + Self::_new(code, secret, Some(identifier)) + } + + fn _new(code: Code, secret: &[u8], maybe_identifier: Option) -> Self { let mut rng = rand::thread_rng(); let authenticator = (0..16).map(|_| rng.gen()).collect::>(); Packet { code: code.to_owned(), - identifier: rng.gen(), + identifier: match maybe_identifier { + Some(ident) => ident, + None => rng.gen(), + }, authenticator, secret: secret.to_owned(), attributes: Attributes(vec![]), @@ -77,6 +94,11 @@ impl Packet { &self.authenticator } + /// This sets an identifier value to an instance. + pub fn set_identifier(&mut self, identifier: u8) { + self.identifier = identifier; + } + /// This decodes bytes into a Packet. pub fn decode(bs: &[u8], secret: &[u8]) -> Result { if bs.len() < RADIUS_PACKET_HEADER_LENGTH { @@ -549,4 +571,16 @@ mod tests { PacketError::EncodingError("attribute is too large".to_owned()), ); } + + #[test] + fn test_with_arbitrary_identifier() { + let mut packet = Packet::new(Code::AccessRequest, b"12345"); + let random_ident = packet.get_identifier(); + let expected_ident = random_ident + 1; + packet.set_identifier(expected_ident); + assert_eq!(packet.get_identifier(), expected_ident); + + packet = Packet::new_with_identifier(Code::AccessRequest, b"12345", expected_ident); + assert_eq!(packet.get_identifier(), expected_ident); + } }