Amazon-S3-Thin
view release on metacpan or search on metacpan
lib/Amazon/S3/Thin.pm view on Meta::CPAN
sub _validate_acl_short {
my ($self, $policy_name) = @_;
if (!grep({$policy_name eq $_}
qw(private public-read public-read-write authenticated-read)))
{
croak "$policy_name is not a supported canned access policy";
}
}
# make the HTTP::Request object
sub _compose_request {
my ($self, $method, $resource, $headers, $content, $metadata) = @_;
croak 'must specify method' unless $method;
croak 'must specify resource' unless defined $resource;
if (ref $resource ne 'Amazon::S3::Thin::Resource') {
croak 'resource must be an instance of Amazon::S3::Thin::Resource';
}
$headers ||= {};
$metadata ||= {};
lib/Amazon/S3/Thin.pm view on Meta::CPAN
if ($self->{signature_version} == 4) {
if ($self->virtual_host) {
$url = $resource->to_virtual_hosted_style_url($protocol);
} else {
$url = $resource->to_path_style_url($protocol, $self->{region});
}
} else {
$url = $resource->to_url_without_region($protocol, $MAIN_HOST);
}
my $request = HTTP::Request->new($method, $url, $http_headers, $content);
# sign the request using the signer, unless already signed
if (!$request->header('Authorization')) {
$self->{signer}->sign($request);
}
return $request;
}
1;
__END__
lib/Amazon/S3/Thin/Signer/V4.pm view on Meta::CPAN
# create a client object
my $s3client = Amazon::S3::Thin->new({
aws_access_key_id => $aws_access_key_id,
aws_secret_access_key => $secret_access_key,
});
# create a signer
my $signer = Amazon::S3::Thin::Signer::V4->new($s3client);
# create a request
my $request = HTTP::Request->new(...);
# sign the request using the client keys
$signer->sign($request);
=head1 DESCRIPTION
This module creates objects that can sign AWS requests using signature version
4, as implemented by the L<AWS::Signature4> module.
=cut
lib/Amazon/S3/Thin/Signer/V4.pm view on Meta::CPAN
credentials => $credentials,
region => $region,
};
bless $self, $class;
}
=head1 METHODS
=head2 sign($request)
Signs supplied L<HTTP::Request> object, adding required AWS headers.
=cut
sub sign
{
my ($self, $request) = @_;
my $signer = $self->signer;
if (defined $self->{credentials}->session_token) {
$request->header('X-Amz-Security-Token', $self->{credentials}->session_token);
}
t/02_signer_v2.t view on Meta::CPAN
use strict;
use warnings;
use Amazon::S3::Thin::Credentials;
use Amazon::S3::Thin::Signer::V2;
use Test::More;
use HTTP::Headers;
use HTTP::Request;
# What this test does is only to calculate signature,
# no HTTP communication.
{
diag "test PUT request";
my $secret = "secretfoobar";
my $verb = "PUT";
my $path = "example/file.txt";
my $hdr = HTTP::Headers->new;
t/02_signer_v2.t view on Meta::CPAN
$string_to_sign,
'string to sign'
);
my $sig = $signer->calculate_signature($verb, $path, $hdr);
is $sig, 'DNEZGsoieTZ92F3bUfSPQcbGmlM=', "puppy unicode keys";
}
{
diag "test sign";
my $request = HTTP::Request->new(GET => 'https://mybucket.s3.amazonaws.com/myfile.txt');
$request->header('Date' => 'Wed, 28 Mar 2007 01:49:49 +0000');
my $credentials = Amazon::S3::Thin::Credentials->new('accesskey', 'secretkey');
my $signer = Amazon::S3::Thin::Signer::V2->new($credentials, 's3.amazonaws.com');
$signer->sign($request);
is_deeply ($request->headers, {
authorization => 'AWS accesskey:Up4jVMLZzEbhnf+Thj0XJ68JREs=',
date => 'Wed, 28 Mar 2007 01:49:49 +0000',
}, 'Request headers');
}
{
diag "test sign (session token)";
my $request = HTTP::Request->new(GET => 'https://mybucket.s3.amazonaws.com/myfile.txt');
$request->header('Date' => 'Wed, 28 Mar 2007 01:49:49 +0000');
my $credentials = Amazon::S3::Thin::Credentials->new('accesskey', 'secretkey', 'sessiontoken');
my $signer = Amazon::S3::Thin::Signer::V2->new($credentials, 's3.amazonaws.com');
$signer->sign($request);
my $headers = $request->headers;
delete $headers->{'::std_case'};
is_deeply ($headers, {
authorization => 'AWS accesskey:jALzlsXtPsSS7qFbE7l2f7Dpx5Y=',
date => 'Wed, 28 Mar 2007 01:49:49 +0000',
'x-amz-security-token' => 'sessiontoken',
t/02_signer_v4.t view on Meta::CPAN
use strict;
use warnings;
use Amazon::S3::Thin::Signer::V4;
use Amazon::S3::Thin::Credentials;
use Test::More;
use HTTP::Request;
my $credentials = Amazon::S3::Thin::Credentials->new('accesskey', 'secretkey');
{
diag "test signer";
my $signer = Amazon::S3::Thin::Signer::V4->new($credentials);
my $signer_signer = $signer->signer;
isa_ok($signer_signer, 'AWS::Signature4', 'signer');
is_deeply($signer_signer, {
access_key => 'accesskey',
secret_key => 'secretkey',
}, 'signer keys');
}
{
diag "test sign";
my $request = HTTP::Request->new(GET => 'https://mybucket.s3.amazonaws.com/myfile.txt');
$request->header('Date' => 'Wed, 28 Mar 2007 01:49:49 +0000');
my $signer = Amazon::S3::Thin::Signer::V4->new($credentials);
$signer->sign($request);
my $headers = [ sort split /\n/, $request->headers->as_string ];
is_deeply ($headers, [
'Authorization: AWS4-HMAC-SHA256 Credential=accesskey/20070328/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=0dea3c9b65eede067ce9e38d48558a63924a6a08a8d21c27cfd7de50e5c78d4b',
'Date: Wed, 28 Mar 2007 01:49:49 +0000',
'Host: mybucket.s3.amazonaws.com',
'X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
'X-Amz-Date: 20070328T014949Z',
], 'Request headers');
}
{
diag "test sign (session token)";
my $request = HTTP::Request->new(GET => 'https://mybucket.s3.amazonaws.com/myfile.txt');
$request->header('Date' => 'Wed, 28 Mar 2007 01:49:49 +0000');
my $credentials = Amazon::S3::Thin::Credentials->new('accesskey', 'secretkey', 'sessiontoken');
my $signer = Amazon::S3::Thin::Signer::V4->new($credentials);
$signer->sign($request);
my $headers = [ sort split /\n/, $request->headers->as_string ];
is_deeply ($headers, [
'Authorization: AWS4-HMAC-SHA256 Credential=accesskey/20070328/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=54a046a4241ef546a30aec8d9e9a1e91c2d095be24baaef1797350cd2cfef2fd',
'Date: Wed, 28 Mar 2007 01:49:49 +0000',
'Host: mybucket.s3.amazonaws.com',
'X-Amz-Content-SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
( run in 0.519 second using v1.01-cache-2.11-cpan-de7293f3b23 )