X-Git-Url: https://git.p6c8.net/devedit.git/blobdiff_plain/4114079ae7f2e8879071e7ae7c535c6e1416abf8..9ba648e57a6e37366c685326c9997c3e643ce1ef:/modules/Command.pm diff --git a/modules/Command.pm b/modules/Command.pm index ad660c3..6b413d0 100644 --- a/modules/Command.pm +++ b/modules/Command.pm @@ -6,41 +6,64 @@ package Command; # Execute Dev-Editor's commands # # Author: Patrick Canterino -# Last modified: 09-23-2003 +# Last modified: 2003-12-21 # use strict; -use vars qw(@EXPORT - $script); - -use CGI qw(header - redirect); +use vars qw(@EXPORT); use File::Access; use File::Copy; +use File::Path; use HTML::Entities; use Output; use POSIX qw(strftime); use Tool; -$script = $ENV{'SCRIPT_NAME'}; +my $script = $ENV{'SCRIPT_NAME'}; + +my %dispatch = ('show' => \&exec_show, + 'beginedit' => \&exec_beginedit, + 'canceledit' => \&exec_unlock, + 'endedit' => \&exec_endedit, + 'mkdir' => \&exec_mkdir, + 'mkfile' => \&exec_mkfile, + 'workwithfile' => \&exec_workwithfile, + 'workwithdir' => \&exec_workwithdir, + 'copy' => \&exec_copy, + 'rename' => \&exec_rename, + 'remove' => \&exec_remove, + 'rmdir' => \&exec_rmdir, + 'unlock' => \&exec_unlock + ); ### Export ### use base qw(Exporter); -@EXPORT = qw(exec_show - exec_beginedit - exec_endedit - exec_mkfile - exec_mkdir - exec_workwithfile - exec_copy - exec_rename - exec_remove - exec_unlock); +@EXPORT = qw(exec_command); + +# exec_command() +# +# Execute the specified command +# +# Params: 1. Command to execute +# 2. Reference to user input hash +# 3. Reference to config hash +# +# Return: Output of the command (Scalar Reference) + +sub exec_command($$$) +{ + my ($command,$data,$config) = @_; + + return error("Unknown command: $command") unless($dispatch{$command}); + + my $output = &{$dispatch{$command}}($data,$config); + return $output; +} # exec_show() # @@ -51,7 +74,7 @@ use base qw(Exporter); # # Return: Output of the command (Scalar Reference) -sub exec_show($$$) +sub exec_show($$) { my ($data,$config) = @_; my $physical = $data->{'physical'}; @@ -63,14 +86,14 @@ sub exec_show($$$) # Create directory listing my $direntries = dir_read($physical); - return error("Reading of directory $virtual failed") unless($direntries); + return error("Reading of directory $virtual failed.",upper_path($virtual)) unless($direntries); my $files = $direntries->{'files'}; my $dirs = $direntries->{'dirs'}; $output .= htmlhead("Directory listing of $virtual"); $output .= equal_url($config->{'httproot'},$virtual); - $output .= "
\n\n
\n";
+  $output .= "
\n\n
\n";
 
   # Create the link to the upper directory
   # (only if we are not in the root directory)
@@ -83,10 +106,10 @@ sub exec_show($$$)
    $output .= "  [SUBDIR]  ";
    $output .= strftime("%d.%m.%Y %H:%M",localtime($stat[9]));
    $output .= " " x 10;
-   $output .= "../\n";
+   $output .= "../\n";
   }
 
-  # Get the longest file/directory name
+  # Get the length of the longest file/directory name
 
   my $max_name_len = 0;
 
@@ -100,21 +123,24 @@ sub exec_show($$$)
 
   foreach my $dir(@$dirs)
   {
-   my @stat = stat($physical."/".$dir);
+   my @stat      = stat($physical."/".$dir);
+   my $virt_path = encode_entities($virtual.$dir."/");
 
    $output .= "  ";
    $output .= "[SUBDIR]  ";
-   $output .= strftime("%d.%m.%Y %H:%M",localtime($stat[9]));
+   $output .= strftime($config->{'timeformat'},localtime($stat[9]));
    $output .= " " x 10;
-   $output .= "".encode_entities($dir)."/\n";
+   $output .= "".encode_entities($dir)."/";
+   $output .= " " x ($max_name_len - length($dir) - 1)."\t  (";
+   $output .= "Work with directory)\n";
   }
 
   # Files
 
   foreach my $file(@$files)
   {
-   my $phys_path = $physical."/".$file; # Not exactly...
-   my $virt_path = $virtual.$file;
+   my $phys_path = $physical."/".$file;
+   my $virt_path = encode_entities($virtual.$file);
 
    my @stat      = stat($phys_path);
    my $in_use    = $data->{'uselist'}->in_use($virtual.$file);
@@ -122,34 +148,74 @@ sub exec_show($$$)
    $output .= " " x (10 - length($stat[7]));
    $output .= $stat[7];
    $output .= "  ";
-   $output .= strftime("%d.%m.%Y %H:%M",localtime($stat[9]));
-   $output .= ($in_use) ? " (IN USE) " : (-B $phys_path) ? " (BINARY) " : " " x 10;
+   $output .= strftime($config->{'timeformat'},localtime($stat[9]));
+   $output .= " " x 10;
    $output .= encode_entities($file);
    $output .= " " x ($max_name_len - length($file))."\t  (";
 
-   $output .= (-T $phys_path)
-              ? "View"
-              : 'View';
+   # Link "View"
+
+   if(-r $phys_path && -T $phys_path)
+   {
+    $output .= "View";
+   }
+   else
+   {
+    $output .= 'Edit'
-              : "Edit";
+   # Link "Edit"
+
+   if(-w $phys_path && -r $phys_path && -T $phys_path && not $in_use)
+   {
+    $output .= "Edit";
+   }
+   else
+   {
+    $output .= 'Do other stuff)\n";
+    $output .= '">Edit';
+   }
+
+   # Link "Do other stuff"
+
+   $output .= " | Work with file)\n";
   }
 
   $output .= "
\n\n
\n\n"; + + # Bottom of directory listing + # (Fields for creating files and directories) + $output .= < +
+ + Create new directory: -$virtual +$virtual +
Create new file: -$virtual +
+ + +$virtual +
@@ -161,19 +227,23 @@ END { # View a file + return error("You have not enough permissions to view this file.",upper_path($virtual)) unless(-r $physical); + # Check on binary files + # We have to do it in this way, or empty files + # will be recognized as binary files - if(-B $physical) + unless(-T $physical) { # Binary file - return error("This editor is not able to view/edit binary files."); + return error("This editor is not able to view/edit binary files.",upper_path($virtual)); } else { # Text file - $output = htmlhead("Contents of file $virtual"); + $output = htmlhead("Contents of file ".encode_entities($virtual)); $output .= equal_url($config->{'httproot'},$virtual); $output .= dir_link($virtual); @@ -186,7 +256,7 @@ END } } - return \$output + return \$output; } # exec_beginedit @@ -205,16 +275,17 @@ sub exec_beginedit($$) my $virtual = $data->{'virtual'}; my $uselist = $data->{'uselist'}; - return error("You cannot edit directories.") if(-d $physical); + return error("You cannot edit directories.",upper_path($virtual)) if(-d $physical); return error_in_use($virtual) if($uselist->in_use($virtual)); + return error("You have not enough permissions to edit this file.",upper_path($virtual)) unless(-r $physical && -w $physical); # Check on binary files - if(-B $physical) + unless(-T $physical) { # Binary file - return error("This editor is not able to view/edit binary files."); + return error("This editor is not able to view/edit binary files.",upper_path($virtual)); } else { @@ -223,27 +294,33 @@ sub exec_beginedit($$) $uselist->add_file($virtual); $uselist->save; - my $dir = upper_path($virtual); - my $content = encode_entities(${file_read($physical)}); + my $dir = upper_path($virtual); + my $content = encode_entities(${file_read($physical)}); + + my $equal_url = equal_url($config->{'httproot'},$virtual); + + $virtual = encode_entities($virtual); my $output = htmlhead("Edit file $virtual"); - $output .= equal_url($config->{'httproot'},$virtual); + $output .= $equal_url; $output .= <Caution! This file is locked for other users while you are editing it. To unlock it, click Save and exit or Exit WITHOUT saving. Please don't click the Reload button in your browser! This will confuse the editor.

-
+

-
+ - + @@ -279,6 +356,11 @@ sub exec_endedit($$) my $content = $data->{'cgi'}->param('filecontent'); return error("You cannot edit directories.") if(-d $physical); + return error("You have not enough permissions to edit this file.",upper_path($virtual)) unless(-r $physical && -w $physical); + + # Normalize newlines + + $content =~ s/\015\012|\012|\015/\n/g; if($data->{'cgi'}->param('encode_iso')) { @@ -287,15 +369,23 @@ sub exec_endedit($$) $content = encode_entities($content,"\200-\377"); } + if($data->{'cgi'}->param('saveas')) + { + # Create the new filename + + $physical = $data->{'new_physical'}; + $virtual = $data->{'new_virtual'}; + } + if(file_save($physical,\$content)) { - # Saving of the file was successfull - so unlock it! + # Saving of the file was successful - so unlock it! return exec_unlock($data,$config); } else { - return error("Saving of file '$virtual' failed'"); + return error("Saving of file '".encode_entities($virtual)."' failed'. The file could be damaged, please check it's integrity.",upper_path($virtual)); } } @@ -310,7 +400,16 @@ sub exec_endedit($$) sub exec_mkfile($$) { - 1; + my ($data,$config) = @_; + my $new_physical = $data->{'new_physical'}; + my $new_virtual = $data->{'new_virtual'}; + my $dir = upper_path($new_virtual); + $new_virtual = encode_entities($new_virtual); + + return error("A file or directory called '$new_virtual' already exists.",$dir) if(-e $new_physical); + + file_create($new_physical) or return error("Could not create file '$new_virtual'.",$dir); + return devedit_reload({command => 'show', file => $dir}); } # exec_mkdir() @@ -324,12 +423,21 @@ sub exec_mkfile($$) sub exec_mkdir($$) { - 1; + my ($data,$config) = @_; + my $new_physical = $data->{'new_physical'}; + my $new_virtual = $data->{'new_virtual'}; + my $dir = upper_path($new_virtual); + $new_virtual = encode_entities($new_virtual); + + return error("A file or directory called '$new_virtual' already exists.",$dir) if(-e $new_physical); + + mkdir($new_physical,0777) or return error("Could not create directory '$new_virtual'.",$dir); + return devedit_reload({command => 'show', file => $dir}); } # exec_workwithfile() # -# Display a form for renaming/copying/deleting/unlocking a file +# Display a form for renaming/copying/removing/unlocking a file # # Params: 1. Reference to user input hash # 2. Reference to config hash @@ -343,23 +451,37 @@ sub exec_workwithfile($$) my $virtual = $data->{'virtual'}; my $unused = $data->{'uselist'}->unused($virtual); - my $output = htmlhead("Work with file $virtual"); + my $dir = encode_entities(upper_path($virtual)); + + my $output = htmlhead("Work with file ".encode_entities($virtual)); $output .= equal_url($config->{'httproot'},$virtual); + + $virtual = encode_entities($virtual); + $output .= dir_link($virtual); $output .= "

Note: On UNIX systems, filenames are case-sensitive!

\n\n"; $output .= "

Someone else is currently editing this file. So not all features are available.

\n\n" unless($unused); - $output .= < + $output .= "
\n\n"; + + # Copying of the file is always allowed - but we need read access + if(-r $physical) + { + $output .= <Copy -

Copy file '$virtual' to:

+ + + +

Copy file '$virtual' to:
$dir

+
END + } if($unused) { @@ -369,16 +491,22 @@ END $output .= <Move/rename -

Move/Rename file '$virtual' to:

+
+ + +

Move/Rename file '$virtual' to:
$dir

+
-

Delete

+

Remove

+ +

Click on the button below to remove the file '$virtual'.

-

+

END } @@ -406,6 +534,60 @@ END return \$output; } +# exec_workwithdir() +# +# Display a form for renaming/removing a directory +# +# Params: 1. Reference to user input hash +# 2. Reference to config hash +# +# Return: Output of the command (Scalar Reference) + +sub exec_workwithdir($$) +{ + my ($data,$config) = @_; + my $physical = $data->{'physical'}; + my $virtual = $data->{'virtual'}; + + my $dir = encode_entities(upper_path($virtual)); + + my $output = htmlhead("Work with directory ".encode_entities($virtual)); + $output .= equal_url($config->{'httproot'},$virtual); + + $virtual = encode_entities($virtual); + + $output .= dir_link($virtual); + $output .= "

Note: On UNIX systems, filenames are case-sensitive!

\n\n"; + $output .= "
\n\n"; + + $output .= <Move/rename + +
+ + +

Move/Rename directory '$virtual' to:
$dir

+ + +
+ +

Remove

+ +

Click on the button below to completely remove the directory '$virtual' and oll of it's files and sub directories.

+ +
+ + +

+ +END + + $output .= "\n
"; + $output .= htmlfoot; + + return \$output; +} + # exec_copy() # # Copy a file and return to directory view @@ -417,7 +599,61 @@ END sub exec_copy($$) { - 1; + my ($data,$config) = @_; + my $physical = $data->{'physical'}; + my $virtual = encode_entities($data->{'virtual'}); + my $new_physical = $data->{'new_physical'}; + my $new_virtual = $data->{'new_virtual'}; + my $dir = upper_path($new_virtual); + $new_virtual = encode_entities($new_virtual); + + return error("This editor is not able to copy directories.") if(-d $physical); + return error("You have not enough permissions to copy this file.") unless(-r $physical); + + if(-e $new_physical) + { + if(-d $new_physical) + { + return error("A directory called '$new_virtual' already exists. You cannot replace a directory by a file!",$dir); + } + elsif(not $data->{'cgi'}->param('confirmed')) + { + $dir = encode_entities($dir); + + my $output = htmlhead("Replace existing file"); + $output .= <<"END"; +

A file called '$new_virtual' already exists. Do you want to replace it?

+ +
+ + + + + +

+ + +
+ + + +

+ +END + + $output .= htmlfoot; + + return \$output; + } + } + + if($data->{'uselist'}->in_use($data->{'new_virtual'})) + { + return error("The target file '$new_virtual' already exists and it is edited by someone else.",$dir); + } + + copy($physical,$new_physical) or return error("Could not copy '$virtual' to '$new_virtual'",upper_path($virtual)); + return devedit_reload({command => 'show', file => $dir}); } # exec_rename() @@ -431,7 +667,60 @@ sub exec_copy($$) sub exec_rename($$) { - 1; + my ($data,$config) = @_; + my $physical = $data->{'physical'}; + my $virtual = $data->{'virtual'}; + my $new_physical = $data->{'new_physical'}; + my $new_virtual = $data->{'new_virtual'}; + my $dir = upper_path($new_virtual); + $new_virtual = encode_entities($new_virtual); + + return error_in_use($virtual) if($data->{'uselist'}->in_use($virtual)); + + if(-e $new_physical) + { + if(-d $new_physical) + { + return error("A directory called '$new_virtual' already exists. You cannot replace a directory!",upper_path($virtual)); + } + elsif(not $data->{'cgi'}->param('confirmed')) + { + $dir = encode_entities($dir); + + my $output = htmlhead("Replace existing file"); + $output .= <<"END"; +

A file called '$new_virtual' already exists. Do you want to replace it?

+ +
+ + + + + +

+ + +
+ + + +

+ +END + + $output .= htmlfoot; + + return \$output; + } + } + + if($data->{'uselist'}->in_use($data->{'new_virtual'})) + { + return error("The target file '$new_virtual' already exists and it is edited by someone else.",$dir); + } + + rename($physical,$new_physical) or return error("Could not move/rename '".encode_entities($virtual)."' to '$new_virtual'.",upper_path($virtual)); + return devedit_reload({command => 'show', file => $dir}); } # exec_remove() @@ -449,14 +738,70 @@ sub exec_remove($$) my $physical = $data->{'physical'}; my $virtual = $data->{'virtual'}; - return error_in_use($virtual) if($data->{'uselist'}->in_use($virtual)); + return exec_rmdir($data,$config) if(-d $physical); + return error_in_use($virtual) if($data->{'uselist'}->in_use($virtual)); - my $dir = upper_path($virtual); + unlink($physical) or return error("Could not delete file '".encode_entities($virtual)."'.",upper_path($virtual)); + return devedit_reload({command => 'show', file => upper_path($virtual)}); +} - unlink($physical) or return error("Could not delete file '$virtual'."); +# exec_rmdir() +# +# Remove a directory and return to directory view +# +# Params: 1. Reference to user input hash +# 2. Reference to config hash +# +# Return: Output of the command (Scalar Reference) - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; +sub exec_rmdir($$) +{ + my ($data,$config) = @_; + my $physical = $data->{'physical'}; + my $virtual = $data->{'virtual'}; + + return exec_remove($data,$config) if(not -d $physical); + + if($data->{'cgi'}->param('confirmed')) + { + rmtree($physical); + return devedit_reload({command => 'show', file => upper_path($virtual)}); + } + else + { + my $dir = encode_entities(upper_path($virtual)); + my $output; + + $output = htmlhead("Remove directory $virtual"); + $output .= equal_url($config->{'httproot'},$virtual); + + $virtual = encode_entities($virtual); + + $output .= dir_link($virtual); + + $output .= <<"END"; +

Do you really want to remove the directory '$virtual' and all of it's files and sub directories?

+ +
+ + + + +

+ + +
+ + + +

+ +END + + $output .= htmlfoot; + + return \$output; + } } # exec_unlock() @@ -472,17 +817,13 @@ sub exec_remove($$) sub exec_unlock($$) { my ($data,$config) = @_; - my $physical = $data->{'physical'}; my $virtual = $data->{'virtual'}; my $uselist = $data->{'uselist'}; - my $dir = upper_path($virtual); - $uselist->remove_file($virtual); $uselist->save; - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + return devedit_reload({command => 'show', file => upper_path($virtual)}); } # it's true, baby ;-)
Save as new file: $dir + + Save as new file: $dir Encode ISO-8859-1 special chars