[LON-CAPA-cvs] cvs: loncom / lchtmldir
foxr
lon-capa-cvs@mail.lon-capa.org
Wed, 20 Oct 2004 09:30:58 -0000
foxr Wed Oct 20 05:30:58 2004 EDT
Modified files:
/loncom lchtmldir
Log:
When the auth mode is being changed to internal, and the user has a
/home/username dir (has authorship role), prior to setting the permissions
and ownership, write a script named restore_n.sh in the users's /home/username
diretory that will restore all currently extant files to their prior ownershp
and permissions. This is done in case a filesystem user is accidently changed
into an internal user and then is changed back... the default action of
lchtmldir in that case may leave files without the prior permissions, if the
user did some interesting stuff with group ownership, or had sensitive stuff.
The user can the login, locate the most recent version of the script and
execute it to get back to something close to what they had before
Index: loncom/lchtmldir
diff -u loncom/lchtmldir:1.10 loncom/lchtmldir:1.11
--- loncom/lchtmldir:1.10 Tue Oct 19 07:11:34 2004
+++ loncom/lchtmldir Wed Oct 20 05:30:57 2004
@@ -232,6 +232,13 @@
# 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 @@
}
#
-# 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 @@
}
+#
+# 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);
+
+}