Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/xampp/perl/vendor/lib/Win32/Exe/Manifest/ |
######################################################################################### # Package Win32::Exe::Manifest::Parser # Description: XML Parser for Manifests # Created Wed Apr 21 07:54:51 2010 # SVN Id $Id: Parser.pm 2 2010-11-30 16:40:31Z mark.dootson $ # Copyright: Copyright (c) 2010 Mark Dootson # Licence: This program is free software; you can redistribute it # and/or modify it under the same terms as Perl itself ######################################################################################### package Win32::Exe::Manifest::Parser; ######################################################################################### use strict; use warnings; use XML::Simple 2.18; use base qw( XML::Simple ); use Carp; our $VERSION = '0.15'; =head1 NAME Win32::Exe::Manifest::Parser - MSWin Application and Assembly manifest handling =head1 VERSION This document describes version 0.15 of Win32::Exe::Manifest::Parser, released November 30, 2010. =head1 DESCRIPTION This is an internal module from the Win32::Exe distribution supporting parsing of application and assembly manifests. =cut our $BASESCHEMA; $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; sub new { my $class = shift; my $self = $class->SUPER::new(@_); return $self; } sub get_current_schema { $_[0]->{_w32x_current_schema} || $BASESCHEMA; } sub set_current_schema { $_[0]->{_w32x_current_schema} = $_[1]; } #--------------------------------------------------------------- # override XML Simple methods #--------------------------------------------------------------- sub sorted_keys { my($self, $name, $hashref) = @_; my @unsorted = (sort keys(%$hashref)); my $schema = $self->get_current_schema(); my @sorted = sort { _get_key_ordinal($name,$hashref,$a,$schema) <=> _get_key_ordinal($name,$hashref,$b,$schema) } @unsorted; # set indent my ($namenamespace,$lookupname); if($name =~ /:/) { ($namenamespace,$lookupname) = split(/:/, $name, 2); } else { $lookupname = $name; } if($lookupname) { $self->{opt}->{attrindent} = ( $lookupname =~ /^(assemblyIdentity)$/ ) ? 1 : 0; } else { $self->{opt}->{attrindent} = 0; } return ( @sorted ); } #-------------------------------------------------------------- # END XML::Simple overrides #-------------------------------------------------------------- sub _get_key_ordinal { my($name,$hashref,$key, $schema) = @_; # some defaults return 1001 if $key eq 'xmlns'; return 10000 if $key =~ /^xmlns:.+$/; my ($keynamespace,$lookupkey); if($key =~ /:/) { ($keynamespace,$lookupkey) = split(/:/, $key, 2); } else { $lookupkey = $key; } my ($namenamespace,$lookupname); if($name =~ /:/) { ($namenamespace,$lookupname) = split(/:/, $name, 2); } else { $lookupname = $name; } carp qq(UNKNOWN NAMEKEY NAME $name : $lookupname KEY $key : $lookupkey\n) if (!$lookupname || !$lookupkey); if(ref($hashref->{$key})) { return (exists($schema->{elementtypes}->{$lookupname}->{elements}->{$lookupkey}->{order})) ? $schema->{elementtypes}->{$lookupname}->{elements}->{$lookupkey}->{order} : 9999 ; } else { return (exists($schema->{elementtypes}->{$lookupname}->{attributes}->{$lookupkey}->{order})) ? $schema->{elementtypes}->{$lookupname}->{attributes}->{$lookupkey}->{order} : 9999 ; } } sub get_default_manifest { my $self_or_class = shift; my $defman = q(<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" version="0.0.0.0" name="Perl.Win32.Application" /> <description>Perl.Win32.Application</description> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </assembly> ); return $defman; } sub validate_manifest_version { return ($_[1] eq '1.0') ? 1 : 0; } sub validate_string { my ($self, $val) = @_; return 1; } sub validate_class_name { my($this, $name) = @_; return ($name =~ /[^A-Za-z0-9\-_\.]/) ? 0 : 1; } sub validate_type { my($this, $type) = @_; return ( $type eq 'win32'); # specification demands lower case } sub validate_public_key { my ($this, $key) = @_; return 1; } sub validate_language { my ($self, $lang) = @_; return 1; } sub validate_architecture { my ($this, $arch) = @_; return 1 if $arch eq '*'; # many files seem to uppercase X86 so we'll accept case insensitive data return 1 if $arch =~ /^(x86|msil|ia64|amd64)$/i; return 0; } sub validate_yesno { my ($this, $val) = @_; return ( $val =~ /^(yes|no)$/) ? 1 : 0; } sub validate_truefalse { my ($this, $val) = @_; return ( $val =~ /^(true|false)$/) ? 1 : 0; } sub validate_clsid { my ($this, $clsid) = @_; return ( $clsid =~ /^\{[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}\}$/ ) ? 1 : 0; } sub validate_int4 { my ($this, $int) = @_; return ( $int =~ /^\d{1,4}$/) ? 1 : 0; } sub validate_int8 { my ($this, $int) = @_; return ( $int =~ /^\d{1,8}$/) ? 1 : 0; } sub validate_flags { my ($this, $flags) = @_; return ( $flags =~ /^(control|hidden|restricted|hasdiskimage)$/i ) ? 1 : 0; } sub validate_level { my ($this, $level) = @_; return ( $level =~ /^(asInvoker|highestAvailable|requireAdministrator)$/ ) ? 1 : 0; } sub validate_hashalg { my ($this, $alg) = @_; return ( $alg =~ /^(SHA1|SHA|MD5|MD4|MD2)$/i ) ? 1 : 0; } sub validate_thread_model { my ($this, $model) = @_; return ( $model =~ /^(Apartment|Free|Both|Neutral)$/i ) ? 1 : 0; } sub validate_hex { my ($this, $hex) = @_; return 1; } sub validate_osid { my ($this, $osid) = @_; return 1 if $osid eq '{e2011457-1546-43c5-a5fe-008deee3d3f0}'; # Windows Vista Compatibility return 1 if $osid eq '{35138b9a-5d96-4fbd-8e2d-a2440225f93a}'; # Windows 7 Compatibility return 0; } sub validate_miscstatus { my ($this, $status) = @_; my @vals = split(/\s*,\s*/, $status); my @allowednames = qw( recomposeonresize onlyiconic insertnotreplace static cantlinkinside canlinkbyole1 islinkobject insideout activatewhenvisible renderingisdeviceindependent invisibleatruntime alwaysrun actslikebutton actslikelabel nouiactivate alignable simpleframe setclientsitefirst imemode ignoreativatewhenvisible wantstomenumerge supportsmultilevelundo ); my %allowed; @allowed{@allowednames} = (); my $returnval = 1; for (@vals) { $returnval = (exists($allowed{$_})) ? 1 : 0; last if !$returnval; } return $returnval; } $BASESCHEMA = __PACKAGE__->get_default_schema(); sub get_default_schema { my $self_or_class = shift; my $schema = { namespace => { 'urn:schemas-microsoft-com:compatibility.v1' => 'cmpv1', 'urn:schemas-microsoft-com:asm.v1' => 'asmv1', 'urn:schemas-microsoft-com:asm.v2' => 'asmv2', 'urn:schemas-microsoft-com:asm.v3' => 'asmv3', }, nstranslation => { cmpv1 => 'cmpv1', asmv1 => 'asmv1', asmv2 => 'asmv2', asmv3 => 'asmv3', }, namespacelookup => { cmpv1 => 'urn:schemas-microsoft-com:compatibility.v1', asmv1 => 'urn:schemas-microsoft-com:asm.v1', asmv2 => 'urn:schemas-microsoft-com:asm.v2', asmv3 => 'urn:schemas-microsoft-com:asm.v3', }, attributes => { manifestVersion => 'validate_manifest_version', name => 'validate_class_name', type => 'validate_type', publicKeyToken => 'validate_public_key', language => 'validate_language', processorArchitecture => 'validate_architecture', version => 'validate_string', optional => 'validate_yesno', clsid => 'validate_clsid', description => 'validate_string', threadingModel => 'validate_thread_model', tlbid => 'validate_clsid', progid => 'validate_string', helpdir => 'validate_string', iid => 'validate_clsid', numMethods => 'validate_int4', resourceid => 'validate_string', flags => 'validate_flags', hashalg => 'validate_hashalg', hash => 'validate_hex', proxyStubClsid32 => 'validate_string', baseInterface => 'validate_clsid', versioned => 'validate_yesno', oldVersion => 'validate_string', newVersion => 'validate_string', size => 'validate_int8', runtimeVersion => 'validate_string', Id => 'validate_osid', xmlns => 'validate_string', level => 'validate_level', uiAccess => 'validate_truefalse', miscStatus => 'validate_miscstatus', miscStatusIcon => 'validate_miscstatus', miscStatusContent => 'validate_miscstatus', miscStatusDocprint => 'validate_miscstatus', miscStatusThumbnail => 'validate_miscstatus', }, elementtypes => { assembly => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { xmlns => { required => 1, default => 'urn:schemas-microsoft-com:asm.v1', }, manifestVersion => { required => 1, default => '1.0', order => 1002, }, }, elements => { # files, even from Microsoft, sometimes don't have an assemblyIdentity assemblyIdentity => { min => 0, max => 1, order => 10, }, compatibility => { min => 0, max => 1, order => 64, }, application => { min => 0, max => 1, order => 66, }, description => { min => 0, max => 1, order => 20, }, noInherit => { min => 0, max => 1, order => 30, }, noInheritable => { min => 0, max => 1, order => 40, }, comInterfaceExternalProxyStub => { min => 0, max => 0, order => 50, }, dependency => { min => 0, max => 0, order => 60, }, file => { min => 0, max => 0, order => 70, }, clrClass => { min => 0, max => 0, order => 80, }, clrSurrogate => { min => 0, max => 0, order => 90, }, trustInfo => { min => 0, max => 1, order => 62, }, windowClass => { min => 0, max => 1, order => 150, }, }, }, trustInfo => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { xmlns => { required => 1, default => 'urn:schemas-microsoft-com:asm.v3', }, }, elements => { security => { min => 1, max => 1, order => 10 }, }, }, security => { exclusive => 'none', content => { elements => 1, attributes => 0, value => 0 }, value_validator => undef, attributes => { }, elements => { requestedPrivileges => { min => 1, max => 1, order => 10, }, }, }, requestedPrivileges => { exclusive => 'none', content => { elements => 1, attributes => 0, value => 0 }, value_validator => undef, attributes => { }, elements => { requestedExecutionLevel => { min => 1, max => 1 , order => 10, }, }, }, requestedExecutionLevel => { exclusive => 'none', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { level => { required => 1, default => 'asInvoker', order => 1002, }, uiAccess => { required => 0, default => 'false', order => 1003, }, }, elements => { }, }, compatibility => { exclusive => 'application', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { xmlns => { required => 1, default => 'urn:schemas-microsoft-com:compatibility.v1', }, }, elements => { application => { min => 1, max => 1, order => 10, }, }, }, application => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { xmlns => { required => 0, default => 'urn:schemas-microsoft-com:asm.v3', }, }, elements => { supportedOS => { min => 0, max => 0, order => 10 }, windowsSettings => { min => 0, max => 0, order => 10 }, }, }, supportedOS => { exclusive => 'none', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { Id => { required => 1, # Windows Vista Compatibility Key default => '{e2011457-1546-43c5-a5fe-008deee3d3f0}', order => 1002, }, }, elements => { }, }, clrClass => { exclusive => 'assembly', content => { elements => 1, attributes => 0, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1002, }, clsid => { required => 1, default => undef, order => 1003, }, progid => { required => 0, default => undef, order => 1004, }, tlbid => { required => 0, default => undef, order => 1005, }, description => { required => 0, default => undef, order => 1006, }, runtimeVersion => { required => 0, default => undef, order => 1007, }, threadingModel => { required => 0, default => undef, order => 1008, }, }, elements => { progid => { min => 0, max => 0, order => 10 }, }, }, clrSurrogate => { exclusive => 'assembly', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1002, }, clsid => { required => 1, default => undef, order => 1003, }, runtimeVersion => { required => 0, default => undef, order => 1004, }, }, elements => { }, }, assemblyIdentity => { exclusive => 'none', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1003, }, version => { required => 0, default => '0.0.0.0', order => 1004, }, type => { required => 0, default => 'win32', order => 1002, }, processorArchitecture => { required => 0, default => '*', order => 1006, }, publicKeyToken => { required => 0, default => undef, order => 1007, }, language => { required => 0, default => undef, order => 1005, }, }, elements => { }, }, comInterfaceProxyStub => { exclusive => 'assembly', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1003, }, iid => { required => 1, default => undef, order => 1002, }, tblid => { required => 0, default => undef, order => 1004, }, numMethods => { required => 0, default => undef, order => 1006, }, proxyStubClsid32 => { required => 0, default => undef, order => 1007, }, baseInterface => { required => 0, default => undef, order => 1005, }, threadingModel => { required => 0, default => undef, order => 1008, }, }, elements => { }, }, description => { exclusive => 'none', content => { elements => 0, attributes => 0, value => 1 }, value_validator => 'validate_string', attributes => { }, elements => { }, }, dependency => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { optional => { required => 0, default => 'no', order => 1002, }, }, elements => { dependentAssembly => { min => 0, max => 1, order => 10 }, } }, dependentAssembly => { exclusive => 'none', content => { elements => 1, attributes => 0, value => 0 }, value_validator => undef, attributes => { }, elements => { assemblyIdentity => { min => 1, max => 1, order => 10 }, bindingRedirect => { min => 0, max => 0, order => 20 }, }, }, bindingRedirect => { exclusive => 'application', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { oldVersion => { required => 1, default => undef, order => 1002, }, newVersion => { required => 1, default => undef, order => 1003, }, }, elements => { }, }, file => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1002, }, hash => { required => 0, default => undef, order => 1004, }, hashalg => { required => 0, default => undef, order => 1003, }, size => { required => 0, default => undef, order => 1005, }, }, elements => { comClass => { min => 0, max => 0, order => 10, }, comInterfaceProxyStub => { min => 0, max => 0, order => 20, }, typelib => { min => 0, max => 0, order => 30, }, windowClass => { min => 0, max => 0, order => 40, }, }, }, comClass => { exclusive => 'assembly', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { clsid => { required => 1, default => undef, order => 1003, }, threadingModel => { required => 0, default => undef, order => 1004, }, progid => { required => 0, default => undef, order => 1003, }, tlbid => { required => 0, default => undef, order => 1005, }, description => { required => 0, default => undef, order => 1002, }, miscStatus => { required => 0, default => undef, order => 1006, }, miscStatusIcon => { required => 0, default => undef, order => 1007, }, miscStatusDocprint => { required => 0, default => undef, order => 1008, }, miscStatusContent => { required => 0, default => undef, order => 1009, }, musStatusThumbnail => { required => 0, default => undef, order => 1010, }, }, elements => { progid => { min => 0, max => 0, order => 10, }, }, }, comInterfaceExternalProxyStub => { exclusive => 'assembly', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { name => { required => 1, default => undef, order => 1005, }, iid => { required => 1, default => undef, order => 1002, }, tblid => { required => 0, default => undef, order => 1006, }, numMethods => { required => 0, default => undef, order => 1004, }, proxyStubClsid32 => { required => 0, default => undef, order => 1007, }, baseInterface => { required => 0, default => undef, order => 1003, }, }, elements => { }, }, typelib => { exclusive => 'assembly', content => { elements => 0, attributes => 1, value => 0 }, value_validator => undef, attributes => { tblid => { required => 1, default => undef, order => 1002, }, version => { required => 1, default => undef, order => 1003, }, helpdir => { required => 1, default => '', order => 1004, }, resourceid => { required => 0, default => undef, order => 1006, }, flags => { required => 0, default => undef, order => 1005, }, }, elements => { }, }, windowClass => { exclusive => 'assembly', content => { elements => 0, attributes => 1, value => 1 }, value_validator => 'validate_class_name', attributes => { versioned => { required => 1, default => 'yes', order => 1002, }, }, elements => { }, }, noInherit => { exclusive => 'application', content => { elements => 0, attributes => 0, value => 0 }, value_validator => undef, attributes => { }, elements => { }, }, noInheritable => { exclusive => 'assembly', content => { elements => 0, attributes => 0, value => 0 }, value_validator => undef, attributes => { }, elements => { }, }, progid => { exclusive => 'assembly', content => { elements => 0, attributes => 0, value => 1 }, value_validator => 'validate_class_name', attributes => { }, elements => { }, }, windowsSettings => { exclusive => 'none', content => { elements => 1, attributes => 1, value => 0 }, value_validator => undef, attributes => { xmlns => { required => 1, default => 'http://schemas.microsoft.com/SMI/2005/WindowsSettings', }, }, elements => { dpiAware => { min => 0, max => 1, order => 10 }, }, }, dpiAware => { exclusive => 'none', content => { elements => 0, attributes => 0, value => 1 }, value_validator => 'validate_truefalse', attributes => { }, elements => { }, }, }, }; return $schema; } 1; __END__ =head1 SEE ALSO Win32::Exe::Manifest =head1 AUTHORS Mark Dootson E<lt>mdootson@cpan.orgE<gt> =head1 COPYRIGHT & LICENSE Copyright 2010 by Mark Dootson E<lt>mdootson@cpan.orgE<gt> This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L<http://www.perl.com/perl/misc/Artistic.html> =cut