Net-Domain-TMCH

 view release on metacpan or  search on metacpan

lib/Net/Domain/SMD/Schema.pm  view on Meta::CPAN

$VERSION = '0.18';

use base 'Exporter';

our @EXPORT_OK   = qw/SMD10_NS MARK10_NS/;
our %EXPORT_TAGS =
  ( ns10 => [ qw/SMD10_NS MARK10_NS/ ]
  );

use Log::Report                  'net-domain-smd';
use XML::Compile::Cache          ();
use XML::Compile::WSS::Signature ();
use XML::Compile::WSS::Util      qw(DSIG_NS DSIGM_RSA_SHA256);
use Net::Domain::SMD::File       ();
use File::Basename               qw(dirname);
use Scalar::Util                 qw(blessed);

use constant
  { SMD10_NS  => 'urn:ietf:params:xml:ns:signedMark-1.0'
  , MARK10_NS => 'urn:ietf:params:xml:ns:mark-1.0'
  };

my %prefixes =
  ( ds   => DSIG_NS   # do not take this prefix from these schemas
  , smd  => SMD10_NS
  , mark => MARK10_NS
  );


sub new($%) { my ($class, %args) = @_; (bless {}, $class)->init(\%args) }
sub init($)
{   my ($self, $args) = @_;

    my $xsddir = (dirname __FILE__) . '/xsd';
    my @xsds   =
      ( "$xsddir/mark-1.0.xsd"
      , "$xsddir/mark-1.0-bugs.xsd"
      , "$xsddir/signedMark-1.0.xsd"
      , "$xsddir/signedMark-1.0-bugs.xsd"
      );

    my $schemas = $self->{NDSS_schemas}
      = XML::Compile::Cache->new(\@xsds, prefixes => \%prefixes);

    # do not prefix 'mark', because the accesses it all the time.
    $schemas->addKeyRewrite('PREFIXED(smd)');

    my $cert    = $args->{tmv_certificate};
    if(defined $cert)
    {   blessed $cert && $cert->isa('Crypt::OpenSSL::X509')
            or error __x"incorrect tmv_certificate parameter, expect {pkg}"
                , pkg => 'Crypt::OpenSSL::X509';
    }

    my $prepare = $cert ? 'ALL' : 'READER';

    my @w_opts;
    if($cert)
    {   push @w_opts
          , token         => $cert
          , private_key   => undef   #XXX Work in progress
          , publish_token => 'X509DATA'
          , sign_info     =>
             { sign_method => DSIGM_RSA_SHA256
#            , private_key => $tmv_key
             }
    }

    my $sig = XML::Compile::WSS::Signature->new
      ( schema     => $schemas
      , prepare    => $prepare
      , sign_types => [ 'smd:signedMarkType', 'ds:KeyInfoType' ]
      , sign_put   => 'smd:signedMarkType'   # enveloped-signature
      , @w_opts
      );

    $schemas->addHook
      ( action => 'READER', type => 'xsd:dateTime'
      , after => sub { Net::Domain::SMD->date2time($_[1]) }
      ) if $args->{auto_datetime};

    $self;
}

#-------------------------


sub schemas()     {shift->{NDSS_schemas}}

#-------------------------


sub from($%)
{   my ($self, $xml, %args) = @_;

    return ($self->read($xml, %args), $xml)
        if $xml !~ m/\n/ && -f $xml;

    my $source;
    unless(blessed $xml && $xml->isa('XML::LibXML::Node'))
    {   $xml      = XML::LibXML->load_xml(string => $xml);
        $source   = 'string';
    }

    if($xml->isa('XML::LibXML::Document'))
    {   $xml      = $xml->documentElement;
        $source ||= 'document';
    }

    my $smd   = Net::Domain::SMD->fromNode($xml, schemas => $self->schemas);
    $source ||= 'element';

    ($smd, $source);
}


sub read($)
{   my ($self, $fn) = @_;
    Net::Domain::SMD::File->fromFile($fn, schemas => $self->schemas);
}


sub createSignedMark($$$)
{   my ($self, $doc, $data, $args) = @_;



( run in 0.854 second using v1.01-cache-2.11-cpan-39bf76dae61 )