diff --git a/rust/connlib/clients/shared/src/messages.rs b/rust/connlib/clients/shared/src/messages.rs index a317808e4..db1013f6d 100644 --- a/rust/connlib/clients/shared/src/messages.rs +++ b/rust/connlib/clients/shared/src/messages.rs @@ -297,6 +297,199 @@ mod test { assert_eq!(m, ingress_message); } + #[test] + fn messages_ignore_additional_fields() { + let m = PhoenixMessage::new_message( + "client", + IngressMessages::Init(InitClient { + interface: Interface { + ipv4: "100.72.112.111".parse().unwrap(), + ipv6: "fd00:2021:1111::13:efb9".parse().unwrap(), + upstream_dns: vec![], + }, + resources: vec![ + ResourceDescription::Cidr(ResourceDescriptionCidr { + id: "73037362-715d-4a83-a749-f18eadd970e6".parse().unwrap(), + address: "172.172.0.0/16".parse().unwrap(), + name: "172.172.0.0/16".to_string(), + }), + ResourceDescription::Dns(ResourceDescriptionDns { + id: "03000143-e25e-45c7-aafb-144990e57dcd".parse().unwrap(), + address: "gitlab.mycorp.com".to_string(), + name: "gitlab.mycorp.com".to_string(), + }), + ], + }), + None, + ); + let message = r#"{ + "event": "init", + "payload": { + "interface": { + "ipv4": "100.72.112.111", + "ipv6": "fd00:2021:1111::13:efb9", + "upstream_dns": [], + "extra_config": "foo" + }, + "resources": [ + { + "address": "172.172.0.0/16", + "id": "73037362-715d-4a83-a749-f18eadd970e6", + "name": "172.172.0.0/16", + "type": "cidr", + "not": "relevant" + }, + { + "address": "gitlab.mycorp.com", + "id": "03000143-e25e-45c7-aafb-144990e57dcd", + "ipv4": "100.126.44.50", + "ipv6": "fd00:2021:1111::e:7758", + "name": "gitlab.mycorp.com", + "type": "dns", + "not": "relevant" + } + ] + }, + "ref": null, + "topic": "client" + }"#; + let ingress_message: PhoenixMessage = + serde_json::from_str(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn messages_ignore_additional_bool_fields() { + let m = PhoenixMessage::new_message( + "client", + IngressMessages::Init(InitClient { + interface: Interface { + ipv4: "100.72.112.111".parse().unwrap(), + ipv6: "fd00:2021:1111::13:efb9".parse().unwrap(), + upstream_dns: vec![], + }, + resources: vec![], + }), + None, + ); + let message = r#"{ + "event": "init", + "payload": { + "interface": { + "ipv4": "100.72.112.111", + "ipv6": "fd00:2021:1111::13:efb9", + "upstream_dns": [], + "additional": true + }, + "resources": [] + }, + "ref": null, + "topic": "client" + }"#; + let ingress_message: PhoenixMessage = + serde_json::from_str(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn messages_ignore_additional_number_fields() { + let m = PhoenixMessage::new_message( + "client", + IngressMessages::Init(InitClient { + interface: Interface { + ipv4: "100.72.112.111".parse().unwrap(), + ipv6: "fd00:2021:1111::13:efb9".parse().unwrap(), + upstream_dns: vec![], + }, + resources: vec![], + }), + None, + ); + let message = r#"{ + "event": "init", + "payload": { + "interface": { + "ipv4": "100.72.112.111", + "ipv6": "fd00:2021:1111::13:efb9", + "upstream_dns": [], + "additional": 0.3 + }, + "resources": [] + }, + "ref": null, + "topic": "client" + }"#; + let ingress_message: PhoenixMessage = + serde_json::from_str(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn messages_ignore_additional_object_fields() { + let m = PhoenixMessage::new_message( + "client", + IngressMessages::Init(InitClient { + interface: Interface { + ipv4: "100.72.112.111".parse().unwrap(), + ipv6: "fd00:2021:1111::13:efb9".parse().unwrap(), + upstream_dns: vec![], + }, + resources: vec![], + }), + None, + ); + let message = r#"{ + "event": "init", + "payload": { + "interface": { + "ipv4": "100.72.112.111", + "ipv6": "fd00:2021:1111::13:efb9", + "upstream_dns": [], + "additional": { "ignored": "field" } + }, + "resources": [] + }, + "ref": null, + "topic": "client" + }"#; + let ingress_message: PhoenixMessage = + serde_json::from_str(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn messages_ignore_additional_array_fields() { + let m = PhoenixMessage::new_message( + "client", + IngressMessages::Init(InitClient { + interface: Interface { + ipv4: "100.72.112.111".parse().unwrap(), + ipv6: "fd00:2021:1111::13:efb9".parse().unwrap(), + upstream_dns: vec![], + }, + resources: vec![], + }), + None, + ); + let message = r#"{ + "event": "init", + "payload": { + "interface": { + "ipv4": "100.72.112.111", + "ipv6": "fd00:2021:1111::13:efb9", + "upstream_dns": [], + "additional": [true, false] + }, + "resources": [] + }, + "ref": null, + "topic": "client" + }"#; + let ingress_message: PhoenixMessage = + serde_json::from_str(message).unwrap(); + assert_eq!(m, ingress_message); + } + #[test] fn list_relays_message() { let m = PhoenixMessage::::new_message( diff --git a/rust/gateway/src/messages.rs b/rust/gateway/src/messages.rs index 48d8c8ca9..fe90e4396 100644 --- a/rust/gateway/src/messages.rs +++ b/rust/gateway/src/messages.rs @@ -202,6 +202,7 @@ mod test { // TODO: We are just testing we can deserialize for now. let _: PhoenixMessage = serde_json::from_str(message).unwrap(); } + #[test] fn init_phoenix_message() { let m = InitMessage::Init(InitGateway { @@ -220,4 +221,118 @@ mod test { let ingress_message = serde_json::from_str::>(message).unwrap(); assert_eq!(m, ingress_message); } + + #[test] + fn additional_fields_are_ignore() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","irrelevant":"field","payload":{"more":"info","interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true,"ignored":"field"}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn additional_null_fields_are_ignored() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","payload":{"additional":null,"interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn additional_number_fields_are_ignored() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","payload":{"additional":0.3,"interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn additional_boolean_fields_are_ignored() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","payload":{"additional":true,"interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn additional_object_fields_are_ignored() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","payload":{"additional":{"ignored":"field"},"interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } + + #[test] + fn additional_array_fields_are_ignored() { + let m = InitMessage::Init(InitGateway { + interface: Interface { + ipv4: "100.115.164.78".parse().unwrap(), + ipv6: "fd00:2021:1111::2c:f6ab".parse().unwrap(), + upstream_dns: vec![], + }, + config: Config { + ipv4_masquerade_enabled: true, + ipv6_masquerade_enabled: true, + }, + }); + + let message = r#"{"event":"init","ref":null,"topic":"gateway","payload":{"additional":[true,false],"interface":{"ipv6":"fd00:2021:1111::2c:f6ab","ipv4":"100.115.164.78"},"config":{"ipv4_masquerade_enabled":true,"ipv6_masquerade_enabled":true}}}"#; + let ingress_message = serde_json::from_str::>(message).unwrap(); + assert_eq!(m, ingress_message); + } }