From e4fb7b953ea4f42daba519654d50b13cfab54ad1 Mon Sep 17 00:00:00 2001 From: Wesley Date: Wed, 11 May 2022 13:21:10 -0300 Subject: [PATCH] #11169 fix: individual security scopes --- .../swagger/codegen/v3/DefaultGenerator.java | 69 ++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java index 960bb095842..e1644cb4261 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.security.Scopes; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.tags.Tag; @@ -45,6 +46,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Collectors; //import io.swagger.codegen.languages.AbstractJavaCodegen; @@ -911,17 +913,68 @@ private void processOperation(String resourcePath, String httpMethod, Operation codegenOperation.tags = new ArrayList<>(tags); config.addOperationToGroup(config.sanitizeTag(tag.getName()), resourcePath, operation, codegenOperation, operations); - List securities = operation.getSecurity(); - if (securities != null && securities.isEmpty()) { - continue; - } - Map authMethods = getAuthMethods(securities, securitySchemes); - if (authMethods == null || authMethods.isEmpty()) { - authMethods = getAuthMethods(globalSecurities, securitySchemes); + final List securities = new ArrayList<>(); + + if (globalSecurities != null) { + for (SecurityRequirement globalSecurityRequirement : globalSecurities) { + SecurityRequirement copy = new SecurityRequirement(); + for (Map.Entry> entry : globalSecurityRequirement.entrySet()) { + copy.put(entry.getKey(), new ArrayList<>(entry.getValue())); + } + securities.add(copy); + for (Map.Entry> entry : copy.entrySet()) { + if (operation.getSecurity() != null) { + for (SecurityRequirement operationSecurityRequirement : operation.getSecurity()) { + List scopes = operationSecurityRequirement.get(entry.getKey()); + if (scopes != null) { + entry.getValue().addAll(scopes.stream() + .filter(s -> entry.getValue().stream().noneMatch(s::equals)).collect(Collectors.toList())); + } else { + securities.add(operationSecurityRequirement); + } + } + } + } + } + } else if (operation.getSecurity() != null) { + for (SecurityRequirement operationSecurityRequirement : operation.getSecurity()) { + securities.add(operationSecurityRequirement); + } } + Map authMethods = getAuthMethods(securities, securitySchemes); + codegenOperation.authMethods = config.fromSecurity(authMethods); + List codegenSecurities = new ArrayList<>(); if (authMethods != null && !authMethods.isEmpty()) { - codegenOperation.authMethods = config.fromSecurity(authMethods); + for (CodegenSecurity codegenSecurity : codegenOperation.authMethods) { + for (SecurityRequirement securityRequirement : securities) { + if (!securityRequirement.containsKey(codegenSecurity.name)) { + continue; + } + CodegenSecurity codegenSecurityCopy = new CodegenSecurity(); + codegenSecurityCopy.vendorExtensions = codegenSecurity.vendorExtensions; + if (codegenSecurityCopy.vendorExtensions != null) { + for (Map.Entry entry : codegenSecurityCopy.vendorExtensions.entrySet()) { + codegenSecurityCopy.vendorExtensions.put(entry.getKey(), entry.getValue()); + } + } + codegenSecurityCopy.scopes = new Scopes(); + codegenSecurityCopy.name = codegenSecurity.name; + codegenSecurityCopy.type = codegenSecurity.type; + codegenSecurityCopy.authorizationUrl = codegenSecurity.authorizationUrl; + codegenSecurityCopy.flow = codegenSecurity.flow; + codegenSecurityCopy.keyParamName = codegenSecurity.keyParamName; + codegenSecurityCopy.tokenUrl = codegenSecurity.tokenUrl; + codegenSecurities.add(codegenSecurityCopy); + List scopes = securityRequirement.get(codegenSecurity.name); + if (scopes != null && codegenSecurity.scopes != null) { + for (String scope : scopes) { + codegenSecurityCopy.scopes.addString(scope, codegenSecurity.scopes.get(scope)); + } + } + } + } + codegenOperation.authMethods = codegenSecurities; codegenOperation.getVendorExtensions().put(CodegenConstants.HAS_AUTH_METHODS_EXT_NAME, Boolean.TRUE); } } catch (Exception ex) {