--- loncom/interface/londocs.pm 2024/12/22 03:12:53 1.713 +++ loncom/interface/londocs.pm 2025/02/27 02:02:10 1.725 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.713 2024/12/22 03:12:53 raeburn Exp $ +# $Id: londocs.pm,v 1.725 2025/02/27 02:02:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -579,7 +579,8 @@ $contents{webreferences}.' $title=~s/[\/\s]+/\_/gs; $title=&clean($title); my $formname = 'dumpdoc'; - my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash); + my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash). + '
'."\n"; my %uploadedfiles; &tiehash(); foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { @@ -643,8 +644,8 @@ sub authorspace_selector { } $preamble .= ''.&mt('No author or co-author roles on this server.').'
'); $r->print(&endContentScreen()); return ''; } - my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'}); + my $docroot = $r->dir_config('lonDocRoot'); + my $is_course_home; + my @ids=&Apache::lonnet::current_machine_ids(); + if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) { + $is_course_home = 1; + } my $exclude = &Apache::lonnet::priv_exclude(); my $srcurl = "/priv/$coursedom/$coursenum"; - my $srctop = $r->dir_config('lonDocRoot').$srcurl; + my $srctop = $docroot.$srcurl; + my $resurl = "/res/$coursedom/$coursenum"; + my $res_exclude = &Apache::lonnet::res_exclude(); if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) { $r->print(''.&mt('Copy to: [_1]', ''.$desturl.'/'.$subdir.''). '
'."\n"); - unless ($is_course_home) { - $r->print(''. - &endContentScreen()); - return ''; - } if (keys(%dirs_to_make)) { - if ($is_course_home) { - unless (-e $desttop.'/'.$subdir) { - mkdir($desttop.'/'.$subdir,0755); - } - if (-e $desttop.'/'.$subdir) { - foreach my $dir (sort(keys(%dirs_to_make))) { - my @dirs=split(/\//,$dir); - my $path="$desttop/$subdir"; - my $makepath=$path; - my $fail; - for (my $i=0;$i<@dirs;$i++) { - $makepath.='/'.$dirs[$i]; - unless (-e $makepath) { - unless (mkdir($makepath,0755)) { - $fail = 1; - last; - } - if (($i == scalar(@dirs)-1) && (!$fail)) { - $newdir{$dir} = 1; - } + unless (-e $desttop.'/'.$subdir) { + mkdir($desttop.'/'.$subdir,0755); + } + if (-e $desttop.'/'.$subdir) { + foreach my $dir (sort(keys(%dirs_to_make))) { + my @dirs=split(/\//,$dir); + my $path="$desttop/$subdir"; + my $makepath=$path; + my $fail; + for (my $i=0;$i<@dirs;$i++) { + $makepath.='/'.$dirs[$i]; + unless (-e $makepath) { + unless (mkdir($makepath,0755)) { + $fail = 1; + last; + } + if (($i == scalar(@dirs)-1) && (!$fail)) { + $newdir{$dir} = 1; } - } - if ($fail) { - $r->print('
'.&mt('Target directory: [_1] does not exist, and could not be created.', - ''.$desturl.'/'.$subdir.'/'.$dir.''). - '
'."\n"); } } - } else { - $notopdir = 1; + if ($fail) { + $r->print(''.&mt('Target directory: [_1] does not exist, and could not be created.', + ''.$desturl.'/'.$subdir.'/'.$dir.''). + '
'."\n"); + } } + } else { + $notopdir = 1; } } if (keys(%files_to_copy)) { - if ($is_course_home) { - unless (-e $desttop.'/'.$subdir) { - mkdir($desttop.'/'.$subdir,0755); - } - if (-e $desttop.'/'.$subdir) { - my $num = 0; - foreach my $file (keys(%files_to_copy)) { - my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname); - if ($file =~ m{/}) { - ($path,$fname) = ($file =~ m{^(.+)/([^/]+)$}); - if (-d "$desttop/$subdir/$path") { - if (-e "$desttop/$subdir/$path/$fname") { - $dup = 1; + unless (-e $desttop.'/'.$subdir) { + mkdir($desttop.'/'.$subdir,0755); + } + if (-e $desttop.'/'.$subdir) { + my $num = 0; + my ($copyright,$customdistfile); + if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') { + $copyright = $env{'form.copyright'}; + } elsif ($env{'form.copyright'} eq 'custom') { + if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) { + my ($rightsdom,$rightsuname) = ($1,$2); + my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname); + if (($rightshome eq 'no_host') || ($rightshome eq '')) { + $copyright = 'default'; + } elsif (grep(/^\Q$rightshome\E$/,@ids)) { + if (-e $docroot.$env{'form.customrights'}) { + $copyright = 'custom'; + $customdistfile = $env{'form.customrights'}; + } else { + $copyright = 'default'; + } + } else { + my $rightsfile = &Apache::lonnet::filelocation('',$env{'form.customrights'}); + unless (&Apache::lonnet::getfile($rightsfile) eq '-1') { + $customdistfile = $env{'form.customrights'}; + } + } + } + } + my $sourceavail; + if ($env{'form.sourceavail'} =~ /^(open|closed)$/) { + $sourceavail = $env{'form.sourceavail'}; + } + my $respublish; + if ($env{'form.respublish'}) { + $respublish = 1; + } + my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes')); + foreach my $file (keys(%files_to_copy)) { + my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname); + if ($file =~ m{/}) { + ($path,$fname) = ($file =~ m{^(.+)/([^/]+)$}); + if (-d "$desttop/$subdir/$path") { + if (-e "$desttop/$subdir/$path/$fname") { + $dup = 1; + } else { + $src = "$srctop/$path/$fname"; + $dest = "$desttop/$subdir/$path/$fname"; + } + } elsif (-f "$desttop/$subdir/$path") { + $dir_is_file = 1; + } else { + $fail = 1; + } + } elsif (-e "$desttop/$subdir/$file") { + $dup = 1; + } else { + $src = "$srctop/$file"; + $dest = "$desttop/$subdir/$file"; + $fname = $file; + } + if ($fail) { + $r->print(''.&mt('Target directory: [_1] does not exist, and could not be created.', + ''.$desturl.'/'.$subdir.'/'.$path.''). + '
'."\n"); + } elsif ($dup) { + $r->print(''.&mt('Target file: [_1] already exists -- not overwriting.', + ''.$desturl.'/'.$subdir.'/'.$file.''). + '
'."\n"); + } elsif ($dir_is_file) { + $r->print(''.&mt('Target directory: [_1] name is already in a use for a file -- not overwriting.', + ''.$desturl.'/'.$subdir.'/'.$file.''). + '
'."\n"); + } elsif (($src ne '') && ($dest ne '')) { + my $ressrc = $docroot.$resurl.'/'.$file; + my $ressrcmeta = $ressrc.'.meta'; + my ($ext) = ($file =~ /\.(\w+)$/); + my $embstyle=&Apache::loncommon::fileembstyle($ext); + my ($getres,$getresmeta); + if ($respublish) { + if ($path eq '') { + if ((ref($resfiles{'/'}) eq 'HASH') && + (exists($resfiles{'/'}{$fname}))) { + $getres = 1; + $getresmeta = 1; + } + } elsif ((ref($resfiles{$path}) eq 'HASH') && + (exists($resfiles{$path}{$fname}))) { + $getres = 1; + $getresmeta = 1; + } + } + if ($is_course_home) { + my ($needpriv,$needprivmeta); + if ($respublish) { + if ($getres) { + if (&Apache::londiff::are_different_files($src,$ressrc)) { + $needpriv = 1; + if (&File::Copy::copy($ressrc,$dest)) { + if ($embstyle eq 'ssi') { + &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd); + } + } + } else { + if (&File::Copy::copy($src,$dest)) { + $newfile{$file} = $desturl.'/'.$subdir.'/'.$file; + if ($embstyle eq 'ssi') { + &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir); + } + } + } } else { - $src = "$srctop/$path/$fname"; - $dest = "$desttop/$subdir/$path/$fname"; + $needpriv = 1; + } + if ($getresmeta) { + if ((-e $src.'.meta') && (!-e $dest.'.meta')) { + if (&Apache::londiff::are_different_files($src.'.meta',$ressrc.'.meta')) { + if (&File::Copy::copy($ressrc.'.meta',$dest.'.meta')) { + &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright, + $customdistfile,$sourceavail,\%checkdeps); + } + $needprivmeta = 1; + } else { + if (&File::Copy::copy($src.'.meta',$dest.'.meta')) { + &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright, + $customdistfile,$sourceavail,\%checkdeps); + } + } + } + } + if ($getres) { + my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file; + if (-e $dest) { + my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1); + if (-e $destresfile) { + $newresfile{$file} = $destresurl.'/'.$subdir.'/'.$file; + } + } } - } elsif (-f "$desttop/$subdir/$path") { - $dir_is_file = 1; } else { - $fail = 1; + $needpriv = 1; + if ((-e $src.'.meta') && (!-e $dest.'.meta')) { + $needprivmeta = 1; + } + } + if ($needpriv) { + if (&File::Copy::copy($src,$dest)) { + $newfile{$file} = $desturl.'/'.$subdir.'/'.$file; + if ($embstyle eq 'ssi') { + &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir); + } + } + } + if ($needprivmeta) { + if (&File::Copy::copy($src.'.meta',$dest.'.meta')) { + &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright, + $customdistfile,$sourceavail,\%checkdeps); + } } - } elsif (-e "$desttop/$subdir/$file") { - $dup = 1; } else { - $src = "$srctop/$file"; - $dest = "$desttop/$subdir/$file"; - $fname = $file; - } - if ($fail) { - $r->print(''.&mt('Target directory: [_1] does not exist, and could not be created.', - ''.$desturl.'/'.$subdir.'/'.$path.''). - '
'."\n"); - } elsif ($dup) { - $r->print(''.&mt('Target file: [_1] already exists -- not overwriting.', - ''.$desturl.'/'.$subdir.'/'.$file.''). - '
'."\n"); - } elsif ($dir_is_file) { - $r->print(''.&mt('Target directory: [_1] name is already in a use for a file -- not overwriting.', - ''.$desturl.'/'.$subdir.'/'.$file.''). - '
'."\n"); - } elsif (($src ne '') && ($dest ne '')) { - if (&File::Copy::copy($src,$dest)) { - $newfile{$file} = 1; - if ((-e $src.'.meta') && (!-e $dest.'.meta')) { - if (&File::Copy::copy($src.'.meta',$dest.'.meta')) { - if (open(my $fh,'<',$dest.'.meta')) { - my ($output,$now); - $now = time; - while (my $line=<$fh>) { - chomp($line); - if ($line eq "