Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Tilde escaped in _urlencode leads to SignatureDoesNotMatch error #64

@lackas

Description

@lackas

See https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html for a list for the unreserved characters for V4 signatures, which includes the ~, however, _urlencode() did also encode those. As a consequence put requests for a key with a tilde in it resulted in SignatureDoesNotMatch errors.
After below fix it works for me. BTW: Amazon uses the same unreserved list as URI::Escape (https://metacpan.org/pod/URI::Escape), so not specifying nothing would also work (as it is used in Net/Amazon/S3/Signature/V4Implementation.pm:
305: map { tr/+/ /; uri_escape( uri_unescape( $_ ) ) } # escape all non-unreserved chars

diff --git a/lib/Net/Amazon/S3.pm b/lib/Net/Amazon/S3.pm
index b74c302..c4edfd2 100755
--- a/lib/Net/Amazon/S3.pm
+++ b/lib/Net/Amazon/S3.pm
@@ -963,7 +963,7 @@ sub _remember_errors {
 
 sub _urlencode {
     my ( $self, $unencoded ) = @_;
-    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_\-\.' );
+    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_\-\.\~' );
 }
 
 1;

I could not test it myself, however, I would also assume that these changes are needed, also:

diff --git a/lib/Net/Amazon/S3/Request/ListMultipartUploads.pm b/lib/Net/Amazon/S3/Request/ListMultipartUploads.pm
index e299e2f..743ea27 100644
--- a/lib/Net/Amazon/S3/Request/ListMultipartUploads.pm
+++ b/lib/Net/Amazon/S3/Request/ListMultipartUploads.pm
@@ -42,7 +42,7 @@ sub http_request {
 
 sub _urlencode {
     my ( $self, $unencoded ) = @_;
-    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_-' );
+    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_\-~' );
 }
 
 1;
diff --git a/lib/Net/Amazon/S3/Request/ListVersions.pm b/lib/Net/Amazon/S3/Request/ListVersions.pm
index ddb78df..68a3588 100644
--- a/lib/Net/Amazon/S3/Request/ListVersions.pm
+++ b/lib/Net/Amazon/S3/Request/ListVersions.pm
@@ -40,7 +40,7 @@ sub http_request {
 
 sub _urlencode {
     my ( $self, $unencoded ) = @_;
-    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_-' );
+    return uri_escape_utf8( $unencoded, '^A-Za-z0-9_\-~' );
 }
 
 1;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions