--- loncom/Attic/lchtmldir 2004/10/19 11:11:34 1.10 +++ loncom/Attic/lchtmldir 2004/10/20 09:30:57 1.11 @@ -232,6 +232,13 @@ if($authentication eq "unix:") { # Unix # is that a file system user is being demoted to internal user... if($authentication eq "internal:") { + # In case the user was a unix/filesystem authenticated user, + # we'll take a bit of time here to write a script in the + # user's home directory that can reset ownerships and permissions + # back the way the used to be. + + &write_restore_script($homedir); + &System("/bin/chown -R root:root ".$homedir); } &System("/bin/chown -R www:www ".$fulldir); @@ -371,7 +378,13 @@ sub process_tree { } # -# Simple test of process_tree: +# Callback from process_tree to write the script lines +# requried to restore files to current ownership and permission. +# Parameters: +# dir - Name of the directory the file lives in. +# name - Name of the file itself. +# statinfo - Array from lstat called on the file. +# # sub write_script { my ($dir, $name, $statinfo) = @_; @@ -392,6 +405,46 @@ sub write_script { } +# +# Write a script in the user's home directory that can restore +# the permissions and ownerhips of all the files in the directory +# tree to their current ownerships and permissions. This is done +# prior to making the user into an internally authenticated user +# in case they were previously file system authenticated and +# need to go back. +# The file we will create will be of the form +# restore_n.sh Where n is a number that we will keep +# incrementing as needed until there isn't a file by that name. +# +# Parameters: +# dir - Path to the user's home directory. +# +sub write_restore_script { + my ($dir) = @_; + + # Create a unique file: + + my $version_number = 0; + my $filename = 'restore_'.$version_number.'.sh'; + my $full_name = $dir.$path_sep.$filename; + + while(-e $full_name) { + $version_number++; + $filename = 'restore_'.$version_number.'.sh'; + $full_name = $dir.$path_sep.$filename; + } + # $full_name is the full path of a file that does not yet exist + # of the form we want: + + open(CHMODSCRIPT, "> $full_name"); + + &process_tree(\&write_script, $dir); + + close(CHMODSCRIPT); + + chmod(0750, $full_name); + +}