@@ -19,9 +19,10 @@ use defguard_core::{
1919 DirectorySyncTarget , DirectorySyncUserBehavior , OpenIdProviderKind ,
2020 } ,
2121 handlers:: openid_providers:: AddProviderData ,
22- license:: { get_cached_license, set_cached_license} ,
22+ license:: { License , LicenseTier , SupportType , get_cached_license, set_cached_license} ,
23+ limits:: update_counts,
2324 } ,
24- grpc:: GatewayEvent ,
25+ grpc:: { GatewayEvent , proto :: enterprise :: license :: LicenseLimits } ,
2526 handlers:: { Auth , GroupInfo , wireguard:: WireguardNetworkData } ,
2627} ;
2728use ipnetwork:: IpNetwork ;
@@ -137,6 +138,63 @@ async fn test_network(_: PgPoolOptions, options: PgConnectOptions) {
137138 assert_matches ! ( event, GatewayEvent :: NetworkDeleted ( ..) ) ;
138139}
139140
141+ #[ sqlx:: test]
142+ async fn test_create_network_blocked_when_location_count_exceeds_license_limit (
143+ _: PgPoolOptions ,
144+ options : PgConnectOptions ,
145+ ) {
146+ let pool = setup_pool ( options) . await ;
147+
148+ let ( mut client, client_state) = make_test_client ( pool) . await ;
149+ authenticate_admin ( & mut client) . await ;
150+
151+ make_network ( & client, "network1" ) . await ;
152+ make_network ( & client, "network2" ) . await ;
153+ update_counts ( & client_state. pool ) . await . unwrap ( ) ;
154+
155+ let license = get_cached_license ( ) . clone ( ) ;
156+ set_cached_license ( Some ( License :: new (
157+ "test_customer" . to_string ( ) ,
158+ false ,
159+ None ,
160+ Some ( LicenseLimits {
161+ users : 100 ,
162+ devices : 100 ,
163+ locations : 1 ,
164+ network_devices : Some ( 100 ) ,
165+ } ) ,
166+ None ,
167+ LicenseTier :: Business ,
168+ SupportType :: Basic ,
169+ ) ) ) ;
170+
171+ let response = client
172+ . post ( "/api/v1/network" )
173+ . json ( & json ! ( {
174+ "name" : "network3" ,
175+ "address" : "10.1.1.1/24" ,
176+ "port" : 55555 ,
177+ "endpoint" : "192.168.4.14" ,
178+ "allowed_ips" : "10.1.1.0/24" ,
179+ "dns" : "1.1.1.1" ,
180+ "mtu" : 1420 ,
181+ "fwmark" : 0 ,
182+ "allowed_groups" : [ "admin" ] ,
183+ "allow_all_groups" : false ,
184+ "keepalive_interval" : 25 ,
185+ "peer_disconnect_threshold" : 300 ,
186+ "acl_enabled" : false ,
187+ "acl_default_allow" : false ,
188+ "location_mfa_mode" : "disabled" ,
189+ "service_location_mode" : "disabled"
190+ } ) )
191+ . send ( )
192+ . await ;
193+ assert_eq ! ( response. status( ) , StatusCode :: FORBIDDEN ) ;
194+
195+ set_cached_license ( license) ;
196+ }
197+
140198#[ sqlx:: test]
141199async fn test_location_mfa_mode_validation_create ( _: PgPoolOptions , options : PgConnectOptions ) {
142200 let pool = setup_pool ( options) . await ;
0 commit comments