]>
git.p6c8.net - devedit.git/blob - modules/Command.pm
4 # Dev-Editor - Module Command
6 # Execute Dev-Editor's commands
8 # Author: Patrick Canterino <patrick@patshaping.de>
9 # Last modified: 2005-02-12
20 use POSIX qw(strftime);
30 my $script = encode_entities
($ENV{'SCRIPT_NAME'});
31 my $users = eval('getpwuid(0)') && eval('getgrgid(0)');
33 my %dispatch = ('show' => \
&exec_show
,
34 'beginedit' => \
&exec_beginedit
,
35 'canceledit' => \
&exec_canceledit
,
36 'endedit' => \
&exec_endedit
,
37 'mkdir' => \
&exec_mkdir
,
38 'mkfile' => \
&exec_mkfile
,
39 'upload' => \
&exec_upload
,
40 'copy' => \
&exec_copy
,
41 'rename' => \
&exec_rename
,
42 'remove' => \
&exec_remove
,
43 'chprop' => \
&exec_chprop
,
44 'unlock' => \
&exec_unlock
,
45 'about' => \
&exec_about
50 use base
qw(Exporter);
52 @EXPORT = qw(exec_command);
56 # Execute the specified command
58 # Params: 1. Command to execute
59 # 2. Reference to user input hash
60 # 3. Reference to config hash
62 # Return: Output of the command (Scalar Reference)
66 my ($command,$data,$config) = @_;
68 foreach(keys(%dispatch))
70 if(lc($_) eq lc($command))
72 my $output = &{$dispatch{$_}}($data,$config);
77 return error
($config->{'errors'}->{'cmd_unknown'},'/',{COMMAND
=> encode_entities
($command)});
82 # View a directory or a file
84 # Params: 1. Reference to user input hash
85 # 2. Reference to config hash
87 # Return: Output of the command (Scalar Reference)
91 my ($data,$config) = @_;
92 my $physical = $data->{'physical'};
93 my $virtual = $data->{'virtual'};
94 my $upper_path = encode_entities
(upper_path
($virtual));
95 my $uselist = $data->{'uselist'};
97 my $tpl = new Template
;
99 if(-d
$physical && not -l
$physical)
101 # Create directory listing
103 return error
($config->{'errors'}->{'no_dir_access'},$upper_path) unless(-r
$physical && -x
$physical);
105 my $direntries = dir_read
($physical);
106 return error
($config->{'dir_read_fail'},$upper_path,{DIR
=> encode_entities
($virtual)}) unless($direntries);
108 my $files = $direntries->{'files'};
109 my $dirs = $direntries->{'dirs'};
111 my $dir_writeable = -w
$physical;
115 my $filter1 = $data->{'cgi'}->param('filter') || '*'; # The real wildcard
116 my $filter2 = ($filter1 && $filter1 ne '*') ?
$filter1 : ''; # Wildcard for output
118 # Create the link to the upper directory
119 # (only if the current directory is not the root directory)
121 unless($virtual eq '/')
123 my @stat = stat($physical.'/..');
125 my $udtpl = new Template
;
126 $udtpl->read_file($config->{'templates'}->{'dirlist_up'});
128 $udtpl->fillin('UPPER_DIR',$upper_path);
129 $udtpl->fillin('DATE',encode_entities
(strftime
($config->{'timeformat'},($config->{'use_gmt'}) ?
gmtime($stat[9]) : localtime($stat[9]))));
131 $dirlist .= $udtpl->get_template;
136 foreach my $dir(@
$dirs)
138 next unless(dos_wildcard_match
($filter1,$dir));
140 my $phys_path = $physical.'/'.$dir;
141 my $virt_path = encode_entities
($virtual.$dir.'/');
143 my @stat = stat($phys_path);
145 my $dtpl = new Template
;
146 $dtpl->read_file($config->{'templates'}->{'dirlist_dir'});
148 $dtpl->fillin('DIR',$virt_path);
149 $dtpl->fillin('DIR_NAME',encode_entities
($dir));
150 $dtpl->fillin('DATE',encode_entities
(strftime
($config->{'timeformat'},($config->{'use_gmt'}) ?
gmtime($stat[9]) : localtime($stat[9]))));
151 $dtpl->fillin('URL',equal_url
(encode_entities
($config->{'httproot'}),$virt_path));
153 $dtpl->parse_if_block('readable',-r
$phys_path && -x
$phys_path);
154 $dtpl->parse_if_block('users',$users && -o
$phys_path);
156 $dirlist .= $dtpl->get_template;
161 foreach my $file(@
$files)
163 next unless(dos_wildcard_match
($filter1,$file));
165 my $phys_path = $physical.'/'.$file;
166 my $virt_path = encode_entities
($virtual.$file);
168 my @stat = lstat($phys_path);
169 my $in_use = $uselist->in_use($virtual.$file);
170 my $too_large = $config->{'max_file_size'} && $stat[7] > $config->{'max_file_size'};
172 my $ftpl = new Template
;
173 $ftpl->read_file($config->{'templates'}->{'dirlist_file'});
175 $ftpl->fillin('FILE',$virt_path);
176 $ftpl->fillin('FILE_NAME',encode_entities
($file));
177 $ftpl->fillin('SIZE',$stat[7]);
178 $ftpl->fillin('DATE',encode_entities
(strftime
($config->{'timeformat'},($config->{'use_gmt'}) ?
gmtime($stat[9]) : localtime($stat[9]))));
179 $ftpl->fillin('URL',equal_url
(encode_entities
($config->{'httproot'}),$virt_path));
181 $ftpl->parse_if_block('link',-l
$phys_path);
182 $ftpl->parse_if_block('no_link',not -l
$phys_path);
183 $ftpl->parse_if_block('not_readable',not -r
$phys_path);
184 $ftpl->parse_if_block('binary',-B
$phys_path);
185 $ftpl->parse_if_block('readonly',not -w
$phys_path);
187 $ftpl->parse_if_block('viewable',(-r
$phys_path && -T
$phys_path && not $too_large) || -l
$phys_path);
188 $ftpl->parse_if_block('editable',((-r
$phys_path && -w
$phys_path && -T
$phys_path && not $too_large) && not $in_use) && not -l
$phys_path);
190 $ftpl->parse_if_block('in_use',$in_use);
191 $ftpl->parse_if_block('unused',not $in_use);
193 $ftpl->parse_if_block('too_large',$config->{'max_file_size'} && $stat[7] > $config->{'max_file_size'});
195 $ftpl->parse_if_block('users',$users && -o
$phys_path);
197 $dirlist .= $ftpl->get_template;
200 $tpl->read_file($config->{'templates'}->{'dirlist'});
202 $tpl->fillin('DIRLIST',$dirlist);
203 $tpl->fillin('DIR',encode_entities
($virtual));
204 $tpl->fillin('SCRIPT',$script);
205 $tpl->fillin('URL',encode_entities
(equal_url
($config->{'httproot'},$virtual)));
207 $tpl->fillin('FILTER',encode_entities
($filter2));
208 $tpl->fillin('FILTER_URL',escape
($filter2));
210 $tpl->parse_if_block('dir_writeable',$dir_writeable);
211 $tpl->parse_if_block('filter',$filter2);
212 $tpl->parse_if_block('gmt',$config->{'use_gmt'});
216 # Show the target of a symbolic link
218 my $link_target = readlink($physical);
220 $tpl->read_file($config->{'templates'}->{'viewlink'});
222 $tpl->fillin('FILE',encode_entities
($virtual));
223 $tpl->fillin('DIR',$upper_path);
224 $tpl->fillin('URL',encode_entities
(equal_url
($config->{'httproot'},$virtual)));
225 $tpl->fillin('SCRIPT',$script);
227 $tpl->fillin('LINK_TARGET',encode_entities
($link_target));
233 return error
($config->{'errors'}->{'no_view'},$upper_path) unless(-r
$physical);
235 # Check on binary files
236 # We have to do it in this way or empty files will be recognized
239 return error
($config->{'errors'}->{'binary'},$upper_path) unless(-T
$physical);
241 # Is the file too large?
243 return error
($config->{'errors'}->{'file_too_large'},$upper_path,{SIZE
=> $config->{'max_file_size'}}) if($config->{'max_file_size'} && -s
$physical > $config->{'max_file_size'});
247 my $content = file_read
($physical);
248 $$content =~ s/\015\012|\012|\015/\n/g;
250 $tpl->read_file($config->{'templates'}->{'viewfile'});
252 $tpl->fillin('FILE',encode_entities
($virtual));
253 $tpl->fillin('DIR',$upper_path);
254 $tpl->fillin('URL',encode_entities
(equal_url
($config->{'httproot'},$virtual)));
255 $tpl->fillin('SCRIPT',$script);
257 $tpl->parse_if_block('editable',-w
$physical && $uselist->unused($virtual));
259 $tpl->fillin('CONTENT',encode_entities
($$content));
262 my $output = header
(-type
=> 'text/html');
263 $output .= $tpl->get_template;
270 # Lock a file and display a form to edit it
272 # Params: 1. Reference to user input hash
273 # 2. Reference to config hash
275 # Return: Output of the command (Scalar Reference)
277 sub exec_beginedit
($$)
279 my ($data,$config) = @_;
280 my $physical = $data->{'physical'};
281 my $virtual = $data->{'virtual'};
282 my $dir = upper_path
($virtual);
283 my $uselist = $data->{'uselist'};
285 return error
($config->{'errors'}->{'link_edit'},$dir) if(-l
$physical);
286 return error
($config->{'errors'}->{'dir_edit'}, $dir) if(-d
$physical);
287 return error
($config->{'errors'}->{'in_use'}, $dir,{FILE
=> $virtual}) if($uselist->in_use($virtual));
288 return error
($config->{'errors'}->{'no_edit'}, $dir) unless(-r
$physical && -w
$physical);
290 # Check on binary files
292 return error
($config->{'errors'}->{'binary'},$dir) unless(-T
$physical);
294 # Is the file too large?
296 return error
($config->{'errors'}->{'file_too_large'},$dir,{SIZE
=> $config->{'max_file_size'}}) if($config->{'max_file_size'} && -s
$physical > $config->{'max_file_size'});
300 ($uselist->add_file($virtual) and
301 $uselist->save) or return error
($config->{'errors'}->{'ul_add_failed'},$dir,{FILE
=> $virtual});
303 # ... and show the editing form
305 my $content = file_read
($physical);
306 $$content =~ s/\015\012|\012|\015/\n/g;
308 my $tpl = new Template
;
309 $tpl->read_file($config->{'templates'}->{'editfile'});
311 $tpl->fillin('FILE',$virtual);
312 $tpl->fillin('DIR',$dir);
313 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
314 $tpl->fillin('SCRIPT',$script);
315 $tpl->fillin('CONTENT',encode_entities
($$content));
317 my $output = header
(-type
=> 'text/html');
318 $output .= $tpl->get_template;
327 # Params: 1. Reference to user input hash
328 # 2. Reference to config hash
330 # Return: Output of the command (Scalar Reference)
332 sub exec_canceledit
($$)
334 my ($data,$config) = @_;
335 my $virtual = $data->{'virtual'};
336 my $dir = upper_path
($virtual);
337 my $uselist = $data->{'uselist'};
339 file_unlock
($uselist,$virtual) or return error
($config->{'errors'}->{'ul_rm_failed'},$dir,{FILE
=> $virtual, USELIST
=> $uselist->{'listfile'}});
340 return devedit_reload
({command
=> 'show', file
=> $dir});
345 # Save a file, unlock it and return to directory view
347 # Params: 1. Reference to user input hash
348 # 2. Reference to config hash
350 # Return: Output of the command (Scalar Reference)
354 my ($data,$config) = @_;
355 my $physical = $data->{'physical'};
356 my $virtual = $data->{'virtual'};
357 my $dir = upper_path
($virtual);
358 my $content = $data->{'cgi'}->param('filecontent');
359 my $uselist = $data->{'uselist'};
361 # We already unlock the file at the beginning of the subroutine,
362 # because if we have to abort this routine, the file keeps locked.
363 # No other user of Dev-Editor will access the file during this
364 # routine because of the concept of File::UseList.
366 file_unlock
($uselist,$virtual) or return error
($config->{'errors'}->{'ul_rm_failed'},$dir,{FILE
=> $virtual, USELIST
=> $uselist->{'listfile'}});
370 $content =~ s/\015\012|\012|\015/\n/g;
372 if($data->{'cgi'}->param('encode_iso'))
374 # Encode all ISO-8859-1 special chars
376 $content = encode_entities
($content,"\200-\377");
379 if($data->{'cgi'}->param('saveas') && $data->{'new_physical'} ne '' && $data->{'new_virtual'} ne '')
381 # Create the new filename
383 $physical = $data->{'new_physical'};
384 $virtual = $data->{'new_virtual'};
386 # Check if someone else is editing the new file
388 return error
($config->{'errors'}->{'in_use'},$dir,{FILE
=> $virtual}) if($uselist->in_use($virtual));
391 return error
($config->{'errors'}->{'link_edit'},$dir) if(-l
$physical);
392 return error
($config->{'errors'}->{'dir_edit'},$dir) if(-d
$physical);
393 return error
($config->{'errors'}->{'no_edit'},$dir) if(-e
$physical && !(-r
$physical && -w
$physical));
394 return error
($config->{'errors'}->{'text_to_binary'},$dir) unless(-T
$physical);
396 if(file_save
($physical,\
$content))
398 # The file was successfully saved!
400 return devedit_reload
({command
=> 'show', file
=> $dir});
404 return error
($config->{'errors'}->{'edit_failed'},$dir,{FILE
=> $virtual});
410 # Create a file and return to directory view
412 # Params: 1. Reference to user input hash
413 # 2. Reference to config hash
415 # Return: Output of the command (Scalar Reference)
419 my ($data,$config) = @_;
420 my $new_physical = $data->{'new_physical'};
421 my $new_virtual = $data->{'new_virtual'};
422 my $dir = upper_path
($new_virtual);
423 $new_virtual = encode_entities
($new_virtual);
427 return error
($config->{'errors'}->{'file_exists'},$dir,{FILE
=> $new_virtual}) if(-e
$new_physical);
429 file_create
($new_physical) or return error
($config->{'errors'}->{'mkfile_failed'},$dir,{FILE
=> $new_virtual});
430 return devedit_reload
({command
=> 'show', file
=> $dir});
434 my $tpl = new Template
;
435 $tpl->read_file($config->{'templates'}->{'mkfile'});
437 $tpl->fillin('DIR','/');
438 $tpl->fillin('SCRIPT',$script);
440 my $output = header
(-type
=> 'text/html');
441 $output .= $tpl->get_template;
449 # Create a directory and return to directory view
451 # Params: 1. Reference to user input hash
452 # 2. Reference to config hash
454 # Return: Output of the command (Scalar Reference)
458 my ($data,$config) = @_;
459 my $new_physical = $data->{'new_physical'};
460 my $new_virtual = $data->{'new_virtual'};
461 my $dir = upper_path
($new_virtual);
462 $new_virtual = encode_entities
($new_virtual);
466 return error
($config->{'errors'}->{'file_exists'},$dir,{FILE
=> $new_virtual}) if(-e
$new_physical);
468 mkdir($new_physical,0777) or return error
($config->{'errors'}->{'mkdir_failed'},$dir,{DIR
=> $new_virtual});
469 return devedit_reload
({command
=> 'show', file
=> $dir});
473 my $tpl = new Template
;
474 $tpl->read_file($config->{'templates'}->{'mkdir'});
476 $tpl->fillin('DIR','/');
477 $tpl->fillin('SCRIPT',$script);
479 my $output = header
(-type
=> 'text/html');
480 $output .= $tpl->get_template;
488 # Process a file upload
490 # Params: 1. Reference to user input hash
491 # 2. Reference to config hash
493 # Return: Output of the command (Scalar Reference)
497 my ($data,$config) = @_;
498 my $physical = $data->{'physical'};
499 my $virtual = $data->{'virtual'};
500 my $cgi = $data->{'cgi'};
502 return error
($config->{'errors'}->{'no_directory'},upper_path
($virtual),{FILE
=> $virtual}) unless(-d
$physical && not -l
$physical);
503 return error
($config->{'errors'}->{'dir_no_create'},$virtual,{DIR
=> $virtual}) unless(-w
$physical);
505 if(my $uploaded_file = $cgi->param('uploaded_file'))
507 # Process file upload
509 my $filename = file_name
($uploaded_file);
510 my $file_phys = $physical.'/'.$filename;
511 my $file_virt = $virtual.$filename;
513 return error
($config->{'errors'}->{'in_use'},$virtual,{FILE
=> $file_virt}) if($data->{'uselist'}->in_use($file_virt));
517 return error
($config->{'errors'}->{'link_replace'},$virtual) if(-l
$file_phys);
518 return error
($config->{'errors'}->{'dir_replace'},$virtual) if(-d
$file_phys);
519 return error
($config->{'errors'}->{'exist_no_write'},$virtual,{FILE
=> $file_virt}) unless(-w
$file_phys);
520 return error
($config->{'errors'}->{'file_exists'},$virtual,{FILE
=> $file_virt}) unless($cgi->param('overwrite'));
523 my $ascii = $cgi->param('ascii');
524 my $handle = $cgi->upload('uploaded_file');
526 return error
($config->{'errors'}->{'invalid_upload'},$virtual) unless($handle);
528 # Read transferred file and write it to disk
530 read($handle, my $data, -s
$handle);
531 $data =~ s/\015\012|\012|\015/\n/g if($ascii); # Replace line separators if transferring in ASCII mode
532 file_save
($file_phys,\
$data,not $ascii) or return error
($config->{'errors'}->{'mkfile_failed'},$virtual,{FILE
=> $file_virt});
534 return devedit_reload
({command
=> 'show', file
=> $virtual});
538 my $tpl = new Template
;
539 $tpl->read_file($config->{'templates'}->{'upload'});
541 $tpl->fillin('DIR',$virtual);
542 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
543 $tpl->fillin('SCRIPT',$script);
545 my $output = header
(-type
=> 'text/html');
546 $output .= $tpl->get_template;
554 # Copy a file and return to directory view
556 # Params: 1. Reference to user input hash
557 # 2. Reference to config hash
559 # Return: Output of the command (Scalar Reference)
563 my ($data,$config) = @_;
564 my $physical = $data->{'physical'};
565 my $virtual = encode_entities
($data->{'virtual'});
566 my $dir = upper_path
($virtual);
567 my $new_physical = $data->{'new_physical'};
569 return error
($config->{'errors'}->{'link_copy'},$dir) if(-l
$physical);
570 return error
($config->{'errors'}->{'dir_copy'},$dir) if(-d
$physical);
571 return error
($config->{'errors'}->{'no_copy'},$dir) unless(-r
$physical);
575 my $new_virtual = $data->{'new_virtual'};
576 my $new_dir = upper_path
($new_virtual);
577 $new_virtual = encode_entities
($new_virtual);
581 return error
($config->{'errors'}->{'exist_edited'},$new_dir,{FILE
=> $new_virtual}) if($data->{'uselist'}->in_use($data->{'new_virtual'}));
582 return error
($config->{'errors'}->{'link_replace'},$new_dir) if(-l
$new_physical);
583 return error
($config->{'errors'}->{'dir_replace'},$new_dir) if(-d
$new_physical);
584 return error
($config->{'errors'}->{'exist_no_write'},$new_dir,{FILE
=> $new_virtual}) unless(-w
$new_physical);
586 if(not $data->{'cgi'}->param('confirmed'))
588 my $tpl = new Template
;
589 $tpl->read_file($config->{'templates'}->{'confirm_replace'});
591 $tpl->fillin('FILE',$virtual);
592 $tpl->fillin('NEW_FILE',$new_virtual);
593 $tpl->fillin('NEW_FILENAME',file_name
($new_virtual));
594 $tpl->fillin('NEW_DIR',$new_dir);
595 $tpl->fillin('DIR',$dir);
597 $tpl->fillin('COMMAND','copy');
598 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
599 $tpl->fillin('SCRIPT',$script);
601 my $output = header
(-type
=> 'text/html');
602 $output .= $tpl->get_template;
608 copy
($physical,$new_physical) or return error
($config->{'errors'}->{'copy_failed'},$dir,{FILE
=> $virtual, NEW_FILE
=> $new_virtual});
609 return devedit_reload
({command
=> 'show', file
=> $new_dir});
613 my $tpl = new Template
;
614 $tpl->read_file($config->{'templates'}->{'copyfile'});
616 $tpl->fillin('FILE',$virtual);
617 $tpl->fillin('DIR',$dir);
618 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
619 $tpl->fillin('SCRIPT',$script);
621 my $output = header
(-type
=> 'text/html');
622 $output .= $tpl->get_template;
630 # Rename/move a file and return to directory view
632 # Params: 1. Reference to user input hash
633 # 2. Reference to config hash
635 # Return: Output of the command (Scalar Reference)
639 my ($data,$config) = @_;
640 my $physical = $data->{'physical'};
641 my $virtual = $data->{'virtual'};
642 my $dir = upper_path
($virtual);
643 my $new_physical = $data->{'new_physical'};
645 return error
($config->{'errors'}->{'rename_root'},'/') if($virtual eq '/');
646 return error
($config->{'errors'}->{'no_rename'},$dir) unless(-w upper_path
($physical));
647 return error
($config->{'errors'}->{'in_use'},$dir,{FILE
=> $virtual}) if($data->{'uselist'}->in_use($virtual));
651 my $new_virtual = $data->{'new_virtual'};
652 my $new_dir = upper_path
($new_virtual);
653 $new_virtual = encode_entities
($new_virtual);
657 return error
($config->{'errors'}->{'exist_edited'},$new_dir,{FILE
=> $new_virtual}) if($data->{'uselist'}->in_use($data->{'new_virtual'}));
658 return error
($config->{'errors'}->{'dir_replace'},$new_dir) if(-d
$new_physical && not -l
$new_physical);
659 return error
($config->{'errors'}->{'exist_no_write'},$new_dir,{FILE
=> $new_virtual}) unless(-w
$new_physical);
661 if(not $data->{'cgi'}->param('confirmed'))
663 my $tpl = new Template
;
664 $tpl->read_file($config->{'templates'}->{'confirm_replace'});
666 $tpl->fillin('FILE',$virtual);
667 $tpl->fillin('NEW_FILE',$new_virtual);
668 $tpl->fillin('NEW_FILENAME',file_name
($new_virtual));
669 $tpl->fillin('NEW_DIR',$new_dir);
670 $tpl->fillin('DIR',$dir);
672 $tpl->fillin('COMMAND','rename');
673 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
674 $tpl->fillin('SCRIPT',$script);
676 my $output = header
(-type
=> 'text/html');
677 $output .= $tpl->get_template;
683 rename($physical,$new_physical) or return error
($config->{'errors'}->{'rename_failed'},$dir,{FILE
=> $virtual, NEW_FILE
=> $new_virtual});
684 return devedit_reload
({command
=> 'show', file
=> $new_dir});
688 my $tpl = new Template
;
689 $tpl->read_file($config->{'templates'}->{'renamefile'});
691 $tpl->fillin('FILE',$virtual);
692 $tpl->fillin('DIR',$dir);
693 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
694 $tpl->fillin('SCRIPT',$script);
696 my $output = header
(-type
=> 'text/html');
697 $output .= $tpl->get_template;
705 # Remove a file or a directory and return to directory view
707 # Params: 1. Reference to user input hash
708 # 2. Reference to config hash
710 # Return: Output of the command (Scalar Reference)
714 my ($data,$config) = @_;
715 my $physical = $data->{'physical'};
716 my $virtual = $data->{'virtual'};
717 my $dir = upper_path
($virtual);
719 return error
($config->{'errors'}->{'remove_root'},'/') if($virtual eq '/');
720 return error
($config->{'errors'}->{'no_delete'},$dir) unless(-w upper_path
($physical));
722 if(-d
$physical && not -l
$physical)
726 if($data->{'cgi'}->param('confirmed'))
729 return devedit_reload
({command
=> 'show', file
=> $dir});
733 my $tpl = new Template
;
734 $tpl->read_file($config->{'templates'}->{'confirm_rmdir'});
736 $tpl->fillin('DIR',$virtual);
737 $tpl->fillin('UPPER_DIR',$dir);
738 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
739 $tpl->fillin('SCRIPT',$script);
741 my $output = header
(-type
=> 'text/html');
742 $output .= $tpl->get_template;
751 return error
($config->{'errors'}->{'in_use'},$dir,{FILE
=> $virtual}) if($data->{'uselist'}->in_use($virtual));
753 if($data->{'cgi'}->param('confirmed'))
755 unlink($physical) or return error
($config->{'errors'}->{'delete_failed'},$dir,{FILE
=> $virtual});
756 return devedit_reload
({command
=> 'show', file
=> $dir});
760 my $tpl = new Template
;
761 $tpl->read_file($config->{'templates'}->{'confirm_rmfile'});
763 $tpl->fillin('FILE',$virtual);
764 $tpl->fillin('DIR',$dir);
765 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
766 $tpl->fillin('SCRIPT',$script);
768 my $output = header
(-type
=> 'text/html');
769 $output .= $tpl->get_template;
778 # Change the mode and the group of a file or a directory
780 # Params: 1. Reference to user input hash
781 # 2. Reference to config hash
783 # Return: Output of the command (Scalar Reference)
787 my ($data,$config) = @_;
788 my $physical = $data->{'physical'};
789 my $virtual = $data->{'virtual'};
790 my $dir = upper_path
($virtual);
792 return error
($config->{'errors'}->{'no_users'},$dir,{FILE
=> $virtual}) unless($users);
793 return error
($config->{'errors'}->{'chprop_root'},'/') if($virtual eq '/');
794 return error
($config->{'errors'}->{'not_owner'},$dir,{FILE
=> $virtual}) unless(-o
$physical);
795 return error
($config->{'errors'}->{'chprop_link'},$dir) if(-l
$physical);
796 return error
($config->{'errors'}->{'in_use'},$dir,{FILE
=> $virtual}) if($data->{'uselist'}->in_use($virtual));
798 my $cgi = $data->{'cgi'};
799 my $mode = $cgi->param('mode');
800 my $group = $cgi->param('group');
808 chmod(oct($mode),$physical);
813 # Change the group using the `chgrp` system command
815 return error
($config->{'errors'}->{'invalid_group'},$dir,{GROUP
=> encode_entities
($group)}) unless($group =~ /^[a-z0-9_]+[a-z0-9_-]*$/i);
816 system('chgrp',$group,$physical);
819 return devedit_reload
({command
=> 'show', file
=> $dir});
825 my @stat = stat($physical);
829 my $tpl = new Template
;
830 $tpl->read_file($config->{'templates'}->{'chprop'});
832 # Insert file properties into the template
834 $tpl->fillin('MODE_OCTAL',substr(sprintf('%04o',$mode),-4));
835 $tpl->fillin('MODE_STRING',mode_string
($mode));
836 $tpl->fillin('GID',$gid);
838 if(my $group = getgrgid($gid))
840 $tpl->fillin('GROUP',encode_entities
($group));
841 $tpl->parse_if_block('group_detected',1);
845 $tpl->parse_if_block('group_detected',0);
848 # Insert other information
850 $tpl->fillin('FILE',$virtual);
851 $tpl->fillin('DIR',$dir);
852 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
853 $tpl->fillin('SCRIPT',$script);
855 my $output = header
(-type
=> 'text/html');
856 $output .= $tpl->get_template;
864 # Remove a file from the list of used files and
865 # return to directory view
867 # Params: 1. Reference to user input hash
868 # 2. Reference to config hash
870 # Return: Output of the command (Scalar Reference)
874 my ($data,$config) = @_;
875 my $virtual = $data->{'virtual'};
876 my $uselist = $data->{'uselist'};
877 my $dir = upper_path
($virtual);
879 return devedit_reload
({command
=> 'show', file
=> $dir}) if($uselist->unused($virtual));
881 if($data->{'cgi'}->param('confirmed'))
883 file_unlock
($uselist,$virtual) or return error
($config->{'errors'}->{'ul_rm_failed'},$dir,{FILE
=> $virtual, USELIST
=> $uselist->{'listfile'}});
884 return devedit_reload
({command
=> 'show', file
=> $dir});
888 my $tpl = new Template
;
889 $tpl->read_file($config->{'templates'}->{'confirm_unlock'});
891 $tpl->fillin('FILE',$virtual);
892 $tpl->fillin('DIR',$dir);
893 $tpl->fillin('URL',equal_url
($config->{'httproot'},$virtual));
894 $tpl->fillin('SCRIPT',$script);
896 my $output = header
(-type
=> 'text/html');
897 $output .= $tpl->get_template;
905 # Display some information about Dev-Editor
907 # Params: 1. Reference to user input hash
908 # 2. Reference to config hash
910 # Return: Output of the command (Scalar Reference)
914 my ($data,$config) = @_;
916 my $tpl = new Template
;
917 $tpl->read_file($config->{'templates'}->{'about'});
919 $tpl->fillin('SCRIPT',$script);
921 # Dev-Editor's version number
923 $tpl->fillin('VERSION',$data->{'version'});
925 # Some path information
927 $tpl->fillin('SCRIPT_PHYS',encode_entities
($ENV{'SCRIPT_FILENAME'}));
928 $tpl->fillin('CONFIG_PATH',encode_entities
($data->{'configfile'}));
929 $tpl->fillin('FILE_ROOT', encode_entities
($config->{'fileroot'}));
930 $tpl->fillin('HTTP_ROOT', encode_entities
($config->{'httproot'}));
934 $tpl->fillin('PERL_PROG',encode_entities
($^X
));
935 $tpl->fillin('PERL_VER', sprintf('%vd',$^V
));
937 # Information about the server
939 $tpl->fillin('HTTPD',encode_entities
($ENV{'SERVER_SOFTWARE'}));
940 $tpl->fillin('OS', encode_entities
($^O
));
941 $tpl->fillin('TIME', encode_entities
(strftime
($config->{'timeformat'},($config->{'use_gmt'}) ?
gmtime : localtime)));
943 $tpl->parse_if_block('gmt',$config->{'use_gmt'});
945 # Process information
947 $tpl->fillin('PID',$$);
949 # The following information is only available on systems supporting
954 # Dev-Editor is running on a system which allows users and groups
955 # So we display the user and the group of our process
957 my $uid = POSIX
::getuid
;
958 my $gid = POSIX
::getgid
;
960 $tpl->parse_if_block('users',1);
962 # ID's of user and group
964 $tpl->fillin('UID',$uid);
965 $tpl->fillin('GID',$gid);
967 # Names of user and group
969 if(my $user = getpwuid($uid))
971 $tpl->fillin('USER',encode_entities
($user));
972 $tpl->parse_if_block('user_detected',1);
976 $tpl->parse_if_block('user_detected',0);
979 if(my $group = getgrgid($gid))
981 $tpl->fillin('GROUP',encode_entities
($group));
982 $tpl->parse_if_block('group_detected',1);
986 $tpl->parse_if_block('group_detected',0);
991 $tpl->fillin('UMASK',sprintf('%04o',umask));
995 $tpl->parse_if_block('users',0);
998 my $output = header
(-type
=> 'text/html');
999 $output .= $tpl->get_template;
1004 # it's true, baby ;-)
patrick-canterino.de