Skip to content

fix(signature-v4-multi-region): report available sigv4a dependency #7113

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
resolveAwsSdkSigV4AConfig,
resolveAwsSdkSigV4Config,
} from "@aws-sdk/core";
import { signatureV4CrtContainer } from "@aws-sdk/signature-v4-multi-region";
import { SignatureV4MultiRegion } from "@aws-sdk/signature-v4-multi-region";
import { EndpointParameterInstructions, resolveParams } from "@smithy/middleware-endpoint";
import {
EndpointV2,
Expand Down Expand Up @@ -248,7 +248,7 @@ const createEndpointRuleSetHttpAuthSchemeProvider = <
const name = s.name.toLowerCase();
return name !== "sigv4a" && name.startsWith("sigv4");
});
if (!signatureV4CrtContainer.CrtSignerV4 && sigv4Present) {
if (SignatureV4MultiRegion.sigv4aDependency() === "none" && sigv4Present) {
// sigv4a -> sigv4 fallback.
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
resolveAwsSdkSigV4AConfig,
resolveAwsSdkSigV4Config,
} from "@aws-sdk/core";
import { signatureV4CrtContainer } from "@aws-sdk/signature-v4-multi-region";
import { SignatureV4MultiRegion } from "@aws-sdk/signature-v4-multi-region";
import { EndpointParameterInstructions, resolveParams } from "@smithy/middleware-endpoint";
import {
EndpointV2,
Expand Down Expand Up @@ -236,7 +236,7 @@ const createEndpointRuleSetHttpAuthSchemeProvider = <
const name = s.name.toLowerCase();
return name !== "sigv4a" && name.startsWith("sigv4");
});
if (!signatureV4CrtContainer.CrtSignerV4 && sigv4Present) {
if (SignatureV4MultiRegion.sigv4aDependency() === "none" && sigv4Present) {
// sigv4a -> sigv4 fallback.
continue;
}
Expand Down
4 changes: 2 additions & 2 deletions clients/client-s3/src/auth/httpAuthSchemeProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
resolveAwsSdkSigV4AConfig,
resolveAwsSdkSigV4Config,
} from "@aws-sdk/core";
import { signatureV4CrtContainer } from "@aws-sdk/signature-v4-multi-region";
import { SignatureV4MultiRegion } from "@aws-sdk/signature-v4-multi-region";
import { EndpointParameterInstructions, resolveParams } from "@smithy/middleware-endpoint";
import {
EndpointV2,
Expand Down Expand Up @@ -235,7 +235,7 @@ const createEndpointRuleSetHttpAuthSchemeProvider = <
const name = s.name.toLowerCase();
return name !== "sigv4a" && name.startsWith("sigv4");
});
if (!signatureV4CrtContainer.CrtSignerV4 && sigv4Present) {
if (SignatureV4MultiRegion.sigv4aDependency() === "none" && sigv4Present) {
// sigv4a -> sigv4 fallback.
continue;
}
Expand Down
4 changes: 2 additions & 2 deletions clients/client-sesv2/src/auth/httpAuthSchemeProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
resolveAwsSdkSigV4AConfig,
resolveAwsSdkSigV4Config,
} from "@aws-sdk/core";
import { signatureV4CrtContainer } from "@aws-sdk/signature-v4-multi-region";
import { SignatureV4MultiRegion } from "@aws-sdk/signature-v4-multi-region";
import { EndpointParameterInstructions, resolveParams } from "@smithy/middleware-endpoint";
import {
EndpointV2,
Expand Down Expand Up @@ -235,7 +235,7 @@ const createEndpointRuleSetHttpAuthSchemeProvider = <
const name = s.name.toLowerCase();
return name !== "sigv4a" && name.startsWith("sigv4");
});
if (!signatureV4CrtContainer.CrtSignerV4 && sigv4Present) {
if (SignatureV4MultiRegion.sigv4aDependency() === "none" && sigv4Present) {
// sigv4a -> sigv4 fallback.
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ interface EndpointRuleSetHttpAuthSchemeProvider<
HttpAuthSchemeParametersT extends HttpAuthSchemeParameters
> extends HttpAuthSchemeProvider<EndpointParametersT & HttpAuthSchemeParametersT> { }""");
w.addDependency(TypeScriptDependency.SMITHY_TYPES);
w.addImport("signatureV4CrtContainer", null, AwsDependency.SIGNATURE_V4_MULTIREGION);
w.addImport("SignatureV4MultiRegion", null, AwsDependency.SIGNATURE_V4_MULTIREGION);
w.addImport("Logger", null, TypeScriptDependency.SMITHY_TYPES);
w.addImport("EndpointV2", null, TypeScriptDependency.SMITHY_TYPES);
w.writeDocs("@internal");
Expand Down Expand Up @@ -419,7 +419,7 @@ interface DefaultEndpointResolver<EndpointParametersT extends EndpointParameters
const name = s.name.toLowerCase();
return name !== "sigv4a" && name.startsWith("sigv4");
});
if (!signatureV4CrtContainer.CrtSignerV4 && sigv4Present) {
if (SignatureV4MultiRegion.sigv4aDependency() === "none" && sigv4Present) {
// sigv4a -> sigv4 fallback.
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,8 @@ describe("SignatureV4MultiRegion (Browser Bundle SigV4a Test)", () => {
"This scenario is covered in source unit tests."
);
});

it("should correctly identify JS SigV4a implementation in browser environment", () => {
expect(SignatureV4MultiRegion.sigv4aDependency()).toBe("js");
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,32 @@ describe("SignatureV4MultiRegion", () => {
vi.clearAllMocks();
});

describe("sigv4aDependency", () => {
it("should return 'crt' when CrtSignerV4 is available", () => {
signatureV4CrtContainer.CrtSignerV4 = CrtSignerV4 as any;
signatureV4aContainer.SignatureV4a = null;
expect(SignatureV4MultiRegion.sigv4aDependency()).toBe("crt");
});

it("should return 'crt' when CrtSignerV4 and SignatureV4a are available", () => {
signatureV4CrtContainer.CrtSignerV4 = CrtSignerV4 as any;
signatureV4aContainer.SignatureV4a = SignatureV4a as any;
expect(SignatureV4MultiRegion.sigv4aDependency()).toBe("crt");
});

it("should return 'js' when only SignatureV4a is available", () => {
signatureV4CrtContainer.CrtSignerV4 = null;
signatureV4aContainer.SignatureV4a = SignatureV4a as any;
expect(SignatureV4MultiRegion.sigv4aDependency()).toBe("js");
});

it("should return 'none' when neither implementation is available", () => {
signatureV4CrtContainer.CrtSignerV4 = null;
signatureV4aContainer.SignatureV4a = null;
expect(SignatureV4MultiRegion.sigv4aDependency()).toBe("none");
});
});

it("should sign with SigV4 signer", async () => {
const signer = new SignatureV4MultiRegion(params);
await signer.sign(minimalRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ export class SignatureV4MultiRegion implements RequestPresigner, RequestSigner {
private readonly sigv4Signer: SignatureV4S3Express;
private readonly signerOptions: SignatureV4MultiRegionInit;

public static sigv4aDependency(): "none" | "js" | "crt" {
if (typeof signatureV4CrtContainer.CrtSignerV4 === "function") {
return "crt";
} else if (typeof signatureV4aContainer.SignatureV4a === "function") {
return "js";
}
return "none";
}

constructor(options: SignatureV4MultiRegionInit) {
this.sigv4Signer = new SignatureV4S3Express(options);
this.signerOptions = options;
Expand Down
Loading