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 )