diff options
Diffstat (limited to 'Master/tlpkg/tlperl/lib/Win32/FileSecurity.pm')
-rw-r--r-- | Master/tlpkg/tlperl/lib/Win32/FileSecurity.pm | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/Win32/FileSecurity.pm b/Master/tlpkg/tlperl/lib/Win32/FileSecurity.pm new file mode 100644 index 00000000000..6c6e5865336 --- /dev/null +++ b/Master/tlpkg/tlperl/lib/Win32/FileSecurity.pm @@ -0,0 +1,308 @@ +package Win32::FileSecurity; + +# +# FileSecurity.pm +# By Monte Mitzelfelt, monte@conchas.nm.org +# Larry Wall's Artistic License applies to all related Perl +# and C code for this module +# Thanks to the guys at ActiveWare! +# ver 0.67 ALPHA 1997.07.07 +# + +require Exporter; +require DynaLoader; +use Carp ; + +$VERSION = '1.04'; + +require Win32 unless defined &Win32::IsWinNT; +croak "The Win32::FileSecurity module works only on Windows NT" unless Win32::IsWinNT(); + +@ISA= qw( Exporter DynaLoader ); + +require Exporter ; +require DynaLoader ; + +@ISA = qw(Exporter DynaLoader) ; +@EXPORT_OK = qw( + Get + Set + EnumerateRights + MakeMask + DELETE + READ_CONTROL + WRITE_DAC + WRITE_OWNER + SYNCHRONIZE + STANDARD_RIGHTS_REQUIRED + STANDARD_RIGHTS_READ + STANDARD_RIGHTS_WRITE + STANDARD_RIGHTS_EXECUTE + STANDARD_RIGHTS_ALL + SPECIFIC_RIGHTS_ALL + ACCESS_SYSTEM_SECURITY + MAXIMUM_ALLOWED + GENERIC_READ + GENERIC_WRITE + GENERIC_EXECUTE + GENERIC_ALL + F + FULL + R + READ + C + CHANGE + A + ADD + ) ; + +sub AUTOLOAD { + local($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + #reset $! to zero to reset any current errors. + local $! = 0; + $val = constant($constname); + if($! != 0) { + if($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + ($pack,$file,$line) = caller; + die "Your vendor has not defined Win32::FileSecurity macro " + ."$constname, used in $file at line $line."; + } + } + eval "sub $AUTOLOAD { $val }"; + goto &$AUTOLOAD; +} + +bootstrap Win32::FileSecurity; + +1; + +__END__ + +=head1 NAME + +Win32::FileSecurity - manage FileSecurity Discretionary Access Control Lists in perl + +=head1 SYNOPSIS + + use Win32::FileSecurity; + +=head1 DESCRIPTION + +This module offers control over the administration of system FileSecurity DACLs. +You may want to use Get and EnumerateRights to get an idea of what mask values +correspond to what rights as viewed from File Manager. + +=head1 CONSTANTS + + DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, + SYNCHRONIZE, STANDARD_RIGHTS_REQUIRED, + STANDARD_RIGHTS_READ, STANDARD_RIGHTS_WRITE, + STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_ALL, + SPECIFIC_RIGHTS_ALL, ACCESS_SYSTEM_SECURITY, + MAXIMUM_ALLOWED, GENERIC_READ, GENERIC_WRITE, + GENERIC_EXECUTE, GENERIC_ALL, F, FULL, R, READ, + C, CHANGE + +=head1 FUNCTIONS + +=head2 NOTE: + +All of the functions return false if they fail, unless otherwise noted. +Errors returned via $! containing both Win32 GetLastError() and a text message +indicating Win32 function that failed. + +=over 10 + +=item constant( $name, $set ) + +Stores the value of named constant $name into $set. +Same as C<$set = Win32::FileSecurity::NAME_OF_CONSTANT();>. + +=item Get( $filename, \%permisshash ) + +Gets the DACLs of a file or directory. + +=item Set( $filename, \%permisshash ) + +Sets the DACL for a file or directory. + +=item EnumerateRights( $mask, \@rightslist ) + +Turns the bitmask in $mask into a list of strings in @rightslist. + +=item MakeMask( qw( DELETE READ_CONTROL ) ) + +Takes a list of strings representing constants and returns a bitmasked +integer value. + +=back + +=head2 %permisshash + +Entries take the form $permisshash{USERNAME} = $mask ; + +=head1 EXAMPLE1 + + # Gets the rights for all files listed on the command line. + use Win32::FileSecurity qw(Get EnumerateRights); + + foreach( @ARGV ) { + next unless -e $_ ; + if ( Get( $_, \%hash ) ) { + while( ($name, $mask) = each %hash ) { + print "$name:\n\t"; + EnumerateRights( $mask, \@happy ) ; + print join( "\n\t", @happy ), "\n"; + } + } + else { + print( "Error #", int( $! ), ": $!" ) ; + } + } + +=head1 EXAMPLE2 + + # Gets existing DACL and modifies Administrator rights + use Win32::FileSecurity qw(MakeMask Get Set); + + # These masks show up as Full Control in File Manager + $file = MakeMask( qw( FULL ) ); + + $dir = MakeMask( qw( + FULL + GENERIC_ALL + ) ); + + foreach( @ARGV ) { + s/\\$//; + next unless -e; + Get( $_, \%hash ) ; + $hash{Administrator} = ( -d ) ? $dir : $file ; + Set( $_, \%hash ) ; + } + +=head1 COMMON MASKS FROM CACLS AND WINFILE + +=head2 READ + + MakeMask( qw( FULL ) ); # for files + MakeMask( qw( READ GENERIC_READ GENERIC_EXECUTE ) ); # for directories + +=head2 CHANGE + + MakeMask( qw( CHANGE ) ); # for files + MakeMask( qw( CHANGE GENERIC_WRITE GENERIC_READ GENERIC_EXECUTE ) ); # for directories + +=head2 ADD & READ + + MakeMask( qw( ADD GENERIC_READ GENERIC_EXECUTE ) ); # for directories only! + +=head2 FULL + + MakeMask( qw( FULL ) ); # for files + MakeMask( qw( FULL GENERIC_ALL ) ); # for directories + +=head1 RESOURCES + +From Microsoft: check_sd + http://premium.microsoft.com/download/msdn/samples/2760.exe + +(thanks to Guert Schimmel at Sybase for turning me on to this one) + +=head1 VERSION + +1.03 ALPHA 97-12-14 + +=head1 REVISION NOTES + +=over 10 + +=item 1.03 ALPHA 1998.01.11 + +Imported diffs from 0.67 (parent) version + +=item 1.02 ALPHA 1997.12.14 + +Pod fixes, @EXPORT list additions <gsar@activestate.com> + +Fix unitialized vars on unknown ACLs <jmk@exc.bybyte.de> + +=item 1.01 ALPHA 1997.04.25 + +CORE Win32 version imported from 0.66 <gsar@activestate.com> + +=item 0.67 ALPHA 1997.07.07 + +Kludged bug in mapping bits to separate ACE's. Notably, this screwed +up CHANGE access by leaving out a delete bit in the +C<INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE> Access Control Entry. + +May need to rethink... + +=item 0.66 ALPHA 1997.03.13 + +Fixed bug in memory allocation check + +=item 0.65 ALPHA 1997.02.25 + +Tested with 5.003 build 303 + +Added ISA exporter, and @EXPORT_OK + +Added F, FULL, R, READ, C, CHANGE as composite pre-built mask names. + +Added server\ to keys returned in hash from Get + +Made constants and MakeMask case insensitive (I don't know why I did that) + +Fixed mask comparison in ListDacl and Enumerate Rights from simple & mask +to exact bit match ! ( ( x & y ) ^ x ) makes sure all bits in x +are set in y + +Fixed some "wild" pointers + +=item 0.60 ALPHA 1996.07.31 + +Now suitable for file and directory permissions + +Included ListDacl.exe in bundle for debugging + +Added "intuitive" inheritance for directories, basically functions like FM +triggered by presence of GENERIC_ rights this may need to change + +see EXAMPLE2 + +Changed from AddAccessAllowedAce to AddAce for control over inheritance + +=item 0.51 ALPHA 1996.07.20 + +Fixed memory allocation bug + +=item 0.50 ALPHA 1996.07.29 + +Base functionality + +Using AddAccessAllowedAce + +Suitable for file permissions + +=back + +=head1 KNOWN ISSUES / BUGS + +=over 10 + +=item 1 + +May not work on remote drives. + +=item 2 + +Errors croak, don't return via $! as documented. + +=cut |