@@ -347,16 +347,24 @@ public List<Map<String, Object>> identityProvidersByAllowedConnections(List<Conn
347347 @ Override
348348 public List <Map <String , Object >> policiesByServiceProvider (String identityProviderEntityId ,
349349 String serviceProviderEntityId ) {
350- String query = """
351- {
352- "data.serviceProviderIds.name": "%s",
353- $or: [
354- { "data.identityProviderIds": { $size: 0 } },
355- { "data.identityProviderIds": { $exists: false } },
356- { "data.identityProviderIds.name": "%s" }
357- ]
358- })
359- """ .formatted (serviceProviderEntityId , identityProviderEntityId );
350+ // Build query using immutable Maps to ensure proper JSON serialization and prevent injection
351+ Map <String , Object > identityProviderOrCondition = Map .of (
352+ "data.identityProviderIds.name" , identityProviderEntityId
353+ );
354+ Map <String , Object > identityProviderExistsFalseCondition = Map .of (
355+ "data.identityProviderIds" , Map .of ("$exists" , false )
356+ );
357+ Map <String , Object > identityProviderSizeZeroCondition = Map .of (
358+ "data.identityProviderIds" , Map .of ("$size" , 0 )
359+ );
360+ Map <String , Object > query = Map .of (
361+ "data.serviceProviderIds.name" , serviceProviderEntityId ,
362+ "$or" , List .of (
363+ identityProviderSizeZeroCondition ,
364+ identityProviderExistsFalseCondition ,
365+ identityProviderOrCondition
366+ )
367+ );
360368 RestTemplate restTemplate = environmentRestTemplate (Environment .PROD );
361369 String url = String .format ("%s/manage/api/internal/rawSearch/%s" ,
362370 environmentUrl (Environment .PROD ), EntityType .policy );
0 commit comments