WSRF-Lite
view release on metacpan or search on metacpan
lib/WSRF/Lite.pm view on Meta::CPAN
$WSRF::WSS::ID_Xpath{To} =
# '<XPath xmlns:wsa="'
# . $WSRF::Constants::WSA
# . '">(//. | //@* | //namespace::*)[ancestor-or-self::wsa:To]</XPath>';
'(//. | //@* | //namespace::*)[ancestor-or-self::wsa:To]';
$WSRF::WSS::ID_Xpath{Action} =
# '<XPath xmlns:wsa="'
# . $WSRF::Constants::WSA
# . '">(//. | //@* | //namespace::*)[ancestor-or-self::wsa:Action]</XPath>';
'(//. | //@* | //namespace::*)[ancestor-or-self::wsa:Action]';
$WSRF::WSS::ID_Xpath{From} =
# '<XPath xmlns:wsa="'
# . $WSRF::Constants::WSA
# . '">(//. | //@* | //namespace::*)[ancestor-or-self::wsa:From]</XPath>';
'(//. | //@* | //namespace::*)[ancestor-or-self::wsa:From]';
$WSRF::WSS::ID_Xpath{ReplyTo} =
# '<XPath xmlns:wsa="'
# . $WSRF::Constants::WSA
# . '">(//. | //@* | //namespace::*)[ancestor-or-self::wsa:ReplyTo]</XPath>';
'(//. | //@* | //namespace::*)[ancestor-or-self::wsa:ReplyTo]';
$WSRF::WSS::ID_Xpath{RelatesTo} =
# '<XPath xmlns:wsa="'
# . $WSRF::Constants::WSA
# . '">(//. | //@* | //namespace::*)[ancestor-or-self::wsa:RelatesTo]</XPath>';
'(//. | //@* | //namespace::*)[ancestor-or-self::wsa:RelatesTo]';
$WSRF::WSS::body_xpath =
#"<XPath xmlns:$SOAP::Constants::PREFIX_ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">"
# . '(//. | //@* | //namespace::*)'
# . "[ancestor-or-self::$SOAP::Constants::PREFIX_ENV:Body]</XPath>";
'(//. | //@* | //namespace::*)' . "[ancestor-or-self::$SOAP::Constants::PREFIX_ENV:Body]";
$WSRF::WSS::priv_key = undef;
$WSRF::WSS::pub_key = undef;
$WSRF::WSS::algorithm = 'sha1';
sub load_priv_key {
if ( defined($WSRF::WSS::priv_key) ) {
if ( ref($WSRF::WSS::priv_key) eq 'CODE' ) {
return $WSRF::WSS::priv_key->();
} else {
return $WSRF::WSS::priv_key;
}
}
eval { require Crypt::OpenSSL::RSA };
die "Failed to access class Crypt::OpenSSL::RSA: $@" if $@;
my $key_file_name =
$ENV{HTTPS_KEY_FILE} ? $ENV{HTTPS_KEY_FILE} : die "No Private Key\n";
open( PRIVKEY, $key_file_name )
|| die("Could not open file $key_file_name");
my $privkey = join "", <PRIVKEY>;
close(PRIVKEY);
Crypt::OpenSSL::RSA->new_private_key($privkey);
}
#returns the cert block between the begin and end delimiters
sub load_cert {
if ( defined($WSRF::WSS::pub_key) ) {
if ( ref($WSRF::WSS::pub_key) eq 'CODE' ) {
return $WSRF::WSS::pub_key->();
} else {
return $WSRF::WSS::pub_key;
}
}
my $cert_file_name =
$ENV{HTTPS_CERT_FILE} ? $ENV{HTTPS_CERT_FILE} : die "No Public Key\n";
open( CERT, $cert_file_name )
|| die("Could not open certificate file $cert_file_name");
my $start = 0;
my $cert = "";
while (<CERT>) {
if ( !m/-----END CERTIFICATE-----/ && $start == 1 ) {
$cert = $cert . $_;
}
if (/-----BEGIN CERTIFICATE-----/) {
$start = 1;
}
}
close(CERT);
return $cert;
}
sub sign {
my $envelope = shift;
eval { require XML::LibXML };
die "Failed to access class XML::LibXML: $@" if $@;
eval { require MIME::Base64 };
die "Failed to access class MIME::Base64: $@" if $@;
#Get Certificate
my $certificate = WSRF::WSS::load_cert();
my $header = "";
my $for_signing =
'<ds:SignedInfo xmlns:ds="' . $WSRF::Constants::DS . '">'
. '<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />'
. '<ds:SignatureMethod Algorithm="' . ($WSRF::WSS::algorithm eq 'sha256' ? 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256' : $WSRF::Constants::DS . 'rsa-sha1') . '"/>';
#search through the envelope for things to sign
foreach my $key ( keys(%WSRF::WSS::ID_Xpath) ) {
next unless (defined $WSRF::WSS::ID_Xpath{$key});
$for_signing .=
WSRF::WSS::make_token( $envelope, $WSRF::WSS::ID_Xpath{$key}, $key )
if defined( $WSRF::WSS::Sign{$key} );
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($envelope);
my $canon = undef;
eval {$canon = $doc->toStringEC14N( 0, $WSRF::WSS::ID_Xpath{$key}, [''] );};
$header .= defined($canon) ? $canon : "";
( run in 2.345 seconds using v1.01-cache-2.11-cpan-98e64b0badf )