'.&mt('[_1]-based conditional access: ',$typetext{$type}));
if ($$acl_count{$type}) {
$r->print($$acl_count{$type}.' ');
if ($$acl_count{$type} > 1) {
@@ -1830,13 +1864,24 @@ END_SCRIPT
}
sub select_files {
- my ($r) = @_;
+ my ($r,$dir_list) = @_;
if ($env{'form.continue'} eq 'true') {
# here we update the selections for the currentpath
# eventually, have to handle removing those not checked, but . . .
my @items=&Apache::loncommon::get_env_multiple('form.checkfile');
if (scalar(@items)){
- &Apache::lonnet::save_selected_files($env{'user.name'}, $env{'form.currentpath'}, @items);
+ my @ok_items;
+ if (ref($dir_list) eq 'ARRAY') {
+ foreach my $dir_line (@{$dir_list}) {
+ my ($filename,undef,undef,undef,undef,undef,undef,undef,$size)=split(/\&/,$dir_line,10);
+ if (grep(/^\Q$filename\E$/,@items)) {
+ if ($size) {
+ push(@ok_items,$filename);
+ }
+ }
+ }
+ }
+ &Apache::lonnet::save_selected_files($env{'user.name'}, $env{'form.currentpath'}, @ok_items);
}
} else {
#empty the file for a fresh start
@@ -1889,111 +1934,249 @@ ENDSMP
);
}
-
-sub check_for_upload {
- my ($path,$fname,$group,$element) = @_;
- my $disk_quota = &get_quota($group);
- my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?)
- my $portfolio_root = &get_portfolio_root();
- my $port_path = &get_port_path();
- my ($uname,$udom) = &get_name_dom($group);
- # Fixme --- Move the checking for existing file to LOND error return
- my @dir_list=&get_dir_list($portfolio_root,$path,$group);
- my $found_file = 0;
- my $locked_file = 0;
- foreach my $line (@dir_list) {
- my ($file_name)=split(/\&/,$line,2);
- if ($file_name eq $fname){
- $file_name = $path.$file_name;
- $file_name = &prepend_group($file_name);
- $found_file = 1;
- if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') {
- $locked_file = 1;
- }
- }
- }
- my $getpropath = 1;
- my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
-
- if (($current_disk_usage + $filesize) > $disk_quota){
- my $msg = ''.
- &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.',''.$fname.'',$filesize).''.
- ' '.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage);
- return ('will_exceed_quota',$msg);
- } elsif ($found_file) {
- if ($locked_file) {
- my $msg = '';
- $msg .= &mt('Unable to upload [_1]. A locked file by that name was found in [_2].',''.$fname.'',''.$port_path.$env{'form.currentpath'}.'');
- $msg .= ' ';
- $msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.',''.$fname.'');
- return ('file_locked',$msg);
- } else {
- my $msg = '';
- $msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].',''.$fname.'',$port_path.$env{'form.currentpath'});
- $msg .= '';
- $msg .= ' ';
- $msg .= &mt('To upload, rename or delete existing [_1] in [_2].',''.$fname.'', $port_path.$env{'form.currentpath'});
- return ('file_exists',$msg);
- }
- }
-}
-
sub upload {
my ($r,$url,$group)=@_;
- my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'});
+ my $formname = 'uploaddoc';
+ my $fname = &Apache::lonnet::clean_filename($env{'form.'.$formname.'.filename'});
+ my ($state,$msg);
+ if ($fname eq '') {
+ my $msg = &mt('Invalid filename: [_1]; the name of the uploaded file did not contain any letters, '.
+ 'so after eliminating special characters there was nothing left.',
+ ''.$env{'form.uploaddoc.filename'}.'');
+ $r->print($msg.&done('Back',$url));
+ return;
+ }
my $disk_quota = &get_quota($group);
my $portfolio_root = &get_portfolio_root();
my $port_path = &get_port_path();
my ($uname,$udom) = &get_name_dom($group);
my $getpropath = 1;
my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath);
- my ($state,$msg) =
+ ($state,$msg) =
&Apache::loncommon::check_for_upload($env{'form.currentpath'},$fname,
- $group,'uploaddoc',$portfolio_root,
+ $group,$formname,$portfolio_root,
$port_path,$disk_quota,
$current_disk_usage,$uname,$udom);
if ($state eq 'will_exceed_quota'
|| $state eq 'file_locked'
- || $state eq 'file_exists' ) {
+ || $state eq 'zero_bytes') {
$r->print($msg.&done('Back',$url));
return;
}
my (%allfiles,%codebase,$mode);
- if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) {
+ if ($env{'form.'.$formname.'.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) {
if ($env{'form.parserflag'}) {
$mode = 'parse';
}
}
- my $result=
- &Apache::lonnet::userfileupload('uploaddoc','',
+ my $context;
+ if ($state eq 'existingfile') {
+ $context = $state;
+ }
+ my ($result,$timestamp) =
+ &Apache::lonnet::userfileupload($formname,$context,
$port_path.$env{'form.currentpath'},
$mode,\%allfiles,\%codebase);
- if ($result !~ m|^/uploaded/|) {
+ if ($state eq 'existingfile') {
+ my $group_elem;
+ my $rootdir = $r->dir_config('lonDaemons').'/tmp/overwrites';
+ if ($group eq '') {
+ $rootdir .= '/'.$env{'user.domain'}.'/'.$env{'user.name'};
+ } else {
+ $rootdir .= '/'.$env{'course.'.$env{'request.course.id'}.'.domain'}.
+ '/'.$env{'course.'.$env{'request.course.id'}.'.num'};
+ $group_elem = '';
+ }
+ if (($result eq $rootdir.'/'.$port_path.$env{'form.currentpath'}.$fname) && ($timestamp =~ /^\d+$/)) {
+ my $showfname = &HTML::Entities::encode($fname,'&<>"');
+ my %lt = &Apache::lonlocal::texthash (
+ over => 'Overwrite existing file?',
+ yes => 'Yes',
+ no => 'No',
+ undo => 'This action can not be undone.',
+ conf => 'Are you sure you want to overwrite an existing file?',
+ cont => 'Continue',
+ );
+ my $parserflag;
+ my $hidden = &hidden_elems();
+ if ($mode eq 'parse') {
+ $parserflag = '';
+ }
+ $r->print(<<"END");
+
+$msg
+
+END
+ } else {
+ $r->print(''.&mt('An error occurred ([_1]) while trying to upload [_2].'
+ ,$result,&display_file(undef,$fname)).' ');
+ $r->print(&done('Back',$url));
+ }
+ } elsif ($result !~ m|^/uploaded/|) {
$r->print(''.&mt('An error occurred ([_1]) while trying to upload [_2].'
- ,$result,&display_file()).' ');
+ ,$result,&display_file(undef,$fname)).' ');
$r->print(&done('Back',$url));
} else {
if (%allfiles) {
if (!&suppress_embed_prompt()) {
- my $state = <print(&done(undef,$url));
+ }
+ }
+}
+
+sub hidden_elems {
+ my $contelem;
+ if ($env{'form.mode'} eq 'selectfile') {
+ $contelem = '';
+ }
+ return <
+
+
+
+$contelem
+END
+}
+
+sub print_dependency_form {
+ my ($r,$url,$allfiles,$codebase) = @_;
+ my $state = <
STATE
- $r->print("
".&mt("Reference Warning")."
");
- $r->print("
".&mt("Completed upload of the file. This file contained references to other files. You must upload the referenced files or else the uploaded file may not work properly.")."
");
- $r->print("
".&mt("Please select the locations from which the referenced files are to be uploaded.")."
');
+ if ($env{'form.group'} ne '') {
+ $state .= ''."\n";
+ }
+ my $embedded = &Apache::loncommon::ask_for_embedded_content($url,$state,$allfiles,$codebase,
+ {'error_on_invalid_names' => 1,
+ 'ignore_remote_references' => 1,});
+ if ($embedded) {
+ $r->print('
'.&mt("Reference Warning").'
'.
+ '
'.&mt("Completed upload of the file. This file contained references to other files. You must upload the referenced files or else the uploaded file may not work properly.").'
'.
+ '
'.&mt("Please select the locations from which the referenced files are to be uploaded.").'
'.
+ $embedded.
+ '
Or '.&done('Return to directory',$url).'
');
+ } else {
+ $r->print(&done(undef,$url));
+ }
+ return;
+}
+
+sub overwrite {
+ my ($r,$url,$group)=@_;
+ my $formname = 'existingfile';
+ my $port_path = &get_port_path();
+ my $fname = &Apache::lonnet::clean_filename($env{'form.filename'});
+ my (%allfiles,%codebase,$mode);
+ unless (&suppress_embed_prompt()) {
+ if ($env{'form.parserflag'}) {
+ if ($fname =~ /\.s?html?$/i) {
+ $mode = 'parse';
}
- } else {
- $r->print(&done(undef,$url));
- }
+ }
+ }
+ if ($fname eq '') {
+ my $msg = &mt('Invalid filename: [_1]; the name of the uploaded file did not contain any letters, '.
+ 'so after eliminating special characters there was nothing left.',
+ ''.$env{'form.filename'}.'');
+ $r->print($msg.&done('Back',$url));
+ return;
}
+ $env{'form.'.$formname.'.filename'} = $fname;
+ my $result=
+ &Apache::lonnet::userfileupload($formname,'overwrite',
+ $port_path.$env{'form.currentpath'},
+ $mode,\%allfiles,\%codebase);
+ if ($result !~ m|^/uploaded/|) {
+ $r->print(''.&mt('An error occurred ([_1]) while trying to overwrite [_2].'
+ ,$result,&display_file(undef,$fname)).' ');
+ $r->print(&after_overwrite(&mt('Back'),$url));
+ } else {
+ if (%allfiles) {
+ if (!&suppress_embed_prompt()) {
+ &print_dependency_form($r,$url,\%allfiles,\%codebase);
+ } else {
+ $r->print(&after_overwrite(undef,$url));
+ }
+ } else {
+ $r->print(&after_overwrite(undef,$url));
+ }
+ }
+ return;
+}
+
+sub after_overwrite {
+ my ($text,$url) = @_;
+ my $group_elem;
+ if (defined($env{'form.group'})) {
+ $group_elem = '';
+ if (defined($env{'form.ref'})) {
+ $group_elem .= ''."\n";
+ }
+ }
+ if ($text eq '') {
+ $text = &mt('Done');
+ }
+ my $hidden = &hidden_elems();
+ return <$text
+
+$hidden
+$group_elem
+
+END
}
sub lock_info {
@@ -2190,7 +2373,6 @@ sub missing_priv {
}
$rtnlink .= '">'.&mt('Return to directory').'';
$r->print(' '.$rtnlink);
- $r->print(&Apache::loncommon::end_page());
return;
}
@@ -2362,26 +2544,29 @@ sub handler {
$r->print(&Apache::loncommon::end_page());
return OK;
}
- if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
- $r->print('');
- $r->print(&mt('No file was selected to upload.').' ');
- $r->print(&mt('To upload a file, click Browse... and select a file, then click Upload.'));
- $r->print('');
- }
+ if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
+ $r->print('');
+ $r->print(&mt('No file was selected to upload.').' ');
+ $r->print(&mt('To upload a file, click Browse... and select a file, then click Upload.'));
+ $r->print('');
+ }
if ($env{'form.meta'}) {
&open_form($r,$url);
$r->print(&mt('Edit the meta data').' ');
&close_form($r,$url);
}
- if ($env{'form.store'}) {
- }
-
if ($env{'form.uploaddoc.filename'}) {
if ($can_upload) {
&upload($r,$url,$group);
} else {
&missing_priv($r,$url,'upload');
}
+ } elsif ($env{'form.action'} eq 'process_overwrite') {
+ if ($can_upload) {
+ &overwrite($r,$url,$group);
+ } else {
+ &missing_priv($r,$url,'existingfile');
+ }
} elsif ($env{'form.action'} eq 'upload_embedded') {
if ($can_upload) {
my $disk_quota = &get_quota($group);
@@ -2461,6 +2646,15 @@ sub handler {
} elsif ($env{'form.lockinfo'}) {
&lock_info($r,$url,$group);
} else {
+ if ($env{'form.action'} eq 'cancel_overwrite') {
+ if ($can_upload) {
+ my $formname = 'existingfile';
+ my $fname = &Apache::lonnet::clean_filename($env{'form.filename'});
+ $env{'form.'.$formname.'.filename'} = $fname;
+ &Apache::lonnet::userfileupload($formname,'canceloverwrite',
+ $port_path.$env{'form.currentpath'});
+ }
+ }
my $current_path='/';
if ($env{'form.currentpath'}) {
$current_path = $env{'form.currentpath'};
@@ -2493,8 +2687,8 @@ sub handler {
$can_upload,$group);
&display_directory($r,$url,$current_path,$is_empty,\@dir_list,$group,
$can_upload,$can_modify,$can_delete,$can_setacl);
- $r->print(&Apache::loncommon::end_page());
}
+ $r->print(&Apache::loncommon::end_page());
return OK;
}