X-Git-Url: https://git.p6c8.net/devedit.git/blobdiff_plain/f9b981dfde8054d50c25032febca2574e5ae6f25..9ba648e57a6e37366c685326c9997c3e643ce1ef:/modules/Command.pm?ds=sidebyside diff --git a/modules/Command.pm b/modules/Command.pm index 1bd1116..6b413d0 100644 --- a/modules/Command.pm +++ b/modules/Command.pm @@ -6,40 +6,64 @@ package Command; # Execute Dev-Editor's commands # # Author: Patrick Canterino -# Last modified: 2003-10-20 +# Last modified: 2003-12-21 # use strict; -use vars qw(@EXPORT - $script); - -use CGI qw(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() # @@ -50,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'}; @@ -62,7 +86,7 @@ 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'}; @@ -99,13 +123,16 @@ 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($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 @@ -122,21 +149,49 @@ sub exec_show($$$) $output .= $stat[7]; $output .= " "; $output .= strftime($config->{'timeformat'},localtime($stat[9])); - $output .= ($in_use) ? " (IN USE) " : (not -T $phys_path) ? " (BINARY) " : " " x 10; + $output .= " " x 10; $output .= encode_entities($file); $output .= " " x ($max_name_len - length($file))."\t ("; - $output .= (-r $phys_path && -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 .= (not -r $phys_path) ? "Not readable" : + (not -w $phys_path) ? "Read only" : + (-B $phys_path) ? "Binary file" : + ($in_use) ? "In use" : ""; + + $output .= '">Edit'; + } + + # Link "Do other stuff" + + $output .= " | Work with file)\n"; } $output .= "\n\n
\n\n"; @@ -172,7 +227,7 @@ END { # View a file - return error("You have not enough permissions to view this file.") unless(-r $physical); + 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 @@ -182,7 +237,7 @@ END { # 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 { @@ -220,9 +275,9 @@ 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.") unless(-r $physical && -w $physical); + return error("You have not enough permissions to edit this file.",upper_path($virtual)) unless(-r $physical && -w $physical); # Check on binary files @@ -230,7 +285,7 @@ sub exec_beginedit($$) { # 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 { @@ -301,7 +356,7 @@ 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.") unless(-r $physical && -w $physical); + return error("You have not enough permissions to edit this file.",upper_path($virtual)) unless(-r $physical && -w $physical); # Normalize newlines @@ -330,7 +385,7 @@ sub exec_endedit($$) } else { - return error("Saving of file '".encode_entities($virtual)."' failed'.",upper_path($virtual)); + return error("Saving of file '".encode_entities($virtual)."' failed'. The file could be damaged, please check it's integrity.",upper_path($virtual)); } } @@ -354,9 +409,7 @@ sub exec_mkfile($$) 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); - - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + return devedit_reload({command => 'show', file => $dir}); } # exec_mkdir() @@ -378,15 +431,13 @@ sub exec_mkdir($$) return error("A file or directory called '$new_virtual' already exists.",$dir) if(-e $new_physical); - mkdir($new_physical) or return error("Could not create directory '$new_virtual'.",$dir); - - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + 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 @@ -412,22 +463,25 @@ sub exec_workwithfile($$) $output .= "

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

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

Copy file '$virtual' to: $dir

+

Copy file '$virtual' to:
$dir


END + } if($unused) { @@ -440,17 +494,19 @@ END
-

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

+

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


-

Delete

+

Remove

+ +

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

-

+

END } @@ -478,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 @@ -498,16 +608,52 @@ sub exec_copy($$) $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) { - return error("A file or directory called '$new_virtual' already exists and this editor is currently not able to ask to overwrite the existing file or directory.",upper_path($virtual)); + 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; + } } - copy($physical,$new_physical) or return error("Could not copy '$virtual' to '$new_virtual'",upper_path($virtual)); + 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); + } - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + 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() @@ -533,13 +679,48 @@ sub exec_rename($$) if(-e $new_physical) { - return error("A file or directory called '$new_virtual' already exists and this editor is currently not able to ask to overwrite the existing file or directory.",upper_path($virtual)); + 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; + } } - rename($physical,$new_physical) or return error("Could not move/rename '".encode_entities($virtual)."' to '$new_virtual'.",upper_path($virtual)); + 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); + } - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + 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() @@ -557,13 +738,70 @@ sub exec_remove($$) my $physical = $data->{'physical'}; my $virtual = $data->{'virtual'}; - return error("Deleting directories is currently unsupported.") if(-d $physical); - 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)); unlink($physical) or return error("Could not delete file '".encode_entities($virtual)."'.",upper_path($virtual)); + return devedit_reload({command => 'show', file => upper_path($virtual)}); +} - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=".upper_path($virtual)); - return \$output; +# 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) + +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() @@ -585,8 +823,7 @@ sub exec_unlock($$) $uselist->remove_file($virtual); $uselist->save; - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=".upper_path($virtual)); - return \$output; + return devedit_reload({command => 'show', file => upper_path($virtual)}); } # it's true, baby ;-)