From: pcanterino <> Date: Wed, 8 Oct 2003 11:47:51 +0000 (+0000) Subject: Dev-Editor 1.0 X-Git-Tag: version_1_0 X-Git-Url: https://git.p6c8.net/devedit.git/commitdiff_plain/89269f652fc46e65006b9aead5eb1ae61ebc311e Dev-Editor 1.0 --- diff --git a/devedit.pl b/devedit.pl index 42e1d40..6f38e38 100644 --- a/devedit.pl +++ b/devedit.pl @@ -6,12 +6,15 @@ # Dev-Editor's main program # # Author: Patrick Canterino -# Last modified: 09-22-2003 +# Last modified: 10-04-2003 # use strict; use CGI::Carp qw(fatalsToBrowser); +use vars qw($VERSION + %config); + use lib 'modules'; use CGI; @@ -20,17 +23,18 @@ use File::UseList; use Output; use Tool; -our $VERSION = '0.7'; +$VERSION = '1.0'; ### Settings ### -our %config = ( - fileroot => 'D:/Server/WWW/Root', - httproot => '/', - uselist_file => 'uselist', - lock_file => 'uselist.lock', - lock_timeout => '10' - ); +%config = ( + fileroot => 'D:/Server/WWW/dokumente', + httproot => '/', + timeformat => '%d.%m.%Y %H:%M', + uselist_file => 'uselist', + lock_file => 'uselist.lock', + lock_timeout => '10' + ); ### End Settings ### @@ -40,6 +44,44 @@ my $cgi = new CGI; my $command = $cgi->param('command') || 'show'; my $file = $cgi->param('file') || '/'; +my $curdir = $cgi->param('curdir') || ''; +my $newfile = $cgi->param('newfile') || ''; + +# Create physical and virtual path for the new file +# This section has to be optimized - ugh! + +my $new_physical = ''; +my $new_virtual = ''; + +if($newfile ne '') +{ + $curdir = upper_path($file) if($curdir eq ''); + my $path = clean_path($curdir.$newfile); + + # Extract file and directory name... + + my $file = file_name($path); + my $dir = upper_path($path); + + # ... check if the directory exists ... + + unless(-d clean_path($config{'fileroot'}."/".$dir)) + { + abort("The directory where you want to create this file or directory doesn't exist."); + } + + # ... and check if the path is above the root directory + + unless(($new_physical,$new_virtual) = check_path($config{'fileroot'},$dir)) + { + abort("You aren't allowed to create files and directories above the virtual root directory."); + } + + # Create the physical and the virtual path + + $new_physical = File::Spec->canonpath($new_physical."/".$file); + $new_virtual .= $file; +} # This check has to be performed first, or abs_path() will be confused @@ -53,11 +95,11 @@ if(-e clean_path($config{'fileroot'}."/".$file)) 'beginedit' => \&exec_beginedit, 'canceledit' => \&exec_unlock, 'endedit' => \&exec_endedit, - # 'mkdir' => \&exec_mkdir, - # 'mkfile' => \&exec_mkfile, + 'mkdir' => \&exec_mkdir, + 'mkfile' => \&exec_mkfile, 'workwithfile' => \&exec_workwithfile, - # 'copy' => \&exec_copy, - # 'rename' => \&exec_rename, + 'copy' => \&exec_copy, + 'rename' => \&exec_rename, 'remove' => \&exec_remove, 'unlock' => \&exec_unlock ); @@ -68,16 +110,16 @@ if(-e clean_path($config{'fileroot'}."/".$file)) lockfile => $config{'lock_file'}, timeout => $config{'lock_timeout'}); - $uselist->lock or abort("Locking failed. Try it again in a moment. If the problem persists, ask someone to recreate the lockfile ($config{'lock_file'})."); + $uselist->lock or abort("Locking of $config{'uselist_file'} failed. Try it again in a moment. If the problem persists, ask someone to recreate the lock file ($config{'lock_file'})."); $uselist->load; # Create a hash with data submitted by user - # (the CGI and the File::UseList objects will also be included) + # (the CGI and the File::UseList object will also be included) my %data = (physical => $physical, virtual => $virtual, - new_physical => '', - new_virtual => '', + new_physical => $new_physical, + new_virtual => $new_virtual, uselist => $uselist, cgi => $cgi); diff --git a/modules/Command.pm b/modules/Command.pm index 6aa3fc1..363cffe 100644 --- a/modules/Command.pm +++ b/modules/Command.pm @@ -6,7 +6,7 @@ package Command; # Execute Dev-Editor's commands # # Author: Patrick Canterino -# Last modified: 09-25-2003 +# Last modified: 10-04-2003 # use strict; @@ -14,8 +14,7 @@ use strict; use vars qw(@EXPORT $script); -use CGI qw(header - redirect); +use CGI qw(redirect); use File::Access; use File::Copy; @@ -86,7 +85,7 @@ sub exec_show($$$) $output .= "../\n"; } - # Get the longest file/directory name + # Get the length of the longest file/directory name my $max_name_len = 0; @@ -104,7 +103,7 @@ sub exec_show($$$) $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"; } @@ -122,7 +121,7 @@ sub exec_show($$$) $output .= " " x (10 - length($stat[7])); $output .= $stat[7]; $output .= " "; - $output .= strftime("%d.%m.%Y %H:%M",localtime($stat[9])); + $output .= strftime($config->{'timeformat'},localtime($stat[9])); $output .= ($in_use) ? " (IN USE) " : (not -T $phys_path) ? " (BINARY) " : " " x 10; $output .= encode_entities($file); $output .= " " x ($max_name_len - length($file))."\t ("; @@ -148,12 +147,20 @@ sub exec_show($$$) $output .= < +
+ + Create new directory: -$virtual +$virtual +
Create new file: -$virtual +
+ + +$virtual +
@@ -192,7 +199,7 @@ END } } - return \$output + return \$output; } # exec_beginedit @@ -229,30 +236,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 $output = htmlhead("Edit file ".encode_entities($virtual)); - $output .= equal_url($config->{'httproot'},$virtual); + my $equal_url = equal_url($config->{'httproot'},$virtual); - $virtual = encode_entities($virtual); + $virtual = encode_entities($virtual); + my $output = htmlhead("Edit file $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.

-
+

-
+ - + @@ -296,15 +306,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 '".encode_entities($virtual)."' failed'"); + return error("Saving of file '".encode_entities($virtual)."' failed'."); } } @@ -319,7 +337,18 @@ 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' does already exist.") if(-e $new_physical); + + file_create($new_physical) or return error("Could not create file '$new_virtual'."); + + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); + return \$output; } # exec_mkdir() @@ -333,7 +362,18 @@ 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' does already exist.") if(-e $new_physical); + + mkdir($new_physical) or return error("Could not create directory '$new_virtual'."); + + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); + return \$output; } # exec_workwithfile() @@ -352,6 +392,8 @@ sub exec_workwithfile($$) my $virtual = $data->{'virtual'}; my $unused = $data->{'uselist'}->unused($virtual); + my $dir = encode_entities(upper_path($virtual)); + my $output = htmlhead("Work with file ".encode_entities($virtual)); $output .= equal_url($config->{'httproot'},$virtual); @@ -369,7 +411,11 @@ sub exec_workwithfile($$)

Copy

-

Copy file '$virtual' to:

+ + + +

Copy file '$virtual' to: $dir

+
@@ -383,7 +429,11 @@ END $output .= <Move/rename -

Move/Rename file '$virtual' to:

+
+ + +

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

+
@@ -431,7 +481,25 @@ 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); + + if(-e $new_physical) + { + return error("A file or directory called '$new_virtual' does already exists and this editor is currently not able to ask to overwrite the existing file or directory."); + } + + copy($physical,$new_physical) or return error("Could not copy '$virtual' to '$new_virtual'"); + + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); + return \$output; } # exec_rename() @@ -445,7 +513,25 @@ 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) + { + return error("A file or directory called '$new_virtual' does already exists and this editor is currently not able to ask to overwrite the existing file or directory."); + } + + rename($physical,$new_physical) or return error("Could not move/rename '".encode_entities($virtual)."' to '$new_virtual'."); + + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); + return \$output; } # exec_remove() @@ -463,14 +549,12 @@ sub exec_remove($$) my $physical = $data->{'physical'}; my $virtual = $data->{'virtual'}; - return error("Deleting of directories is currently unsupported") if(-d $physical); + return error("Deleting directories is currently unsupported") 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)."'."); - my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=$dir"); + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=".upper_path($virtual)); return \$output; } @@ -487,16 +571,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"); + my $output = redirect("http://$ENV{'HTTP_HOST'}$script?command=show&file=".upper_path($virtual)); return \$output; } diff --git a/modules/Output.pm b/modules/Output.pm index e8d4bad..6139430 100644 --- a/modules/Output.pm +++ b/modules/Output.pm @@ -6,7 +6,7 @@ package Output; # HTML generating routines # # Author: Patrick Canterino -# Last modified: 09-22-2003 +# Last modified: 09-23-2003 # use strict; @@ -32,6 +32,7 @@ use base qw(Exporter); # htmlhead() # # Generate the head of a HTML document +# (a text/html HTTP header will also be created) # # Params: Title and heading # @@ -95,7 +96,8 @@ sub error($) # abort() # -# Print and error message and exit script +# Print an error message and exit script +# ^^^^^ # # Params: Error message diff --git a/modules/Tool.pm b/modules/Tool.pm index 47b73e6..a37967e 100644 --- a/modules/Tool.pm +++ b/modules/Tool.pm @@ -6,15 +6,13 @@ package Tool; # Some shared sub routines # # Author: Patrick Canterino -# Last modified: 09-22-2003 +# Last modified: 10-03-2003 # use strict; use vars qw(@EXPORT); -use Carp qw(croak); - use Cwd qw(abs_path); use File::Basename; use File::Spec; @@ -25,7 +23,7 @@ use base qw(Exporter); @EXPORT = qw(check_path clean_path - filemode + file_name upper_path); # check_path() @@ -107,32 +105,26 @@ sub clean_path($) return $path; } -# filemode() +# file_name() # -# Creates a readable string of a UNIX filemode number -# (copied from Tool.pm of Dev-Editor 0.1.4) +# Returns the last path of a filename # -# Params: Filemode as number +# Params: Path # -# Return: Filemode as readable string +# Return: Last part of the path -sub filemode($) +sub file_name($) { - my ($modestring, $ur, $uw, $ux, $gr, $gw, $gx, $or, $ow, $ox); - my $mode = shift; - - $ur = ($mode & 0400) ? "r" : "-"; # User Read - $uw = ($mode & 0200) ? "w" : "-"; # User Write - $ux = ($mode & 0100) ? "x" : "-"; # User eXecute - $gr = ($mode & 0040) ? "r" : "-"; # Group Read - $gw = ($mode & 0020) ? "w" : "-"; # Group Write - $gx = ($mode & 0010) ? "x" : "-"; # Group eXecute - $or = ($mode & 0004) ? "r" : "-"; # Other Read - $ow = ($mode & 0002) ? "w" : "-"; # Other Write - $ox = ($mode & 0001) ? "x" : "-"; # Other eXecute - - # build a readable mode string (rwxrwxrwx) - return $ur . $uw . $ux . $gr . $gw . $gx . $or . $ow . $ox; + my $path = shift; + $path =~ tr!\\!/!; + + unless($path eq "/") + { + $path = substr($path,0,-1) if($path =~ m!/$!); + $path = substr($path,rindex($path,"/")+1); + } + + return $path; } # upper_path()
Save as new file: $dir + + Save as new file: $dir Encode ISO-8859-1 special chars