Skip to content

Commit 9c9eca5

Browse files
Disable authentication on generated CORS options
CORS preflight options checks are sent without authentication, and so the generated OPTIONS integrations should have an empty "security" list.
1 parent 0e86ab6 commit 9c9eca5

File tree

5 files changed

+26
-12
lines changed

5 files changed

+26
-12
lines changed

aws/smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddCorsPreflightIntegration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.ArrayList;
1919
import java.util.Collection;
20+
import java.util.Collections;
2021
import java.util.HashMap;
2122
import java.util.Iterator;
2223
import java.util.List;
@@ -137,6 +138,7 @@ private static OperationObject createPreflightOperation(
137138
String path, PathItem pathItem, Map<CorsHeader, String> headers) {
138139
return OperationObject.builder()
139140
.tags(ListUtils.of("CORS"))
141+
.security(Collections.emptyList())
140142
.description("Handles CORS-preflight requests")
141143
.operationId(createOperationId(path))
142144
.putResponse("200", createPreflightResponse(headers))

aws/smithy-aws-apigateway-openapi/src/test/resources/software/amazon/smithy/aws/apigateway/openapi/cors-model.openapi.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@
234234
}
235235
}
236236
},
237+
"security": [],
237238
"x-amazon-apigateway-integration": {
238239
"passThroughBehavior": "when_no_match",
239240
"requestTemplates": {
@@ -336,6 +337,7 @@
336337
}
337338
}
338339
},
340+
"security": [],
339341
"x-amazon-apigateway-integration": {
340342
"passThroughBehavior": "when_no_match",
341343
"requestTemplates": {

smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/mappers/RemoveUnusedComponents.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
package software.amazon.smithy.openapi.fromsmithy.mappers;
1717

18+
import java.util.Collections;
1819
import java.util.HashSet;
1920
import java.util.List;
2021
import java.util.Map;
@@ -143,7 +144,7 @@ private OpenApi removeUnusedSecuritySchemes(OpenApi openapi) {
143144

144145
for (PathItem path : openapi.getPaths().values()) {
145146
for (OperationObject operation : path.getOperations().values()) {
146-
for (Map<String, List<String>> entry : operation.getSecurity()) {
147+
for (Map<String, List<String>> entry : operation.getSecurity().orElse(Collections.emptyList())) {
147148
used.addAll(entry.keySet());
148149
}
149150
}

smithy-openapi/src/main/java/software/amazon/smithy/openapi/model/OperationObject.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ private OperationObject(Builder builder) {
5656
responses = Collections.unmodifiableMap(new TreeMap<>(builder.responses));
5757
deprecated = builder.deprecated;
5858
callbacks = Collections.unmodifiableMap(new TreeMap<>(builder.callbacks));
59-
security = ListUtils.copyOf(builder.security);
59+
if (builder.security != null) {
60+
security = ListUtils.copyOf(builder.security);
61+
} else {
62+
security = null;
63+
}
6064
servers = ListUtils.copyOf(builder.servers);
6165
}
6266

@@ -104,8 +108,8 @@ public boolean isDeprecated() {
104108
return deprecated;
105109
}
106110

107-
public List<Map<String, List<String>>> getSecurity() {
108-
return security;
111+
public Optional<List<Map<String, List<String>>>> getSecurity() {
112+
return Optional.ofNullable(security);
109113
}
110114

111115
public List<ServerObject> getServers() {
@@ -139,8 +143,8 @@ protected ObjectNode.Builder createNodeBuilder() {
139143
.collect(ObjectNode.collectStringKeys(Map.Entry::getKey, Map.Entry::getValue)));
140144
}
141145

142-
if (!security.isEmpty()) {
143-
builder.withMember("security", getSecurity().stream()
146+
if (getSecurity().isPresent()) {
147+
builder.withMember("security", getSecurity().get().stream()
144148
.map(map -> map.entrySet().stream()
145149
.sorted(Comparator.comparing(Map.Entry::getKey))
146150
.map(entry -> Pair.of(entry.getKey(), entry.getValue().stream().map(Node::from)
@@ -163,9 +167,8 @@ protected ObjectNode.Builder createNodeBuilder() {
163167

164168
@Override
165169
public Builder toBuilder() {
166-
return builder()
170+
Builder builder = builder()
167171
.extensions(getExtensions())
168-
.security(security)
169172
.callbacks(callbacks)
170173
.responses(responses)
171174
.parameters(parameters)
@@ -177,14 +180,16 @@ public Builder toBuilder() {
177180
.externalDocs(externalDocs)
178181
.operationId(operationId)
179182
.requestBody(requestBody);
183+
getSecurity().ifPresent(builder::security);
184+
return builder;
180185
}
181186

182187
public static final class Builder extends Component.Builder<Builder, OperationObject> {
183188
private final List<String> tags = new ArrayList<>();
184189
private final List<ParameterObject> parameters = new ArrayList<>();
185190
private final Map<String, ResponseObject> responses = new TreeMap<>();
186191
private final Map<String, CallbackObject> callbacks = new TreeMap<>();
187-
private final List<Map<String, List<String>>> security = new ArrayList<>();
192+
private List<Map<String, List<String>>> security;
188193
private final List<ServerObject> servers = new ArrayList<>();
189194
private String summary;
190195
private String description;
@@ -275,12 +280,15 @@ public Builder deprecated(boolean deprecated) {
275280
}
276281

277282
public Builder security(Collection<Map<String, List<String>>> security) {
278-
this.security.clear();
283+
this.security = new ArrayList<>();
279284
this.security.addAll(security);
280285
return this;
281286
}
282287

283288
public Builder addSecurity(Map<String, List<String>> security) {
289+
if (this.security == null) {
290+
this.security = new ArrayList<>();
291+
}
284292
this.security.add(security);
285293
return this;
286294
}

smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiConverterTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.hamcrest.Matchers.empty;
2222
import static org.hamcrest.Matchers.not;
2323

24+
import java.util.Collections;
2425
import java.util.List;
2526
import java.util.Map;
2627
import org.junit.jupiter.api.Assertions;
@@ -206,7 +207,7 @@ public void canOmitSecurityRequirements() {
206207
.convert(model, ShapeId.from("smithy.example#Service"));
207208

208209
assertThat(result.getSecurity(), empty());
209-
assertThat(result.getPaths().get("/2").getGet().get().getSecurity(), empty());
210+
assertThat(result.getPaths().get("/2").getGet().get().getSecurity().orElse(Collections.emptyList()), empty());
210211
}
211212

212213
private static final class ConstantSecurity implements OpenApiMapper {
@@ -231,6 +232,6 @@ public void canChangeSecurityRequirementName() {
231232
.convert(model, ShapeId.from("smithy.example#Service"));
232233

233234
assertThat(result.getSecurity().get(0).keySet(), contains("foo_baz"));
234-
assertThat(result.getPaths().get("/2").getGet().get().getSecurity().get(0).keySet(), contains("foo_baz"));
235+
assertThat(result.getPaths().get("/2").getGet().get().getSecurity().get().get(0).keySet(), contains("foo_baz"));
235236
}
236237
}

0 commit comments

Comments
 (0)