X-Git-Url: https://git.p6c8.net/devedit.git/blobdiff_plain/9aec369517b886b0afa3cdbe69160c34ec9731f2..7febe1a1710566c5d66cdbd125fd81fb0f89512f:/modules/Command.pm diff --git a/modules/Command.pm b/modules/Command.pm index 751392f..635d43d 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-27 +# Last modified: 2003-12-02 # 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" - $output .= " | Do other stuff)\n"; + if(-w $phys_path && -r $phys_path && -T $phys_path && not $in_use) + { + $output .= "Edit"; + } + else + { + $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 @@ -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,10 +431,8 @@ 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() @@ -412,19 +463,19 @@ 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 if we have read access + $output .= "
\n\n"; + + # 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


@@ -443,17 +494,19 @@ END
-

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

+

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


Delete

+

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

+
-

+

END } @@ -481,6 +534,60 @@ END return \$output; } +# exec_workwithdir() +# +# Display a form for renaming/deleting 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

+
+ +
+ +

Delete

+ +

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 @@ -509,9 +616,7 @@ sub exec_copy($$) } copy($physical,$new_physical) or return error("Could not copy '$virtual' to '$new_virtual'",upper_path($virtual)); - - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + return devedit_reload({command => 'show', file => $dir}); } # exec_rename() @@ -541,9 +646,7 @@ sub exec_rename($$) } rename($physical,$new_physical) or return error("Could not move/rename '".encode_entities($virtual)."' to '$new_virtual'.",upper_path($virtual)); - - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); - return \$output; + return devedit_reload({command => 'show', file => $dir}); } # exec_remove() @@ -561,13 +664,68 @@ 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'}; + + 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() @@ -589,8 +747,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 ;-)