# $Id: /mirror/coderepos/lang/perl/Atomik/trunk/lib/Atomik/WSSE.pm 67913 2008-08-06T02:30:36.602415Z daisuke $
package Atomik::WSSE;
use Moose;
use Moose::Util::TypeConstraints;
use DateTime;
use Digest::SHA1 ();
use MIME::Base64 ();
coerce 'Atomik::WSSE'
=> from 'HashRef'
=> via {
return Atomik::WSSE->new(%$_)
}
;
has 'username' => (
is => 'rw',
isa => 'Str',
required => 1,
);
has 'password' => (
is => 'rw',
isa => 'Str',
required => 1,
);
__PACKAGE__->meta->make_immutable;
no Moose;
sub nonce {
Digest::SHA1::sha1( Digest::SHA1::sha1(time(), {}, rand(), $$) )
}
sub set_headers {
my ($self, $request) = @_;
my $nonce = $self->nonce;
my $encoded = MIME::Base64::encode_base64($nonce, '');
my $now = DateTime->now(time_zone => 'UTC')->iso8601;
my $digest = MIME::Base64::encode_base64(
Digest::SHA1::sha1($nonce, $now, $self->password || ''), ''
);
$request->header('X-WSSE', sprintf
qq(UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"),
$self->username || '', $digest, $encoded, $now);
$request->header('Authorization', 'WSSE profile="UsernameToken"');
}
1;