/[docman]/docman.php
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /docman.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.58 - (show annotations)
Sat Jul 20 18:27:27 2002 UTC (16 years, 10 months ago) by dpavlin
Branch: MAIN
CVS Tags: HEAD
Changes since 1.57: +1 -1 lines
release 1.9

1 <?php
2
3 /* Copyright 1999 by John Martin d/b/a www.ANYPORTAL.com */
4 /* All Rights Reserved. */
5 /* */
6 /* This software is freeware and is not in the public domain. */
7 /* You are hereby granted the right to freely distribute this */
8 /* software as long as this copyright notice remains in place. */
9 /* */
10 /* Comments or suggestions? email: andmore@alief.com */
11 /* */
12 /* This is the PHP port: AnyPortal(php)-0.1 */
13 /* ======================================== */
14 /* */
15 /* PHP version 2000 by Stefan@Wiesendanger.org */
16 /* No Rights Reserved. What for, anyhow ? */
17 /* */
18 /* Date Remarks */
19 /* --------- ----------------------------------------------- */
20 /* 25 MAY 99 original ASP version */
21 /* 17 SEP 99 change upload from SA-FILEUP to aspSmartUpload */
22 /* 10 APR 00 simplified PHP3 version */
23 /* 18 APR 00 most of PHP3 port working. Slight modifications */
24 /* 22 APR 00 modified syntax highlighting, no absolute paths */
25 /* revealed, PHP builtin authentication, global */
26 /* style sheet as callback, use apache default */
27 /* icons as an alternative to the wingdings font. */
28 /* 25 APR 00 catch some exceptions (not foolproof yet) */
29 /* 26 APR 00 catch some more exceptions, implicit copy */
30 /* function by saving somewhere else in the detail */
31 /* view, MD5 hashed password. */
32 /* 27 APR 00 Fixed authentication bug */
33 /* 12 MAY 00 Fixed trouble with exec() with newer versions of */
34 /* PHP3. Fixed bug which would send you to a non- */
35 /* existent address after file modifications. */
36
37 /*
38
39 This project is now called Directory Manager.
40
41 For more info, please see web pages at
42 http://www.rot13.org/~dpavlin/docman.html
43
44 It's relased under GPL by
45 Dobrica Pavlinusic <dpavlin@rot13.org>
46
47
48 IMPORTANT INSTALLATION NOTE:
49 deny serving of .* (dot-something) files in web server!
50 Otherwise, uses can access your log files, users and/or
51 deleted files!
52
53 .htusers is in form:
54 login:Real Name:[md5(loginpassword)|auth_*]:email@host.dom
55
56
57 TODO:
58 mixed file/directory output (add type to each entry,
59 real support for links)
60 access controll
61
62 */
63
64 //////////////////////////////////////////////////////////////////
65
66 // TODO : Don't let the file be modified itself. Create a hash of
67 // it (kinda hard since it's self-referential ;-). Make better use
68 // of session management. Escapeshellcmd for all user input.
69
70 //////////////////////////////////////////////////////////////////
71
72 // GLOBAL PARAMETERS
73 // =================
74 // Make modifications here to suit docman to your needs
75
76 // error_reporting(4) ; // how verbose ?
77
78 // from where to include auth_*.php modules?
79 $gblIncDir = "/home/httpd/docman";
80
81 // do we want to force download? (default is 0 for backward
82 // compatibility, but it's defined as 1 in docman.conf for all
83 // future applications!
84 $gblForceDownload = 0;
85
86 // username/password should not be system
87 // usernames/passwords !!
88
89 $gblPw = "";
90
91 // date format
92 // $gblDateFmt="D, F d, Y";
93 $gblDateFmt="Y-m-d";
94
95 // time format
96 // $gblTimeFmt="g:i:sA";
97 $gblTimeFmt="H:i:s";
98
99 // Number of backup files to keep
100 $gblNumBackups=3;
101
102 // show red star if newer than ... days
103 $gblModDays=1;
104
105 // choose GifIcon below unless you have the M$
106 // WingDings font installed on your system
107
108 $gblIcon="GifIcon"; // MockIcon or GifIcon
109
110 // the directory below should be /icons/ or /icons/small/
111 // on Apache; a set of icons is included in the distribution
112
113 $gblIconLocation="/icons/";
114
115 // files you want to be able to edit in text mode
116 // and view with (primitive) syntax highlighting
117
118 $gblEditable = array( ".txt",".asa",".asp",".htm",".html",
119 ".cfm",".php3",".php",".phtml",
120 ".shtml",".css" ) ;
121
122 // files that will display as images on the detail page
123 // (useless if your browser doesn't support them)
124
125 $gblImages = array( ".jpg",".jpeg",".gif",".png",".ico",
126 ".bmp",".xbm") ;
127
128 // which files to hide (separated by ,)
129 $gblHide = "";
130
131 // Where are users? (by default in .htusers file)
132 $gblUsers = "htusers_file";
133
134 //////////////////////////////////////////////////////////////////
135
136 $gblVersion = "1.9";
137
138 function StartHTML($title,$text="") {
139
140 $title = "Document Manager " . $title ;
141 $host = $GLOBALS["HTTP_HOST"] ;
142 $self = $GLOBALS["PHP_SELF"] ;
143 ?>
144
145 <HTML>
146 <HEAD>
147 <TITLE><?= $host . " " . $title ?></TITLE>
148 <META NAME="description" CONTENT="Document Manager">
149 <META NAME="keywords" CONTENT="site manager, web site maintenance">
150 <META NAME="robots" CONTENT="noindex">
151 <META HTTP-EQUIV="expires" CONTENT="0">
152 <LINK REL="stylesheet" TYPE="text/css"
153 HREF="<?= $self ?>?STYLE=get">
154 </HEAD>
155 <BODY BGCOLOR="#FFFFFF">
156 <H3 ALIGN="RIGHT"><?= $host ?></H3>
157 <TABLE BORDER=0 WIDTH="100%"><TR>
158 <TD CLASS=INV><?= $title ?></TD></TR></TABLE>
159 <P><?= $text ?></P>
160
161 <?php
162 } // end function StartHTML
163
164 //////////////////////////////////////////////////////////////////
165
166 function EndHTML() {
167
168 global $gblDateFmt, $gblTimeFmt, $gblUserName, $PHP_SELF, $gblPw, $gblVersion;
169
170 ?>
171
172 <HR>
173 <P CLASS=FTR>
174 <B><?= date($gblDateFmt) ?> -
175 <?= date($gblTimeFmt) ?> -
176 <?= $gblUserName ?>
177 <?php
178 global $PHP_AUTH_USER,$PHP_AUTH_PW;
179 $url = $PHP_SELF."?relogin=";
180 if (isset($gblPw) && $gblPw != "") {
181 $url .= $gblPw;
182 } else {
183 $url .= md5($PHP_AUTH_USER.$PHP_AUTH_PW);
184 }
185 if (isset($PHP_AUTH_USER) && $PHP_AUTH_USER != "" && ($PHP_AUTH_PW == "" || !isset($PHP_AUTH_PW))) {
186 $url_title="login";
187 $url .= "&force_login=1";
188 } else {
189 $url_title="relogin";
190 }
191 ?>
192 <small> [<a href="<?= $url ?>"><?= $url_title ?></a>]</small>
193 </B>
194 <BR><small>
195 Document Manager <?= $gblVersion ?>, based on ANYPORTAL(php) Site Manager
196 <br>
197 &copy; 1999 by <A HREF="http://www.anyportal.com">ANYPORTAL</A>,
198 &copy; 2000 by <A HREF="http://da.nger.org">d@nger.org</A>,
199 &copy; 2000-2002 by <A HREF="http://www.rot13.org/~dpavlin/">DbP</A>
200 </small>
201 </P>
202 <BR>
203 <? //include(".debug.inc") ?>
204 <BR><BR></BODY></HTML>
205
206 <?php
207 } // end function EndHTML
208
209 //////////////////////////////////////////////////////////////////
210
211 function CSS() {
212 ?>
213
214 BODY,TD,P,H1,H2,H3 { font-family:Verdana,Helvetica,Arial,sans-serif; }
215 .BLK { color:black; }
216 .RED { color:red; }
217 .TOP { color:red; font-size:70%; } /* table headings */
218 .INV { color:white; background-color:navy;
219 font-weight:bold; font-size:120%; } /* title */
220 .FTR { } /* footer */
221 .LST { background-color:#E0E0E0; } /* table cells */
222 .BAR { background-color:#E0E0E0; } /* action bar */
223 PRE { color:blue; font-family:Lucida Console,Courier New,
224 Courier,sans-serif; } /* source code */
225 EM { color:green; font-style:normal; } /* line numbers */
226 .REM { color:silver; }
227 .XML { color:navy; background-color:yellow; }
228 .MCK { color:red; font-family:WingDings; } /* Mock Icons */
229 A:HOVER { color:red; }
230
231 <?php
232 } // end function CSS
233
234 //////////////////////////////////////////////////////////////////
235
236 function DetailPage($fsRoot,$relDir,$fn) {
237
238 global $gblEditable, $gblImages, $webRoot ;
239 $self = $GLOBALS["PHP_SELF"] ;
240
241 $relPath = $relDir . "/" . $fn ;
242 $fsPath = $fsRoot . $relPath ;
243 $fsDir = $fsRoot . $relDir ;
244
245 $exists = file_exists($fsPath) ;
246 $ext = strtolower(strrchr($relPath,".")) ;
247 $editable = ( $ext=="" || strstr(join(" ",$gblEditable),$ext)) ;
248 $writable = is_writeable($fsPath) ;
249 $file_lock = CheckLock($fsPath);
250
251 if (!$editable && !$exists)
252 Error("Creation unsupported for type",$relPath) ;
253 if (!exists && !is_writeable($fsDir) )
254 Error("Creation denied",$relDir) ;
255
256 $text = "Use this page to view, modify or " ;
257 if (is_dir($fsPath)) {
258 $text .="delete a directory on this " ;
259 } else {
260 $text .= "delete a single document on this " ;
261 };
262 $text .= "web site." ;
263 $title = "(Detail Page)" ;
264 StartHTML($title, $text) ;
265
266 echo "<H3>" . $relDir . "/" . $fn . "</H3>" ;
267 if ($exists) { // get file info
268 $fsize = filesize($fsPath) ;
269 $fmodified = date("$GLOBALS[gblDateFmt] $GLOBALS[gblTimeFmt]", filemtime($fsPath)) ;
270 $faccessed = date("$GLOBALS[gblDateFmt] $GLOBALS[gblTimeFmt]", fileatime($fsPath)) ;
271 $fuid=fileowner($fsPath);
272 $fgid=filegroup($fsPath);
273 $userinfo = posix_getpwuid($fuid);
274 $grpinfo = posix_getgrgid($fgid);
275 echo "<PRE>";
276 if (!is_dir($fsPath)) echo " file size: " . $fsize . " Bytes<BR>" ;
277 echo "last modified: <B>" . $fmodified . "</B><BR>" ;
278 echo "last accessed: <B>" . $faccessed . "</B><BR>" ;
279 echo " owner: <B>" . $userinfo["name"] . " [$fuid]</B><BR>" ;
280 echo " group: <B>" . $grpinfo["name"] . " [$fgid]</B><BR>" ;
281 echo " permissions: <B>" ;
282 echo printf( "%o", fileperms($fsPath) ) . "</B>" ;
283 echo "</PRE>" ;
284
285 }
286
287 if ( !is_dir($fsPath) && $editable && ($writable || !$exists) && !$file_lock ) {
288 $fh = fopen($fsPath,"a+") ;
289 rewind($fh) ;
290 $fstr = fread($fh,filesize($fsPath)) ;
291 fclose($fh) ;
292 $fstr = htmlentities( $fstr ) ;
293 ?>
294
295 <FORM ACTION="<?= $self ; ?>" METHOD="POST">
296 <SPAN TITLE="Click [SAVE] to store updated contents.">
297 <B>DOCUMENT CONTENTS</B>
298 </SPAN><BR>
299 <TEXTAREA NAME="FILEDATA" ROWS=18 COLS=70 WRAP="OFF"><?php
300 echo($fstr) ; ?></TEXTAREA>
301 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ; ?>">
302 <INPUT TYPE="HIDDEN" NAME="FN" VALUE="<?= $fn ; ?>">
303 <INPUT TYPE="HIDDEN" NAME="POSTACTION" VALUE="SAVE">
304 <INPUT TYPE="HIDDEN" SIZE=48 MAXLENGTH=255 NAME="RELPATH"
305 VALUE="<?= $relPath ; ?>">
306 <br>
307 <INPUT TYPE="RESET" VALUE="UNDO ALL CHANGES">
308 <INPUT TYPE="SUBMIT" VALUE="SAVE">
309 </FORM>
310
311 <?php
312 }
313 if ( !$file_lock && $ext!="" && strstr(join(' ',$gblImages),$ext) ) {
314 $info = getimagesize($fsPath) ;
315 $tstr = "<IMG SRC=\"$webRoot".urlpath($relPath)."\" BORDER=0 " ;
316 $tstr .= $info[3] . " ALT=\"" . $fn . " - " ;
317 $tstr .= (int)(($fsize+1023)/1024) . "Kb\">" ;
318 // echo htmlentities($tstr) . "<BR><BR>" . $tstr ;
319 echo $tstr ;
320 }
321
322 ?>
323
324 <FORM ACTION="<?= $self ; ?>" METHOD="POST">
325 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ; ?>">
326 <INPUT TYPE="HIDDEN" NAME="FN" VALUE="<?= $fn ; ?>">
327 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="CANCEL"><BR>
328
329 <?php
330
331 if ($file_lock) {
332 ?>
333 <hr>
334 <SPAN TITLE="Check OK and click UNLOCK to remove lock on file.">
335 <B>OK TO FORCE LOCK REMOVAL ON "<?= $fn ; ?>" HELD BY <?= $file_lock ?>? </B></SPAN>
336 <INPUT TYPE="CHECKBOX" NAME="CONFIRM">
337 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="UNLOCK">
338 <?
339 } // file_lock
340
341 if (substr($fn,0,4) == ".del") {
342 $action="UNDELETE";
343 $desc="undelete previously deleted file";
344 } else {
345 $action="DELETE";
346 $desc="delete";
347 }
348
349 if ($exists && $writable) {
350 ?>
351
352 <HR>
353 <a name="undelete">
354 <SPAN TITLE="Check OK and click [<?= $action ?>] to <?= $desc ?>.">
355 <B>OK TO <?= $action ?> "<?= $fn ; ?>"? </B></SPAN>
356 <INPUT TYPE="CHECKBOX" NAME="CONFIRM">
357 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="<?= $action ?>">
358
359 <HR>
360 <a name="rename">
361 <SPAN TITLE="Check OK and click [RENAME] to rename.">
362 <B>OK TO RENAME "<?= $fn ; ?>" TO
363 <INPUT TYPE="TEXT" SIZE=24 MAXLENGTH=255 NAME="NEWNAME" VALUE="<?= $fn ?>">
364 ? </B></SPAN>
365 <INPUT TYPE="CHECKBOX" NAME="CONFIRM">
366 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="RENAME">
367
368 <?php
369 } // exists && writable
370 ?>
371 <HR>
372 <a name="note">
373 <B>NOTE FOR "<?= $fn ; ?>":
374 <INPUT TYPE="TEXT" SIZE=50 MAXLENGTH=255 NAME="NOTE" VALUE="<?= ReadNote($fsPath) ?>">
375 </B></SPAN>
376 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="NOTE">
377
378 </FORM>
379
380 <?php
381
382 $name=basename("$fsDir/$fn");
383 $logname=dirname("$fsDir/$fn")."/.log/$name";
384 $bakdir=dirname("$fsDir/$fn")."/.bak";
385 if (file_exists($logname)) {
386 $log=fopen($logname,"r");
387 $cl1=" class=LST"; $cl2="";
388 $logarr = array();
389 while($line = fgetcsv($log,512,"\t")) {
390 $cl=$cl1; $cl1=$cl2; $cl2=$cl;
391 array_unshift($logarr,array($cl,$line[0],$line[1],$line[2],$line[3]));
392 }
393 fclose($log);
394 if (is_dir("$fsDir/$fn")) {
395 $whatis="DIRECTORY";
396 } else {
397 $whatis="FILE";
398 }
399 print "<hr><br><b>CHANGES TO THIS $whatis</b><br><table border=0 width=100%>\n";
400 $bakcount = 0; // start from 0, skip fist backup (it's current)
401 while ($e = array_shift($logarr)) {
402 if (strstr($e[4],"upload")) {
403 if (file_exists("$bakdir/$bakcount/$name")) {
404 $e[4]="<a href=\"$webRoot".urlpath(dirname($relPath)."/.bak/$bakcount/$name")."\">$e[4]</a>";
405 }
406 $bakcount++;
407 }
408 print "<tr><td$e[0]>$e[1]</td><td$e[0]>$e[2]</td><td$e[0]>$e[3]</td><td$e[0]>$e[4]</td></tr>\n";
409 }
410 print "</table>";
411 }
412
413 EndHTML() ;
414
415 } // end function DetailPage
416
417 //////////////////////////////////////////////////////////////////
418
419 function DisplayCode($fsRoot,$relDir,$fn) {
420
421 $path = $fsRoot . $relDir . "/" . $fn ;
422
423 if (!file_exists($path)) Error("File not found",$path) ;
424
425 StartHTML("(".$relDir."/".$fn.")","");
426
427 $tstr = join("",file($path)) ;
428 $tstr = htmlentities($tstr) ;
429
430 // Tabs
431 $tstr = str_replace(chr(9)," ",$tstr) ;
432
433 // ASP tags & XML/PHP tags
434 $aspbeg = "<SPAN CLASS=XML>&lt;%</SPAN><SPAN CLASS=BLK>" ;
435 $aspend = "</SPAN><SPAN CLASS=XML>%&gt;</SPAN>" ;
436 $tstr = str_replace("&lt;%",$aspbeg,$tstr) ;
437 $tstr = str_replace("%&gt;",$aspend,$tstr) ;
438
439 $xmlbeg = "<SPAN CLASS=XML>&lt;?</SPAN><SPAN CLASS=BLK>" ;
440 $xmlend = "</SPAN><SPAN CLASS=XML>?&gt;</SPAN>" ;
441 $tstr = str_replace("&lt;?",$xmlbeg,$tstr) ;
442 $tstr = str_replace("?&gt;",$xmlend,$tstr) ;
443
444 // C style comment
445 $tstr = str_replace("/*","<SPAN CLASS=REM>/*",$tstr) ;
446 $tstr = str_replace("*/","*/</SPAN>",$tstr) ;
447
448 // HTML comments
449 $tstr = str_replace("&lt;!--","<I CLASS=RED>&lt;!--",$tstr) ;
450 $tstr = str_replace("--&gt;","--&gt;</I>",$tstr) ;
451
452 echo "<PRE>" ;
453
454 $tstr = split("\n",$tstr) ;
455 for ($i = 0 ; $i < sizeof($tstr) ; ++$i) {
456 // add line numbers
457 echo "<BR><EM>" ;
458 echo substr(("000" . ($i+1)), -4) . ":</EM> " ;
459 $line = $tstr[$i] ;
460 // C++ style comments
461 $pos = strpos($line,"//") ;
462 // exceptions: two slashes aren't a script comment
463 if (strstr($line,"//") &&
464 ! ($pos>0 && substr($line,$pos-1,1)==":") &&
465 ! (substr($line,$pos,8) == "//--&gt;") &&
466 ! (substr($line,$pos,9) == "// --&gt;")) {
467 $beg = substr($line,0,strpos($line,"//")) ;
468 $end = strstr($line,"//") ;
469 $line = $beg."<SPAN CLASS=REM>".$end."</SPAN>";
470 }
471 // shell & asp style comments
472 $first = substr(ltrim($line),0,1) ;
473 if ($first == "#" || $first == "'") {
474 $line = "<SPAN CLASS=REM>".$line."</SPAN>";
475 }
476 print($line) ;
477 } // next i
478
479 echo "</PRE>" ;
480
481 EndHTML() ;
482
483 } // end function DisplayCode
484
485 //////////////////////////////////////////////////////////////////
486
487 function MockIcon($txt) {
488 $tstr = "<SPAN CLASS=MCK>" ;
489
490 switch (strtolower($txt)) {
491 case ".bmp" :
492 case ".gif" :
493 case ".jpg" :
494 case ".jpeg":
495 case ".tif" :
496 case ".tiff":
497 $d = 176 ;
498 break ;
499 case ".doc" :
500 $d = 50 ;
501 break ;
502 case ".exe" :
503 case ".bat" :
504 $d = 255 ;
505 break ;
506 case ".bas" :
507 case ".c" :
508 case ".cc" :
509 case ".src" :
510 $d = 255 ;
511 break ;
512 case "file" :
513 $d = 51 ;
514 break ;
515 case "fldr" :
516 $d = 48 ;
517 break ;
518 case ".htm" :
519 case ".html":
520 case ".asa" :
521 case ".asp" :
522 case ".cfm" :
523 case ".php3":
524 case ".php" :
525 case ".phtml" :
526 case ".shtml" :
527 $d = 182 ;
528 break ;
529 case ".pdf" :
530 $d = 38 ;
531 break;
532 case ".txt" :
533 case ".ini" :
534 $d = 52 ;
535 break ;
536 case ".xls" :
537 $d = 252 ;
538 break ;
539 case ".zip" :
540 case ".arc" :
541 case ".sit" :
542 case ".tar" :
543 case ".gz" :
544 case ".tgz" :
545 case ".Z" :
546 $d = 59 ;
547 break ;
548 case "view" :
549 $d = 52 ;
550 break ;
551 case "up" :
552 $d = 199 ;
553 break ;
554 case "blank" :
555 return "&nbsp;&nbsp;</SPAN>" ;
556 break ;
557 default :
558 $d = 51 ;
559 }
560
561 return $tstr . chr($d) . "</SPAN>" ;
562 } // end function MockIcon
563
564 //////////////////////////////////////////////////////////////////
565
566 function GifIcon($txt) {
567 global $gblIconLocation ;
568
569 switch (strtolower($txt)) {
570 case ".bmp" :
571 case ".gif" :
572 case ".jpg" :
573 case ".jpeg":
574 case ".tif" :
575 case ".tiff":
576 $d = "image2.gif" ;
577 break ;
578 case ".doc" :
579 $d = "layout.gif" ;
580 break ;
581 case ".exe" :
582 case ".bat" :
583 $d = "screw2.gif" ;
584 break ;
585 case ".bas" :
586 case ".c" :
587 case ".cc" :
588 case ".src" :
589 $d = "c.gif" ;
590 break ;
591 case "file" :
592 $d = "generic.gif" ;
593 break ;
594 case "fldr" :
595 $d = "dir.gif" ;
596 break ;
597 case ".phps" :
598 $d = "phps.gif" ;
599 break ;
600 case ".php3" :
601 $d = "php3.gif" ;
602 break ;
603 case ".htm" :
604 case ".html":
605 case ".asa" :
606 case ".asp" :
607 case ".cfm" :
608 case ".php3":
609 case ".php" :
610 case ".phtml" :
611 case ".shtml" :
612 $d = "world1.gif" ;
613 break ;
614 case ".pdf" :
615 $d = "pdf.gif" ;
616 break;
617 case ".txt" :
618 case ".ini" :
619 $d = "text.gif" ;
620 break ;
621 case ".xls" :
622 $d = "box2.gif" ;
623 break ;
624 case ".zip" :
625 case ".arc" :
626 case ".sit" :
627 case ".tar" :
628 case ".gz" :
629 case ".tgz" :
630 case ".Z" :
631 $d = "compressed.gif" ;
632 break ;
633 case "view" :
634 $d = "index.gif" ;
635 break ;
636 case "up" :
637 $d = "back.gif" ;
638 break ;
639 case "blank" :
640 $d = "blank.gif" ;
641 break ;
642 case "checkout":
643 $d = "box2.gif";
644 break;
645 case "checkin":
646 $d = "hand.up.gif";
647 break;
648 case "locked":
649 $d = "screw2.gif";
650 break;
651 case "note":
652 $d = "quill.gif";
653 break;
654 default :
655 $d = "generic.gif" ;
656 }
657
658 return "<IMG SRC=\"$gblIconLocation" . $d . "\" BORDER=0>" ;
659 } // end function GifIcon
660
661 //////////////////////////////////////////////////////////////////
662
663 function Navigate($fsRoot,$relDir) {
664
665 global $gblEditable, $gblIcon, $gblModDays, $webRoot, $gblHide ;
666
667 $self = $GLOBALS["PHP_SELF"] ;
668
669 $fsDir = $fsRoot . $relDir . "/" ; // current directory
670
671 if (!is_dir($fsDir)) Error("Dir not found",$relDir) ;
672
673 $hide_items=",$gblHide,";
674
675 // read directory contents
676 if ( !($dir = @opendir($fsDir)) )
677 Error("Read Access denied",$relDir) ;
678 while ($item = readdir($dir)) {
679 if ( substr($item,0,1) == "." || strstr($hide_items,",$item,") ) continue ;
680 if ( is_dir($fsDir . $item) ) {
681 $dirList[] = $item ;
682 } else if ( is_file($fsDir . $item) ) {
683 $fileList[] = $item ;
684 } else if ( is_link($fsDir . $item) ) {
685 $dirList[] = $item ;
686 } else {
687 // unknown file type
688 // $text = "Could not determine file type of " ;
689 // Error("File Error", $text.$relDir."/".$item) ;
690 // exit ;
691 }
692 }
693 closedir($dir) ;
694
695 // scan deleted files
696 if ( $GLOBALS[show_deleted] == 1 && ($dir = @opendir("$fsDir/.del")) ) {
697 while ($item = readdir($dir)) {
698 if ( substr($item,0,1) == "." || strstr($hide_items,",$item,") ) continue ;
699 $fileList[] = ".del/$item" ;
700 }
701 closedir($dir) ;
702 }
703
704 $emptyDir = ! (sizeof($dirList) || sizeof($fileList)) ;
705
706 // start navigation page
707 $text = "Use this page to add, delete";
708 if (! isset($show_deleted)) {
709 $text .= ", <a href=$self?D=".urlencode($relDir)."&show_deleted=1>undelete</a>";
710 }
711 $text .= " or revise files on this web site." ;
712 $text .= "<br>Examine list of files <a href=\"$self?A=Ch1\">changed in last day</a> or <a href=\"$self?A=Ch\">all changes</a>.";
713 StartHTML("(Navigate)",$text) ;
714
715 echo "<TABLE BORDER=0 CELLPADDING=2
716 CELLSPACING=3 WIDTH=\"100%\">" ;
717
718 // updir bar
719 if (chopsl($fsDir) != chopsl($fsRoot)) {
720 $parent = dirname($relDir) ;
721 if ($parent == "") $parent = "/" ;
722 ?>
723
724 <TR><TD><?= $gblIcon("up") ?></TD><TD COLSPAN=5 CLASS=LST>
725 <A HREF="<?= $self ?>?D=<?= urlencode($parent) ?>">
726 <B><?= $parent ?></B></A></TD></TR>
727
728 <?php
729 }
730
731 function plural($name,$count) {
732 $out="$count $name";
733 if ($count > 1) {
734 $out.="s";
735 }
736 return $out;
737 }
738
739 // output subdirs
740 if (sizeof($dirList) > 0) {
741 sort($dirList) ;
742 ?>
743
744 <TR><TD></TD><TD COLSPAN=2 CLASS=TOP>DIRECTORY NAME (<?= plural("dir",sizeof($dirList)) ?>)</TD><TD COLSPAN=3 CLASS=TOP>DIRECTORY NOTE</TR>
745
746 <?php
747 while (list($key,$dir) = each($dirList)) {
748
749 $info_url=$self."?A=E&F=".urlencode($dir)."&D=".urlencode($relDir);
750 $tstr = "<A HREF=\"" . $self . "?D=" ;
751 $tstr .= urlencode($relDir."/".$dir) ;
752 $tstr .= "\">" . $dir . "/</A>" ;
753 $note_html="<a href=\"$info_url#note\">".$gblIcon("note")."</a>".ReadNote($fsDir.$dir);
754 ?>
755
756 <TR><TD>
757 <A HREF="<?= $info_url ?>" TITLE="View/Edit">
758 <?= $gblIcon("fldr") ?></A></TD>
759 <TD COLSPAN=2 CLASS=LST><?= $tstr ?></TD>
760 <TD COLSPAN=3 CLASS=LST><?= $note_html ?></TD></TR>
761
762 <?php
763 } // iterate over dirs
764 } // end if no dirs
765 ?>
766
767 <TR><TD></TD><TD COLSPAN=5><HR><B><?= $webRoot . $relDir ?>
768 </B></TD></TR>
769 <TR><TD></TD><TD CLASS=TOP>DOCUMENT NAME (<?= plural("file",sizeof($fileList)) ?>)</TD>
770 <TD><?= $gblIcon("blank").$gblIcon("blank") ?></TD>
771 <TD CLASS=TOP>NOTE</TD>
772 <TD CLASS=TOP>LAST UPDATE</TD><TD CLASS=TOP>FILE SIZE</TD></TR>
773
774 <?php
775 if (sizeof($fileList) > 0) {
776 sort($fileList) ;
777 while (list($key,$file) = each($fileList)) {
778 $path = $fsDir."/".$file ;
779 $mod = filemtime($path) ;
780 $sz = filesize($path) ;
781
782 if ($sz >= 10240) {
783 $sz = (int)(($sz+1023)/1024) . " k" ;
784 } else {
785 $sz .= " " ;
786 } // end size
787
788 $a = $b = "" ;
789
790 $info_url=$self."?A=E&F=".urlencode($file)."&D=".urlencode($relDir);
791
792 if ( ($mod + $gblModDays*86400) > time() ) {
793 $a = "<SPAN CLASS=RED TITLE=\"Newer" ;
794 $a .= " than $gblModDays days\"> * </SPAN>" ;
795 }
796
797 $file_lock=CheckLock($path);
798
799 $file_url_html="<A HREF=\"$self?A=V&F=".urlencode($file);
800 $file_url_html.="&D=".urlencode($relDir);
801 $file_url_html.="\" TITLE=\"View file\">" ;
802
803 if (substr($file,0,5) != ".del/") {
804 $file_url_html .= $file . "</A>" . $a ;
805 } else {
806 $file_url_html .= substr($file,5,strlen($file)-5) . "</a> <SPAN CLASS=RED TITLE=\"deleted\"> <a href=\"$info_url#undelete\">deleted</a> </span>";
807 }
808
809 $note_html="<a href=\"$info_url#note\">".$gblIcon("note")."</a>".ReadNote($path);
810
811 $ext = strtolower(strrchr($file,".")) ;
812
813 if ($file_lock) {
814 if ($file_lock == $GLOBALS[gblUserName]) {
815 $b.="<A HREF=\"$self?A=Ci&F=".urlencode($file);
816 $b.="&D=".urlencode($relDir);
817 $b.="\" TITLE=\"Checkin (update) file on server\">" ;
818 $file_url_html=$b;
819 $b.=$gblIcon("checkin")."</A>" ;
820 $b.= $gblIcon("blank");
821 $file_url_html.="$file</a> $a";
822 $note_html = $gblIcon("blank")."<b>Please check-in (update) this file</b>";
823 } else {
824 $b = $gblIcon("locked");
825 $b.= $gblIcon("blank");
826 $note_html = $gblIcon("blank")."<b>File locked by $file_lock</b>";
827 $file_url_html = "$file $a";
828 }
829 } else {
830 $b.="<A HREF=\"$self?A=Co&F=".urlencode($file);
831 $b.="&D=".urlencode($relDir);
832 $b.="\" TITLE=\"Checkout file for edit\">" ;
833 $b.=$gblIcon("checkout")."</A>" ;
834
835 if ( $ext=="" || strstr(join(" ",$gblEditable),$ext) ) {
836 $b.="<A HREF=\"$self?A=C&F=".urlencode($file);
837 $b.="&D=".urlencode($relDir);
838 $b.="\" TITLE=\"List contents\">" ;
839 $b.=$gblIcon("view")."</A>" ;
840 } else {
841 $b.= $gblIcon("blank");
842 }
843 }
844
845
846 ?>
847
848 <TR><TD>
849 <A HREF="<?= $info_url ?>" TITLE="View/Edit">
850 <?= $gblIcon($ext) ?></A></TD>
851 <TD CLASS=LST><?= $file_url_html ?></TD>
852 <TD CLASS=LST ALIGN=center><?= $b ?></TD>
853 <TD CLASS=LST ALIGN=left><?= $note_html ?></TD>
854 <TD CLASS=LST><?= date("$GLOBALS[gblDateFmt] $GLOBALS[gblTimeFmt]",$mod) ?></TD>
855 <TD CLASS=LST><?= $sz ?>Bytes</TD></TR>
856
857 <?php
858 } // iterate over files
859 } else { // end if no files
860 ?>
861 <TR><TD></TD><TD COLSPAN=5 CLASS=LST>
862 No files in this directory
863 </TD></TR>
864 <?
865 }
866
867 if ($emptyDir && $relDir != "") {
868 ?>
869
870 <FORM METHOD="POST" ACTION="<?= $self ?>">
871 <TR><TD></TD><TD COLSPAN=5 CLASS=BAR>
872 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ?>">
873 OK TO DELETE THIS EMPTY FOLDER?
874 <INPUT TYPE="CHECKBOX" NAME="CONFIRM">
875 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="DELETE">
876 </TD></TR>
877 </FORM>
878
879 <?php
880 } // end if emptyDir
881 ?>
882
883 <TR><TD></TD><TD COLSPAN=5><HR></TD></TR>
884
885 <?
886 if (file_exists(".info.inc")) {
887 print "<TR><TD></TD><TD COLSPAN=5>";
888 include(".info.inc");
889 print "</TD></TR>
890 <TR><TD></TD><TD COLSPAN=5><HR></TD></TR>";
891 }
892 ?>
893
894 <FORM METHOD="POST" ACTION="<?= $self ?>">
895 <TR><TD></TD><TD COLSPAN=5 CLASS=BAR>CREATE NEW
896 <INPUT TYPE="RADIO" NAME="T" VALUE="D" CHECKED>DIRECTORY -OR-
897 <INPUT TYPE="RADIO" NAME="T" VALUE="F">FILE : &nbsp;&nbsp;
898 <NOBR>NAME <INPUT TYPE="TEXT" NAME="FN" SIZE=14>
899 <INPUT TYPE="HIDDEN" NAME="POSTACTION" VALUE="CREATE">
900 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ?>">
901 <INPUT TYPE="SUBMIT" VALUE="CREATE" NAME="CREATE">
902 </NOBR>
903 <NOBR>OR <A HREF="<?= $self ?>?A=U&D=<?= urlencode($relDir) ?>">UPLOAD</A> A FILE</NOBR>
904 </TD></TR>
905 </FORM>
906 </TABLE>
907
908 <?php
909 EndHTML() ;
910 } // end function Navigate
911
912 //////////////////////////////////////////////////////////////////
913
914 function UploadPage($fsRoot, $relDir, $filename="") {
915
916 $self = $GLOBALS["PHP_SELF"] ;
917 if ($relDir == "") $relDir = "/" ;
918 ?>
919
920 <P><TABLE BORDER=0 CELLPADDING=5><TR><TD WIDTH=5></TD><TD CLASS=BAR>
921 <FORM ENCTYPE="multipart/form-data" METHOD="POST"
922 ACTION="<?= $self ?>">
923 DESTINATION DIRECTORY:<B><?= " " . $relDir ?></B>
924 <? if (isset($filename) && $filename!="") { ?>
925 <br>DESTINATION FILE:<B><?= " " . $filename ?></B>
926 <INPUT TYPE="HIDDEN" NAME="FILENAME" VALUE="<?= $filename ?>">
927 <? } ?>
928 <P>PATHNAME OF LOCAL FILE<BR>
929 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ?>">
930 <INPUT TYPE="HIDDEN" NAME="POSTACTION" VALUE="UPLOAD">
931 <INPUT SIZE=30 TYPE="FILE" NAME="FN"></P>
932 <P><INPUT TYPE="SUBMIT" VALUE="UPLOAD"></P>
933 <P>If the <B>[BROWSE...]</B> button is not displayed,<BR>
934 you must upgrade to an RFC1867-compliant browser.</P>
935 <P>Your browser:<BR><?= $GLOBALS["HTTP_USER_AGENT"] ?></P>
936 </FORM>
937 </TD></TR>
938 <TR><TD></TD><TD>
939 <FORM METHOD="POST" ACTION="<?= $self ?>">
940 <INPUT TYPE="HIDDEN" NAME="DIR" VALUE="<?= $relDir ?>"><BR>
941 <INPUT TYPE="SUBMIT" NAME="POSTACTION" VALUE="CANCEL">
942 </FORM>
943 </TD></TR></TABLE></P>
944
945 <?php
946 } // end function UploadPage
947
948 //////////////////////////////////////////////////////////////////
949
950 function Error($title,$text="") {
951 StartHTML("(".$title.")",$text) ;
952 echo "<P ALIGN=center>Hit your Browser's Back Button.</P>" ;
953 EndHTML() ;
954 exit ;
955 } // end function Error
956
957 //////////////////////////////////////////////////////////////////
958
959 function NoEntry() {
960
961 $user = $GLOBALS["PHP_AUTH_USER"] ;
962 $pw = $GLOBALS["PHP_AUTH_PW"] ;
963 $self = $GLOBALS["PHP_SELF"] ;
964
965 $title = "(401 Unauthorized)" ;
966 $text = "No trespassing !" ;
967
968 global $PHP_AUTH_USER,$PHP_AUTH_PW,$gblPw,$relogin;
969 StartHTML($title,$text) ;
970
971 EndHTML() ;
972 exit ;
973 }
974
975 //////////////////////////////////////////////////////////////////
976
977 function LogIt($target,$msg) {
978
979 $dir=dirname($target);
980 if (! file_exists($dir."/.log")) {
981 mkdir($dir."/.log",0700);
982 }
983 $file=basename($target);
984
985 $log=fopen("$dir/.log/$file","a+");
986 fputs($log,date("$GLOBALS[gblDateFmt]\t$GLOBALS[gblTimeFmt]").
987 "\t$GLOBALS[gblUserName]\t$msg\n");
988 fclose($log);
989
990 }
991
992
993 //////////////////////////////////////////////////////////////////
994
995 function WriteNote($target,$msg) {
996
997 $target=stripSlashes($target);
998 $dir=dirname($target);
999 if (! file_exists($dir."/.note")) {
1000 mkdir($dir."/.note",0700);
1001 }
1002 $file=basename($target);
1003
1004 $note=fopen("$dir/.note/$file","w");
1005 fputs($note,"$msg\n");
1006 fclose($note);
1007
1008 Logit($target,"added note $msg");
1009
1010 }
1011
1012 function ReadNote($target) {
1013
1014 $target=stripSlashes($target);
1015 $dir=dirname($target);
1016 $file=basename($target);
1017 $msg="";
1018 if (file_exists($dir."/.note/$file")) {
1019 $note=fopen("$dir/.note/$file","r");
1020 $msg=fgets($note,4096);
1021 fclose($note);
1022 }
1023 return HtmlSpecialChars(StripSlashes($msg));
1024
1025 }
1026
1027 //////////////////////////////////////////////////////////////////
1028
1029 function MoveTo($source,$folder) {
1030
1031 $source=stripSlashes($source);
1032 $file=basename($source);
1033 if (! file_exists($folder)) {
1034 mkdir($folder,0700);
1035 }
1036 if (file_exists($source)) {
1037 rename($source,"$folder/$file");
1038 }
1039 }
1040
1041 //////////////////////////////////////////////////////////////////
1042
1043 function Lock($target) {
1044
1045 $target=stripSlashes($target);
1046 $dir=dirname($target);
1047 if (! file_exists($dir."/.lock")) {
1048 mkdir($dir."/.lock",0700);
1049 }
1050 $file=basename($target);
1051
1052 if (file_exists("$dir/.lock/$file")) {
1053 Logit($target,"attempt to locked allready locked file!");
1054 } else {
1055 $lock=fopen("$dir/.lock/$file","w");
1056 fputs($lock,"$GLOBALS[gblUserName]\n");
1057 fclose($lock);
1058
1059 Logit($target,"file locked");
1060 }
1061
1062 }
1063
1064 function CheckLock($target) {
1065
1066 $target=stripSlashes($target);
1067 $dir=dirname($target);
1068 $file=basename($target);
1069 $msg=0;
1070 if (file_exists($dir."/.lock/$file")) {
1071 $lock=fopen("$dir/.lock/$file","r");
1072 $msg=fgets($lock,4096);
1073 fclose($lock);
1074 }
1075 return chop($msg);
1076
1077 }
1078
1079 function Unlock($target) {
1080
1081 $target=stripSlashes($target);
1082 $dir=dirname($target);
1083 $file=basename($target);
1084 if (file_exists($dir."/.lock/$file")) {
1085 unlink("$dir/.lock/$file");
1086 Logit($target,"file unlocked");
1087 } else {
1088 Logit($target,"attempt to unlocked non-locked file!");
1089 }
1090
1091 }
1092
1093 //////////////////////////////////////////////////////////////////
1094
1095 function urlpath($url) {
1096 $url=urlencode(StripSlashes("$url"));
1097 $url=str_replace("%2F","/",$url);
1098 $url=str_replace("+","%20",$url);
1099 return($url);
1100 }
1101
1102 //////////////////////////////////////////////////////////////////
1103
1104 function safe_rename($fromdir,$fromfile,$tofile) {
1105 function try_rename($from,$to) {
1106 # print "$from -> $to\n";
1107 if (file_exists($from) && is_writeable(dirname($to))) {
1108 rename($from,$to);
1109 }
1110 }
1111
1112 function try_dir($todir) {
1113 if (! file_exists($todir)) {
1114 mkdir($todir,0700);
1115 }
1116 }
1117
1118 $to="$fromdir/$tofile";
1119 $todir=dirname($to);
1120 $tofile=basename($to);
1121
1122 # print "<pre>$fromdir / $fromfile -> $todir / $tofile\n\n";
1123
1124 try_rename("$fromdir/$fromfile","$todir/$tofile");
1125 try_dir("$todir/.log");
1126 try_rename("$fromdir/.log/$fromfile","$todir/.log/$tofile");
1127 try_dir("$todir/.note");
1128 try_rename("$fromdir/.note/$fromfile","$todir/.note/$tofile");
1129 try_dir("$todir/.lock");
1130 try_rename("$fromdir/.lock/$fromfile","$todir/.lock/$tofile");
1131 try_dir("$todir/.bak");
1132 for($i=0;$i<=$GLOBALS[gblNumBackups];$i++) {
1133 try_rename("$fromdir/.bak/$i/$fromfile","$todir/.bak/$i/$tofile");
1134 }
1135 }
1136
1137
1138 //////////////////////////////////////////////////////////////////
1139
1140 // recursivly delete directory
1141
1142 function rrmdir($dir) {
1143 $handle=opendir($dir);
1144 while ($file = readdir($handle)) {
1145 if ($file != "." && $file != "..") {
1146 if (is_dir("$dir/$file"))
1147 rrmdir("$dir/$file");
1148 else
1149 if (! @unlink("$dir/$file")) return(0);
1150 }
1151 }
1152 closedir($handle);
1153 return @rmdir($dir);
1154 }
1155
1156 //////////////////////////////////////////////////////////////////
1157
1158 function ChangeLog($target,$msg) {
1159
1160 global $gblFsRoot;
1161 $log=fopen("$gblFsRoot/.changelog","a+");
1162 if (substr($target,0,strlen($gblFsRoot)) == $gblFsRoot)
1163 $target=substr($target,strlen($gblFsRoot),strlen($target)-strlen($gblFsRoot));
1164 $msg=str_replace("\t"," ",$msg);
1165 fputs($log,time()."\t$target\t$GLOBALS[gblUserName]\t$msg\n");
1166 fclose($log);
1167
1168 }
1169
1170 function DisplayChangeLog($day) {
1171
1172 global $gblFsRoot;
1173 if (!file_exists("$gblFsRoot/.changelog")) return;
1174 $log=fopen("$gblFsRoot/.changelog","r");
1175 $logarr = array();
1176 while($line = fgetcsv($log,512,"\t")) {
1177 while (sizeof($line) > 4) {
1178 $tmp = array_pop($line);
1179 $line.=" $tmp";
1180 }
1181 if ($day!=1 || ($day==1 && (time()-$line[0] < 24*60*60))) {
1182 array_unshift($logarr,array($line[0],$line[1],$line[2],$line[3]));
1183 }
1184 }
1185 fclose($log);
1186 $cl1=" class=LST"; $cl2="";
1187 print "<table border=0 width=100%>\n";
1188 while ($e = array_shift($logarr)) {
1189 $cl=$cl1; $cl1=$cl2; $cl2=$cl;
1190 $date = date("$GLOBALS[gblDateFmt]", $e[0]);
1191 $time = date("$GLOBALS[gblTimeFmt]", $e[0]);
1192 $dir = dirname($e[1]);
1193 $file = basename($e[1]);
1194 print "<tr><td$cl>$date</td><td$cl>$time</td><td$cl><a href=\"$GLOBALS[PHP_SELF]?D=".urlencode($dir)."\">$dir</a>/$file</td><td$cl>$e[2]</td><td$cl>$e[3]</td></tr>\n";
1195 }
1196 print "</table>";
1197 print "<p>".GifIcon(up)." Back to <a href=$GLOBALS[PHP_SELF]>front page</a>.</p>";
1198 }
1199
1200 //////////////////////////////////////////////////////////////////
1201
1202 function Download($path) {
1203 global $HTTP_USER_AGENT;
1204 $file=basename($path);
1205 $size = filesize($path);
1206 //header("Content-Type: application/octet-stream");
1207 header("Content-Type: application/force-download");
1208 header("Content-Length: $size");
1209 // IE5.5 just downloads index.php if we don't do this
1210 if(preg_match("/MSIE 5.5/", $HTTP_USER_AGENT)) {
1211 header("Content-Disposition: filename=$file");
1212 } else {
1213 header("Content-Disposition: attachment; filename=$file");
1214 }
1215 header("Content-Transfer-Encoding: binary");
1216 $fh = fopen($path, "r");
1217 fpassthru($fh);
1218 }
1219
1220
1221 //////////////////////////////////////////////////////////////////
1222
1223 function chopsl($path) {
1224 if (substr($path,strlen($path)-1,1) == "/") $path=substr($path,0,strlen($path)-1);
1225 $path=str_replace("//","/",$path);
1226 return $path;
1227 }
1228
1229 //////////////////////////////////////////////////////////////////
1230 // MAIN PROGRAM
1231 // ============
1232 // query parameters: capital letters
1233 // local functions : begin with capital letters
1234 // global constants: begin with gbl
1235
1236 $gblFilePerms = 0640 ; // default for new files
1237 $gblDirPerms = 0750 ; // default for new dirs
1238
1239 // phpinfo() ;
1240 // exit ;
1241
1242 // forks before authentication: style sheet and hash
1243 // creation if password not yet set.
1244 if (isset($STYLE) && $STYLE == "get") { CSS() ; exit ; }
1245
1246 $fsScriptDir = dirname($SCRIPT_FILENAME) ;
1247 // i.e. /home/httpd/html/docman
1248
1249 // read user-defined configuration
1250 if (file_exists("$fsScriptDir/.docman.conf")) {
1251 include("$fsScriptDir/.docman.conf");
1252 }
1253
1254 // where do we get users from?
1255 if (file_exists("$gblIncDir/$gblUsers.php")) {
1256 include("$gblIncDir/$gblUsers.php");
1257 } else {
1258 Error("Configuration error","Can't find user handling module at <tt>$gblIncDir/$gblUsers.php</tt> ! Please fix <tt>$fsScriptDir/.docman.conf</tt>");
1259 }
1260
1261 // if no password, or empty password logout
1262 if (
1263 isset($PHP_AUTH_USER) && (
1264 !isset($relogin) || (
1265 isset($relogin) && $relogin != md5($PHP_AUTH_USER.$PHP_AUTH_PW)
1266 )
1267 ) && (
1268 $PHP_AUTH_PW == "" || !isset($PHP_AUTH_PW)
1269 ) && !isset($force_login)
1270 ) {
1271 StartHTML("Logout completed","Your login credentials has been erased") ;
1272 EndHTML() ;
1273 exit ;
1274 }
1275
1276 // authentication failure
1277 if ( md5($PHP_AUTH_USER.$PHP_AUTH_PW) != $gblPw ||
1278 isset($relogin) && $gblPw == $relogin) {
1279 $realm="$HTTP_HOST";
1280 header("WWW-authenticate: basic realm=\"$realm\"") ;
1281 header("HTTP/1.0 401 Unauthorized") ;
1282 NoEntry() ;
1283 exit ;
1284 }
1285
1286 // get current directory relative to $gblFsRoot
1287 $relDir = $DIR ; // from POST
1288 if ($relDir == "") { // not defined in POST ?
1289 $relDir = urldecode($D) ; // then use GET
1290 }
1291
1292 $relDir=stripSlashes($relDir);
1293
1294 if ($relDir == "/") $relDir = "" ;
1295 // default : website root = ""
1296
1297 if (strstr($relDir,"..")) Error("No updirs allowed");
1298
1299 // full paths contain "fs" or "Fs". Paths realitve to root of
1300 // website contain "rel" or "Rel". The script won't let you
1301 // edit anything above directory equal to http://server.com
1302 // i.e. below $gblFsRoot.
1303
1304 $relScriptDir = dirname($SCRIPT_NAME) ;
1305 // i.e. /docman
1306
1307 // start on server root
1308 // $gblFsRoot = substr($fsScriptDir,0, strlen($fsScriptDir)-strlen($relScriptDir)) ;
1309 // or on script root
1310 $gblFsRoot = $fsScriptDir;
1311 // i.e. /home/httpd/html
1312
1313 $fsDir = $gblFsRoot . $relDir ; // current directory
1314 if ( !is_dir($fsDir) ) Error("Dir not found",$relDir) ;
1315
1316 if (isset($GLOBALS["HTTPS"]) && $GLOBALS["HTTPS"] == "on") {
1317 $webRoot = "https://";
1318 } else {
1319 $webRoot = "http://";
1320 }
1321 $webRoot .= $GLOBALS["HTTP_HOST"] . $relScriptDir;
1322
1323 $FN=stripSlashes($FN);
1324
1325
1326 switch ($POSTACTION) {
1327 case "UPLOAD" :
1328 if (!is_writeable($fsDir)) Error("Write denied",$relDir) ;
1329 if (strstr($FN_name,"/"))
1330 Error("Non-conforming filename") ;
1331 // TODO : should rather check for escapeshellcmds
1332 // but maybe RFC 18xx asserts safe filenames ....
1333 $source = $FN ;
1334 if (! file_exists($source)) {
1335 Error("You must select file with browse to upload it!");
1336 }
1337 if (! isset($FILENAME)) { // from update file
1338 $target = "$fsDir/$FN_name" ;
1339 } else {
1340 $target = "$fsDir/$FILENAME";
1341 }
1342
1343 // backup old files first
1344 $dir=dirname($target);
1345 if (! file_exists($dir."/.bak")) {
1346 mkdir($dir."/.bak",0700);
1347 }
1348 if (! file_exists($dir."/.bak/$GLOBALS[gblNumBackups]")) {
1349 mkdir($dir."/.bak/$GLOBALS[gblNumBackups]",0700);
1350 }
1351 $file=basename($target);
1352 for($i=$GLOBALS[gblNumBackups]-1;$i>0;$i--) {
1353 MoveTo("$dir/.bak/$i/$file","$dir/.bak/".($i+1)."/");
1354 }
1355 MoveTo($target,$dir."/.bak/1/");
1356
1357 copy($source,$target) ;
1358 chmod($target,$gblFilePerms) ;
1359 clearstatcache() ;
1360 Logit($target,"uploaded");
1361 if (isset($FILENAME)) {
1362 Unlock($target);
1363 }
1364 ChangeLog($target,"updated");
1365 break ;
1366
1367 case "SAVE" :
1368 $path = $gblFsRoot . $RELPATH ;
1369 $path=stripSlashes($path);
1370 $writable = is_writeable($path) ;
1371 $legaldir = is_writeable(dirname($path)) ;
1372 $exists = (file_exists($path)) ? 1 : 0 ;
1373 // check for legal extension here as well
1374 if (!($writable || (!$exists && $legaldir)))
1375 Error("Write denied",$RELPATH) ;
1376 $fh = fopen($path, "w") ;
1377 $FILEDATA=stripSlashes($FILEDATA);
1378 fwrite($fh,$FILEDATA) ;
1379 fclose($fh) ;
1380 clearstatcache() ;
1381 Logit($path,"saved changes");
1382 ChangeLog($path,"saved changes");
1383 break ;
1384
1385 case "CREATE" :
1386 // we know $fsDir exists
1387 if ($FN == "") break; // no filename!
1388 if (!is_writeable($fsDir)) Error("Write denied",$relDir) ;
1389 $path = $fsDir . "/" . $FN ; // file or dir to create
1390 $relPath = $relDir . "/" . $FN ;
1391 switch ( $T ) {
1392 case "D" : // create a directory
1393 if ( ! @mkdir($path,$gblDirPerms) )
1394 Error("Mkdir failed",$relPath) ; // eg. if it exists
1395 clearstatcache() ;
1396 break ;
1397 case "F" : // create a new file
1398 // this functionality is doubled in DetailView().
1399 // better keep it here altogether
1400 // chmod perms to $gblFilePerms
1401 if ( file_exists($path) && !is_writeable($path) )
1402 Error("File not writable", $relPath) ;
1403 $fh = fopen($path, "w+") ;
1404 if ($fh) {
1405 fputs($fh,"\n");
1406 fclose($fh) ;
1407 LogIt($path,"file created");
1408 } else {
1409 Error("Creation of file $relPath failed -- $path");
1410 }
1411 $tstr = "$PHP_SELF?A=E&D=".urlencode($relDir)."&F=".urlencode($FN) ;
1412 header("Location: " . $tstr) ;
1413 ChangeLog($target,"created");
1414 exit ;
1415 }
1416 break ;
1417
1418 case "DELETE" :
1419 if ( $CONFIRM != "on" ) break ;
1420
1421 $tstr = "Attempt to delete non-existing object or " ;
1422 $tstr .= "insufficient privileges: " ;
1423
1424 if ( $FN != "") { // delete file
1425 $path = $fsDir . "/" . $FN ;
1426
1427 $dir=dirname($path);
1428 $file=basename($path);
1429 if (! file_exists("$dir/.del")) {
1430 mkdir("$dir/.del",0700);
1431 }
1432
1433 // if ( ! @unlink($path) ) {
1434 if ( ! rename($path,"$dir/.del/$file") ) {
1435 Error("File delete failed", $tstr . $path) ;
1436 Logit($path,"file delete failed");
1437 exit ;
1438 } else {
1439 Logit($path,"file deleted");
1440 MoveTo("$dir/.log/$file","$dir/.del/.log/");
1441 MoveTo("$dir/.note/$file","$dir/.del/.note/");
1442 MoveTo("$dir/.lock/$file","$dir/.del/.lock/");
1443 }
1444 }
1445 else { // delete directory
1446 if ( ! @rrmdir($fsDir) ) {
1447 Error("Rmdir failed", $tstr . $fsDir) ;
1448 }
1449 else {
1450 $relDir = dirname($relDir) ; // move up
1451 }
1452 }
1453 break ;
1454
1455 case "UNDELETE" :
1456 if ( $CONFIRM != "on" ) break ;
1457
1458 if (substr($FN,0,4) != ".del") break ;
1459 $file=substr($FN,4,strlen($FN)-4);
1460
1461 Logit("$fsDir/.del/$file","undeleted");
1462 MoveTo("$fsDir/.del/$file","$fsDir/");
1463 MoveTo("$fsDir/.del/.log/$file","$fsDir/.log/");
1464 MoveTo("$fsDir/.del/.note/$file","$fsDir/.note/");
1465 MoveTo("$fsDir/.del/.lock/$file","$fsDir/.lock/");
1466
1467 break ;
1468
1469 case "RENAME" :
1470 if ( $CONFIRM != "on" ) break ;
1471
1472 Logit("$fsDir/$FN","renamed $FN to $NEWNAME");
1473 safe_rename($fsDir,$FN,$NEWNAME);
1474 break ;
1475
1476 case "NOTE" :
1477 WriteNote("$fsDir/$FN","$NOTE");
1478 break ;
1479
1480 case "UNLOCK" :
1481 if ( $CONFIRM != "on" ) break ;
1482 Unlock("$fsDir/$FN");
1483 break ;
1484
1485 default :
1486 // user hit "CANCEL" or undefined action
1487 }
1488
1489 // common to all POSTs : redirect to directory view ($relDir)
1490 if ( $POSTACTION != "" ) {
1491 $tstr = $PHP_SELF . "?D=" . urlencode($relDir) ;
1492 header("Location: " . $tstr) ;
1493 exit ;
1494 }
1495
1496 // check for mode.. navigate, code display, upload, or detail?
1497 // $A=U : upload to path given in $D
1498 // $A=E : display detail of file $D/$F and edit
1499 // $A=C : display code in file $D/$F
1500 // $A=Co : checkout file $D/$F
1501 // $A=Ci : checkin file $D/$F
1502 // $A=V : view file (do nothing except log)
1503 // $A=I : include file .$F.php from $gblFsRoot
1504 // default : display directory $D
1505
1506 switch ($A) {
1507 case "U" :
1508 // upload to $relDir
1509 if (!is_writeable($gblFsRoot . $relDir))
1510 Error("Write access denied",$relDir) ;
1511 $text = "Use this page to upload a single " ;
1512 $text .= "file to <B>$HTTP_HOST</B>." ;
1513 StartHTML("(Upload Page)", $text) ;
1514 UploadPage($gblFsRoot, $relDir) ;
1515 EndHTML() ;
1516 exit ;
1517 case "E" :
1518 $F=stripSlashes($F);
1519 // detail of $relDir/$F
1520 if (is_file("$gblFsRoot/$relDir/$F") || is_dir("$gblFsRoot/$relDir/$F")) DetailPage($gblFsRoot, $relDir, $F) ;
1521 exit ;
1522 case "C" :
1523 $F=stripSlashes($F);
1524 // listing of $relDir/$F
1525 DisplayCode($gblFsRoot, $relDir, $F) ;
1526 exit ;
1527 case "Co" :
1528 // checkout
1529 Lock("$gblFsRoot/$relDir/$F");
1530 Download("$gblFsRoot/$relDir/$F");
1531 exit;
1532 case "Ci" :
1533 $F=stripSlashes($F);
1534 // upload && update to $relDir
1535 if (!is_writeable($gblFsRoot . $relDir))
1536 Error("Write access denied",$relDir) ;
1537 $text = "Use this page to update a single " ;
1538 $text .= "file to <B>$HTTP_HOST</B>." ;
1539 StartHTML("(Update file Page)", $text) ;
1540 UploadPage($gblFsRoot, $relDir, $F) ;
1541 EndHTML() ;
1542 exit ;
1543 case "V" :
1544 // view
1545 LogIt("$gblFsRoot/$relDir/$F","viewed");
1546 if ($gblForceDownload) {
1547 Download("$gblFsRoot/$relDir/$F");
1548 } else {
1549 header("Content-Disposition: attachment; filename=$F" );
1550 Header("Location: $webRoot".urlpath("$relDir/$F"));
1551 }
1552 exit;
1553 case "Ch" :
1554 StartHTML("(File changes)","All changes chronologicaly...");
1555 DisplayChangeLog(0); // all
1556 EndHTML() ;
1557 exit;
1558 case "Ch1" :
1559 StartHTML("(File changes)","Changes to files in last day...");
1560 DisplayChangeLog(1);
1561 EndHTML() ;
1562 exit;
1563 case "I" :
1564 $F=stripSlashes($F);
1565 $inc_file="${gblFsRoot}/.${F}.php";
1566 if (!isset($F) || $F == "" || !file_exists($inc_file)) Error("Fatal error $inc_file"); // can't find file to include
1567 if (!is_readable($inc_file))
1568 Error("Read access to include file denied",".${F}.php");
1569 $text = "Your include file should define \$text variable which holds this text and \$title variable which is page title";
1570 $title = "You should define \$title variable with page title";
1571 include($inc_file);
1572 StartHTML($title, $text) ;
1573 print "<p>".GifIcon(up)." Back to <a href=$GLOBALS[PHP_SELF]>front page</a>.</p>";
1574 EndHTML() ;
1575 exit ;
1576 }
1577
1578 // default: display directory $relDir
1579 Navigate($gblFsRoot,$relDir) ;
1580 exit ;
1581
1582 Error("Whooah!","By cartesian logic, this never happens") ;
1583 ?>

  ViewVC Help
Powered by ViewVC 1.1.26