home *** CD-ROM | disk | FTP | other *** search
/ c't freeware shareware 1997 / CT_SW_97.ISO / pc / software / entwickl / win95 / pw32i306.exe / lib / Win32 / filesecurity.pm < prev    next >
Text File  |  1997-03-13  |  6KB  |  216 lines

  1. package Win32::FileSecurity;
  2.  
  3. #
  4. # FileSecurity.pm
  5. # By Monte Mitzelfelt, monte@conchas.nm.org
  6. # Larry Wall's Artistic License applies to all related Perl
  7. #  and C code for this module
  8. # Thanks to the guys at ActiveWare!
  9. # ver 0.65 ALPHA 1997.02.25
  10. #
  11.  
  12. require Exporter;
  13. require DynaLoader;
  14. use Carp ;
  15.  
  16. croak "The Win32::FileSecurity module works only on Windows NT" if (!Win32::IsWinNT()) ;
  17.  
  18. @ISA= qw( Exporter DynaLoader );
  19. # Items to export into callers namespace by default. Note: do not export
  20. # names by default without a very good reason. Use EXPORT_OK instead.
  21. # Do not simply export all your public functions/methods/constants.
  22.  
  23. require Exporter ;
  24. require DynaLoader ;
  25.  
  26. @ISA = qw(Exporter DynaLoader) ;
  27. @EXPORT_OK = qw( Get Set EnumerateRights MakeMask ) ;
  28.  
  29. sub AUTOLOAD
  30. {
  31.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  32.     # XS function.  If a constant is not found then control is passed
  33.     # to the AUTOLOAD in AutoLoader.
  34.  
  35.     local($constname);
  36.     ($constname = $AUTOLOAD) =~ s/.*:://;
  37.     #reset $! to zero to reset any current errors.
  38.     $!=0;
  39.     $val = constant($constname, @_ ? $_[0] : 0);
  40.     if($! != 0)
  41.     {
  42.         if($! =~ /Invalid/)
  43.         {
  44.             $AutoLoader::AUTOLOAD = $AUTOLOAD;
  45.             goto &AutoLoader::AUTOLOAD;
  46.         }
  47.         else
  48.         {
  49.             ($pack,$file,$line) = caller;
  50.             die "Your vendor has not defined Win32::FileSecurity macro $constname, used in $file at line $line.";
  51.         }
  52.     }
  53.     eval "sub $AUTOLOAD { $val }";
  54.     goto &$AUTOLOAD;
  55. }
  56.  
  57. bootstrap Win32::FileSecurity;
  58.  
  59. # Preloaded methods go here.
  60.  
  61. # Autoload methods go after __END__, and are processed by the autosplit program.
  62.  
  63. 1;
  64.  
  65. __END__
  66.  
  67. =head1 NAME
  68.  
  69. Win32::FileSecurity - manage FileSecurity Discretionary Access Control Lists in perl
  70.  
  71. =head1 SYNOPSIS
  72.  
  73.     use Win32::FileSecurity;
  74.  
  75. =head1 DESCRIPTION
  76.  
  77. This module offers control over the administration of system FileSecurity DACLs.  
  78. You may want to use Get and EnumerateRights to get an idea of what mask values
  79. correspond to what rights as viewed from File Manager.
  80.  
  81. =head1 CONSTANTS
  82.  
  83.   DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER,
  84.   SYNCHRONIZE, STANDARD_RIGHTS_REQUIRED, 
  85.   STANDARD_RIGHTS_READ, STANDARD_RIGHTS_WRITE,
  86.   STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_ALL,
  87.   SPECIFIC_RIGHTS_ALL, ACCESS_SYSTEM_SECURITY, 
  88.   MAXIMUM_ALLOWED, GENERIC_READ, GENERIC_WRITE,
  89.   GENERIC_EXECUTE, GENERIC_ALL, F, FULL, R, READ,
  90.   C, CHANGE
  91.  
  92. =head1 FUNCTIONS
  93.  
  94. =head2 NOTE:
  95.  
  96. All of the functions return FALSE (0) if they fail, unless otherwise noted.  Errors returned
  97. via $! containing both Win32 GetLastError() and a text message indicating Win32 function that 
  98. failed.
  99.  
  100. =over 10
  101.  
  102. =item constant( $name, $set )
  103.     Stores the value of named constant $name into $set.
  104.     Alternatively, $set = Win32::FileSecurity::NAME_OF_CONSTANT() ;
  105.  
  106. =item Get( $filename, \%permisshash )
  107.     Gets the DACLs of a file or directory
  108.  
  109. =item Set( $filename, \%permisshash )
  110.     Sets the DACL for a file or directory
  111.  
  112. =item EnumerateRights( $mask, \@rightslist )
  113.     Turns the bitmask in $mask into a list of strings in @rightslist
  114.  
  115. =item MakeMask( qw( DELETE READ_CONTROL ) )
  116.     Takes a list of strings representing constants and returns a bitmasked integer value.
  117.  
  118. =back
  119.  
  120. =head2 %permisshash
  121.  
  122. Entries take the form $permisshash{USERNAME} = $mask ;
  123.  
  124. =head1 EXAMPLE1
  125.  
  126. # Gets the rights for all files listed on the command line.
  127. use Win32::FileSecurity ;
  128.  
  129. foreach( @ARGV ) {
  130.     next unless -e $_ ;
  131.     
  132.     if ( Win32::FileSecurity::Get( $_, \%hash ) ) {
  133.         while( ($name, $mask) = each %hash ) {
  134.             print "$name:\n\t"; 
  135.             Win32::FileSecurity::EnumerateRights( $mask, \@happy ) ;
  136.             print join( "\n\t", @happy ), "\n";
  137.         }
  138.     } else {
  139.         print( "Error #", int( $! ), ": $!" ) ;
  140.     }
  141. }
  142.  
  143. =head1 EXAMPLE2
  144.  
  145. # Gets existing DACL and modifies Administrator rights
  146. use Win32::FileSecurity ;
  147.  
  148. # These masks show up as Full Control in File Manager
  149. $file = Win32::FileSecurity::MakeMask( qw( FULL ) );
  150.  
  151. $dir = Win32::FileSecurity::MakeMask( qw(
  152.     FULL
  153.     GENERIC_ALL
  154. ) );
  155.  
  156.  
  157. foreach( @ARGV ) {
  158.     s/\\$//;
  159.     next unless -e;
  160.     
  161.     Win32::FileSecurity::Get( $_, \%hash ) ;
  162.     $hash{Administrator} = ( -d ) ? $dir : $file ;
  163.     Win32::FileSecurity::Set( $_, \%hash ) ;
  164. }
  165.  
  166. =head1 VERSION
  167.  
  168. 0.66 ALPHA 1997.03.13
  169.  
  170. =head1 REVISION NOTES
  171.  
  172. =over 10
  173.  
  174. =item 0.66 ALPHA 1997.03.13
  175.     Fixed bug in memory allocation check
  176.  
  177. =item 0.65 ALPHA 1997.02.25
  178.     Tested with 5.003 build 303
  179.     Added ISA exporter, and @EXPORT_OK
  180.     Added F, FULL, R, READ, C, CHANGE as composite pre-built mask names.
  181.     Added server\ to keys returned in hash from Get
  182.     Made constants and MakeMask case insensitive (I don't know why I did that)
  183.     Fixed mask comparison in ListDacl and Enumerate Rights from simple & mask
  184.         to exact bit match ! ( ( x & y ) ^ x ) makes sure all bits in x
  185.         are set in y
  186.     Fixed some "wild" pointers
  187.  
  188. =item 0.60 ALPHA 1996.07.31
  189.     Now suitable for file and directory permissions
  190.     Included ListDacl.exe in bundle for debugging
  191.     Added "intuitive" inheritance for directories, basically functions like FM
  192.         triggered by presence of GENERIC_ rights this may need to change
  193.         see EXAMPLE2
  194.     Changed from AddAccessAllowedAce to AddAce for control over inheritance
  195.     
  196. =item 0.51 ALPHA 1996.07.20
  197.     Fixed memory allocation bug
  198.  
  199. =item 0.50 ALPHA 1996.07.29
  200.     Base functionality
  201.     Using AddAccessAllowedAce
  202.     Suitable for file permissions
  203. =back
  204.  
  205. =head1 KNOWN ISSUES / BUGS
  206.  
  207. =over 10
  208.  
  209. =item 1
  210.     May not work on remote drives.
  211.  
  212. =item 2
  213.     Errors croak, don't return via $! as documented.
  214.  
  215. =cut
  216.