Skip to main content

unifly_api/convert/
nat.rs

1use crate::integration_types;
2use crate::model::common::DataSource;
3use crate::model::entity_id::EntityId;
4use crate::model::firewall::{NatPolicy, NatType};
5
6use super::helpers::origin_from_metadata;
7
8impl From<integration_types::NatPolicyResponse> for NatPolicy {
9    fn from(r: integration_types::NatPolicyResponse) -> Self {
10        let nat_type = match r.nat_type.as_str() {
11            "MASQUERADE" => NatType::Masquerade,
12            "SOURCE_NAT" => NatType::Source,
13            _ => NatType::Destination,
14        };
15
16        let src_address = r
17            .source
18            .as_ref()
19            .and_then(|s| s.get("address"))
20            .and_then(serde_json::Value::as_str)
21            .map(ToOwned::to_owned);
22        let src_port = r
23            .source
24            .as_ref()
25            .and_then(|s| s.get("port"))
26            .and_then(serde_json::Value::as_str)
27            .map(ToOwned::to_owned);
28        let dst_address = r
29            .destination
30            .as_ref()
31            .and_then(|d| d.get("address"))
32            .and_then(serde_json::Value::as_str)
33            .map(ToOwned::to_owned);
34        let dst_port = r
35            .destination
36            .as_ref()
37            .and_then(|d| d.get("port"))
38            .and_then(serde_json::Value::as_str)
39            .map(ToOwned::to_owned);
40
41        NatPolicy {
42            id: EntityId::Uuid(r.id),
43            name: r.name,
44            description: r.description,
45            enabled: r.enabled,
46            nat_type,
47            interface_id: r.interface_id.map(EntityId::Uuid),
48            protocol: r.protocol,
49            src_address,
50            src_port,
51            dst_address,
52            dst_port,
53            translated_address: r.translated_address,
54            translated_port: r.translated_port,
55            origin: r.metadata.as_ref().and_then(origin_from_metadata),
56            data_source: DataSource::IntegrationApi,
57        }
58    }
59}
60
61pub fn nat_policy_from_v2(v: &serde_json::Value) -> Option<NatPolicy> {
62    let id_str = v.get("_id").and_then(|v| v.as_str())?;
63    let nat_type_str = v.get("type").and_then(|v| v.as_str()).unwrap_or("DNAT");
64    let nat_type = match nat_type_str {
65        "MASQUERADE" => NatType::Masquerade,
66        "SNAT" => NatType::Source,
67        _ => NatType::Destination,
68    };
69
70    let filter_addr = |filter: Option<&serde_json::Value>| -> Option<String> {
71        filter
72            .and_then(|f| f.get("address"))
73            .and_then(|v| v.as_str())
74            .map(ToOwned::to_owned)
75    };
76    let filter_port = |filter: Option<&serde_json::Value>| -> Option<String> {
77        filter
78            .and_then(|f| f.get("port"))
79            .and_then(|v| v.as_str())
80            .map(ToOwned::to_owned)
81    };
82
83    let src_filter = v.get("source_filter");
84    let dst_filter = v.get("destination_filter");
85
86    Some(NatPolicy {
87        id: EntityId::from(id_str.to_owned()),
88        name: v
89            .get("description")
90            .and_then(|v| v.as_str())
91            .unwrap_or("")
92            .to_owned(),
93        description: None,
94        enabled: v
95            .get("enabled")
96            .and_then(serde_json::Value::as_bool)
97            .unwrap_or(false),
98        nat_type,
99        interface_id: v
100            .get("in_interface")
101            .or_else(|| v.get("out_interface"))
102            .and_then(|v| v.as_str())
103            .map(|s| EntityId::from(s.to_owned())),
104        protocol: v
105            .get("protocol")
106            .and_then(|v| v.as_str())
107            .map(ToOwned::to_owned),
108        src_address: filter_addr(src_filter),
109        src_port: filter_port(src_filter),
110        dst_address: filter_addr(dst_filter),
111        dst_port: filter_port(dst_filter),
112        translated_address: v
113            .get("ip_address")
114            .and_then(|v| v.as_str())
115            .map(ToOwned::to_owned),
116        translated_port: v
117            .get("port")
118            .and_then(|v| v.as_str())
119            .map(ToOwned::to_owned),
120        origin: None,
121        data_source: DataSource::SessionApi,
122    })
123}