Skip to content

Commit 6e33568

Browse files
authored
Fix signing bug in CFKVS service (#2452)
1 parent a7db106 commit 6e33568

File tree

8 files changed

+244
-0
lines changed

8 files changed

+244
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package software.amazon.smithy.aws.go.codegen.customization;
2+
3+
import java.util.List;
4+
import java.util.ArrayList;
5+
import software.amazon.smithy.aws.go.codegen.AddAwsConfigFields;
6+
import software.amazon.smithy.aws.go.codegen.AwsGoDependency;
7+
import software.amazon.smithy.aws.go.codegen.AwsSignatureVersion4;
8+
import software.amazon.smithy.aws.go.codegen.AwsSignatureVersion4aUtils;
9+
import software.amazon.smithy.aws.traits.ServiceTrait;
10+
import software.amazon.smithy.aws.traits.auth.SigV4ATrait;
11+
import software.amazon.smithy.aws.traits.auth.SigV4Trait;
12+
import software.amazon.smithy.codegen.core.Symbol;
13+
import software.amazon.smithy.codegen.core.SymbolProvider;
14+
import software.amazon.smithy.go.codegen.GoDelegator;
15+
import software.amazon.smithy.go.codegen.GoSettings;
16+
import software.amazon.smithy.go.codegen.GoWriter;
17+
import software.amazon.smithy.go.codegen.SmithyGoDependency;
18+
import software.amazon.smithy.go.codegen.SymbolUtils;
19+
import software.amazon.smithy.go.codegen.integration.ConfigField;
20+
import software.amazon.smithy.go.codegen.integration.ConfigFieldResolver;
21+
import software.amazon.smithy.go.codegen.integration.GoIntegration;
22+
import software.amazon.smithy.go.codegen.integration.MiddlewareRegistrar;
23+
import software.amazon.smithy.go.codegen.integration.RuntimeClientPlugin;
24+
import software.amazon.smithy.model.Model;
25+
import software.amazon.smithy.model.shapes.ServiceShape;
26+
import software.amazon.smithy.model.traits.AuthTrait;
27+
import software.amazon.smithy.utils.ListUtils;
28+
import software.amazon.smithy.utils.SetUtils;
29+
30+
/**
31+
* This integration configures the CloudFront Key Value Store client for Signature Version 4a
32+
*/
33+
public class CloudFrontKVSSigV4a implements GoIntegration {
34+
/**
35+
* Return true if service is CFKVS.
36+
*
37+
* @param model is the generation model.
38+
* @param service is the service shape being audited.
39+
*/
40+
private static boolean isCFKVSService(Model model, ServiceShape service) {
41+
final String sdkId = service.expectTrait(ServiceTrait.class).getSdkId();
42+
final String serviceId = sdkId.replace("-", "").replace(" ", "").toLowerCase();
43+
return serviceId.equalsIgnoreCase("cloudfrontkeyvaluestore");
44+
}
45+
46+
private final List<RuntimeClientPlugin> runtimeClientPlugins = new ArrayList<>();
47+
48+
49+
@Override
50+
public List<RuntimeClientPlugin> getClientPlugins() {
51+
return runtimeClientPlugins;
52+
}
53+
54+
@Override
55+
public Model preprocessModel(Model model, GoSettings settings) {
56+
ServiceShape service = settings.getService(model);
57+
if (!isCFKVSService(model, service)) {
58+
return model;
59+
}
60+
61+
if (settings.getService(model).hasTrait(SigV4ATrait.class)) {
62+
return model;
63+
}
64+
65+
var v4a = SigV4ATrait.builder()
66+
.name(service.expectTrait(SigV4Trait.class).getName())
67+
.build();
68+
69+
return model.toBuilder()
70+
.addShape(
71+
service.toBuilder()
72+
.addTrait(v4a)
73+
// FUTURE: https://github.com/aws/smithy-go/issues/493
74+
// we are keeping sigv4 at the end of this list (it will never be selected)
75+
// as a stopgap to drive codegen of payload checksum routines
76+
.addTrait(new AuthTrait(SetUtils.of(SigV4ATrait.ID, SigV4Trait.ID)))
77+
.build()
78+
)
79+
.build();
80+
}
81+
82+
@Override
83+
public void processFinalizedModel(GoSettings settings, Model model) {
84+
if (!isCFKVSService(model, settings.getService(model))) {
85+
return;
86+
}
87+
runtimeClientPlugins.add(
88+
RuntimeClientPlugin.builder()
89+
.configFields(
90+
ListUtils.of(
91+
ConfigField.builder()
92+
.name(AwsSignatureVersion4aUtils.V4A_SIGNER_INTERFACE_NAME)
93+
.type(SymbolUtils.buildPackageSymbol(
94+
AwsSignatureVersion4aUtils.V4A_SIGNER_INTERFACE_NAME)
95+
)
96+
.documentation("Signature Version 4a (SigV4a) Signer")
97+
.build()
98+
)
99+
)
100+
.build());
101+
runtimeClientPlugins.add(
102+
RuntimeClientPlugin.builder()
103+
.servicePredicate(CloudFrontKVSSigV4a::isCFKVSService)
104+
.addConfigFieldResolver(
105+
ConfigFieldResolver.builder()
106+
.location(ConfigFieldResolver.Location.CLIENT)
107+
.target(ConfigFieldResolver.Target.INITIALIZATION)
108+
.resolver(SymbolUtils.createValueSymbolBuilder(
109+
AwsSignatureVersion4aUtils.SIGNER_RESOLVER).build())
110+
.build())
111+
.build());
112+
}
113+
114+
@Override
115+
public void writeAdditionalFiles(
116+
GoSettings settings,
117+
Model model,
118+
SymbolProvider symbolProvider,
119+
GoDelegator goDelegator
120+
) {
121+
122+
if (!isCFKVSService(model, model.expectShape(settings.getService(), ServiceShape.class))) {
123+
return;
124+
}
125+
126+
ServiceShape serviceShape = settings.getService(model);
127+
goDelegator.useShapeWriter(serviceShape, writer -> {
128+
writerSignerInterface(writer);
129+
writerConfigFieldResolver(writer, serviceShape);
130+
writeNewV4ASignerFunc(writer, serviceShape);
131+
});
132+
133+
}
134+
135+
136+
private void writerSignerInterface(GoWriter writer) {
137+
AwsSignatureVersion4aUtils.writerSignerInterface(writer);
138+
}
139+
140+
private void writeNewV4ASignerFunc(GoWriter writer, ServiceShape serviceShape) {
141+
AwsSignatureVersion4aUtils.writeNewV4ASignerFunc(writer, serviceShape);
142+
}
143+
144+
private void writerConfigFieldResolver(GoWriter writer, ServiceShape serviceShape) {
145+
AwsSignatureVersion4aUtils.writerConfigFieldResolver(writer, serviceShape);
146+
}
147+
148+
}

codegen/smithy-aws-go-codegen/src/main/java/software/amazon/smithy/aws/go/codegen/customization/auth/BackfillSigV4ATrait.java

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public Model preprocessModel(Model model, GoSettings settings) {
4141
return model;
4242
}
4343

44+
if (settings.getService(model).hasTrait(SigV4ATrait.class)) {
45+
return model;
46+
}
47+
4448
var v4a = SigV4ATrait.builder()
4549
.name(service.expectTrait(SigV4Trait.class).getName())
4650
.build();

codegen/smithy-aws-go-codegen/src/main/resources/META-INF/services/software.amazon.smithy.go.codegen.integration.GoIntegration

+1
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,4 @@ software.amazon.smithy.aws.go.codegen.customization.auth.S3ExpressAuthScheme
7373
software.amazon.smithy.aws.go.codegen.customization.S3BucketContext
7474
software.amazon.smithy.aws.go.codegen.customization.s3.ExpressDefaultChecksum
7575
software.amazon.smithy.aws.go.codegen.customization.auth.GlobalAnonymousOption
76+
software.amazon.smithy.aws.go.codegen.customization.CloudFrontKVSSigV4a

service/cloudfrontkeyvaluestore/api_client.go

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/cloudfrontkeyvaluestore/auth.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/cloudfrontkeyvaluestore/generated.json

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"github.com/aws/aws-sdk-go-v2": "v1.4.0",
44
"github.com/aws/aws-sdk-go-v2/internal/configsources": "v0.0.0-00010101000000-000000000000",
55
"github.com/aws/aws-sdk-go-v2/internal/endpoints/v2": "v2.0.0-00010101000000-000000000000",
6+
"github.com/aws/aws-sdk-go-v2/internal/v4a": "v0.0.0-00010101000000-000000000000",
67
"github.com/aws/smithy-go": "v1.4.0",
78
"github.com/google/go-cmp": "v0.5.4"
89
},

service/cloudfrontkeyvaluestore/go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/aws/aws-sdk-go-v2 v1.24.1
77
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10
88
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10
9+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10
910
github.com/aws/smithy-go v1.19.0
1011
github.com/google/go-cmp v0.5.8
1112
)
@@ -15,3 +16,5 @@ replace github.com/aws/aws-sdk-go-v2 => ../../
1516
replace github.com/aws/aws-sdk-go-v2/internal/configsources => ../../internal/configsources/
1617

1718
replace github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 => ../../internal/endpoints/v2/
19+
20+
replace github.com/aws/aws-sdk-go-v2/internal/v4a => ../../internal/v4a/

service/cloudfrontkeyvaluestore/options.go

+48
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)