]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/loadsave.php
Fixed missing gettext _() for button name.
[SourceForge/phpwiki.git] / lib / loadsave.php
1 <?php //-*-php-*-
2 rcs_id('$Id: loadsave.php,v 1.82 2003-11-18 19:48:01 carstenklapp Exp $');
3
4 /*
5  Copyright 1999, 2000, 2001, 2002 $ThePhpWikiProgrammingTeam
6
7  This file is part of PhpWiki.
8
9  PhpWiki is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 2 of the License, or
12  (at your option) any later version.
13
14  PhpWiki is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with PhpWiki; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24
25 require_once("lib/ziplib.php");
26 require_once("lib/Template.php");
27
28 function StartLoadDump(&$request, $title, $html = '')
29 {
30     // FIXME: This is a hack
31     $tmpl = Template('html', array('TITLE' => $title,
32                                   'HEADER' => $title,
33                                   'CONTENT' => '%BODY%'));
34     echo ereg_replace('%BODY%.*', '', $tmpl->getExpansion($html));
35 }
36
37 function EndLoadDump(&$request)
38 {
39     // FIXME: This is a hack
40     $pagelink = WikiLink($request->getPage());
41
42     PrintXML(HTML::p(HTML::strong(_("Complete."))),
43              HTML::p(fmt("Return to %s", $pagelink)));
44     echo "</body></html>\n";
45 }
46
47
48 ////////////////////////////////////////////////////////////////
49 //
50 //  Functions for dumping.
51 //
52 ////////////////////////////////////////////////////////////////
53
54 /**
55  * For reference see:
56  * http://www.nacs.uci.edu/indiv/ehood/MIME/2045/rfc2045.html
57  * http://www.faqs.org/rfcs/rfc2045.html
58  * (RFC 1521 has been superceeded by RFC 2045 & others).
59  *
60  * Also see http://www.faqs.org/rfcs/rfc2822.html
61  */
62 function MailifyPage ($page, $nversions = 1)
63 {
64     $current = $page->getCurrentRevision();
65     $head = '';
66
67     if (STRICT_MAILABLE_PAGEDUMPS) {
68         $from = defined('SERVER_ADMIN') ? SERVER_ADMIN : 'foo@bar';
69         //This is for unix mailbox format: (not RFC (2)822)
70         // $head .= "From $from  " . CTime(time()) . "\r\n";
71         $head .= "Subject: " . rawurlencode($page->getName()) . "\r\n";
72         $head .= "From: $from (PhpWiki)\r\n";
73         // RFC 2822 requires only a Date: and originator (From:)
74         // field, however the obsolete standard RFC 822 also
75         // requires a destination field.
76         $head .= "To: $from (PhpWiki)\r\n";
77     }
78     $head .= "Date: " . Rfc2822DateTime($current->get('mtime')) . "\r\n";
79     $head .= sprintf("Mime-Version: 1.0 (Produced by PhpWiki %s)\r\n",
80                      PHPWIKI_VERSION);
81
82     // This should just be entered by hand (or by script?)
83     // in the actual pgsrc files, since only they should have
84     // RCS ids.
85     //$head .= "X-Rcs-Id: \$Id\$\r\n";
86
87     $iter = $page->getAllRevisions();
88     $parts = array();
89     while ($revision = $iter->next()) {
90         $parts[] = MimeifyPageRevision($revision);
91         if ($nversions > 0 && count($parts) >= $nversions)
92             break;
93     }
94     if (count($parts) > 1)
95         return $head . MimeMultipart($parts);
96     assert($parts);
97     return $head . $parts[0];
98 }
99
100 /***
101  * Compute filename to used for storing contents of a wiki page.
102  *
103  * Basically we do a rawurlencode() which encodes everything except
104  * ASCII alphanumerics and '.', '-', and '_'.
105  *
106  * But we also want to encode leading dots to avoid filenames like
107  * '.', and '..'. (Also, there's no point in generating "hidden" file
108  * names, like '.foo'.)
109  *
110  * @param $pagename string Pagename.
111  * @return string Filename for page.
112  */
113 function FilenameForPage ($pagename)
114 {
115     $enc = rawurlencode($pagename);
116     return preg_replace('/^\./', '%2e', $enc);
117 }
118
119 /**
120  * The main() function which generates a zip archive of a PhpWiki.
121  *
122  * If $include_archive is false, only the current version of each page
123  * is included in the zip file; otherwise all archived versions are
124  * included as well.
125  */
126 function MakeWikiZip (&$request)
127 {
128     if ($request->getArg('include') == 'all') {
129         $zipname         = "wikidb.zip";
130         $include_archive = true;
131     }
132     else {
133         $zipname         = "wiki.zip";
134         $include_archive = false;
135     }
136
137
138
139     $zip = new ZipWriter("Created by PhpWiki " . PHPWIKI_VERSION, $zipname);
140
141     $dbi = $request->getDbh();
142     $pages = $dbi->getAllPages();
143     while ($page = $pages->next()) {
144         @set_time_limit(30); // Reset watchdog
145
146         $current = $page->getCurrentRevision();
147         if ($current->getVersion() == 0)
148             continue;
149
150         $wpn = new WikiPageName($page->getName());
151         if (!$wpn->isValid())
152             continue;
153
154         $attrib = array('mtime'    => $current->get('mtime'),
155                         'is_ascii' => 1);
156         if ($page->get('locked'))
157             $attrib['write_protected'] = 1;
158
159         if ($include_archive)
160             $content = MailifyPage($page, 0);
161         else
162             $content = MailifyPage($page);
163
164         $zip->addRegularFile( FilenameForPage($page->getName()),
165                               $content, $attrib);
166     }
167     $zip->finish();
168 }
169
170 function DumpToDir (&$request)
171 {
172     $directory = $request->getArg('directory');
173     if (empty($directory))
174         $request->finish(_("You must specify a directory to dump to"));
175
176     // see if we can access the directory the user wants us to use
177     if (! file_exists($directory)) {
178         if (! mkdir($directory, 0755))
179             $request->finish(fmt("Cannot create directory '%s'", $directory));
180         else
181             $html = HTML::p(fmt("Created directory '%s' for the page dump...",
182                                 $directory));
183     } else {
184         $html = HTML::p(fmt("Using directory '%s'", $directory));
185     }
186
187     StartLoadDump($request, _("Dumping Pages"), $html);
188
189     $dbi = $request->getDbh();
190     $pages = $dbi->getAllPages();
191
192     while ($page = $pages->next()) {
193         @set_time_limit(30); // Reset watchdog.
194
195         $filename = FilenameForPage($page->getName());
196
197         $msg = HTML(HTML::br(), $page->getName(), ' ... ');
198
199         if($page->getName() != $filename) {
200             $msg->pushContent(HTML::small(fmt("saved as %s", $filename)),
201                               " ... ");
202         }
203
204         if ($request->getArg('include') == 'all')
205             $data = MailifyPage($page, 0);
206         else
207             $data = MailifyPage($page);
208
209         if ( !($fd = fopen("$directory/$filename", "w")) ) {
210             $msg->pushContent(HTML::strong(fmt("couldn't open file '%s' for writing",
211                                                "$directory/$filename")));
212             $request->finish($msg);
213         }
214
215         $num = fwrite($fd, $data, strlen($data));
216         $msg->pushContent(HTML::small(fmt("%s bytes written", $num)));
217         PrintXML($msg);
218
219         flush();
220         assert($num == strlen($data));
221         fclose($fd);
222     }
223
224     EndLoadDump($request);
225 }
226
227
228 function DumpHtmlToDir (&$request)
229 {
230     $directory = $request->getArg('directory');
231     if (empty($directory))
232         $request->finish(_("You must specify a directory to dump to"));
233
234     // see if we can access the directory the user wants us to use
235     if (! file_exists($directory)) {
236         if (! mkdir($directory, 0755))
237             $request->finish(fmt("Cannot create directory '%s'", $directory));
238         else
239             $html = HTML::p(fmt("Created directory '%s' for the page dump...",
240                                 $directory));
241     } else {
242         $html = HTML::p(fmt("Using directory '%s'", $directory));
243     }
244
245     StartLoadDump($request, _("Dumping Pages"), $html);
246
247     $dbi = $request->getDbh();
248     $pages = $dbi->getAllPages();
249
250     global $HTML_DUMP_SUFFIX, $Theme;
251     if ($HTML_DUMP_SUFFIX)
252         $Theme->HTML_DUMP_SUFFIX = $HTML_DUMP_SUFFIX;
253
254     while ($page = $pages->next()) {
255         @set_time_limit(30); // Reset watchdog.
256
257         $pagename = $page->getName();
258         $filename = FilenameForPage($pagename) . $Theme->HTML_DUMP_SUFFIX;
259
260         $msg = HTML(HTML::br(), $pagename, ' ... ');
261
262         if($page->getName() != $filename) {
263             $msg->pushContent(HTML::small(fmt("saved as %s", $filename)),
264                               " ... ");
265         }
266
267         $revision = $page->getCurrentRevision();
268
269         $transformedContent = $revision->getTransformedContent();
270
271         $template = new Template('browse', $request,
272                                  array('revision' => $revision,
273                                        'CONTENT' => $transformedContent));
274
275         $data = GeneratePageasXML($template, $pagename);
276
277         if ( !($fd = fopen("$directory/$filename", "w")) ) {
278             $msg->pushContent(HTML::strong(fmt("couldn't open file '%s' for writing",
279                                                "$directory/$filename")));
280             $request->finish($msg);
281         }
282
283         $num = fwrite($fd, $data, strlen($data));
284         $msg->pushContent(HTML::small(fmt("%s bytes written", $num), "\n"));
285         PrintXML($msg);
286
287         flush();
288         assert($num == strlen($data));
289         fclose($fd);
290     }
291
292     //CopyImageFiles() will go here;
293     $Theme->$HTML_DUMP_SUFFIX = '';
294
295     EndLoadDump($request);
296 }
297
298 /* Known problem: any plugins or other code which echo()s text will
299  * lead to a corrupted html zip file which may produce the following
300  * errors upon unzipping:
301  *
302  * warning [wikihtml.zip]:  2401 extra bytes at beginning or within zipfile
303  * file #58:  bad zipfile offset (local header sig):  177561
304  *  (attempting to re-compensate)
305  *
306  * However, the actual wiki page data should be unaffected.
307  */
308 function MakeWikiZipHtml (&$request)
309 {
310     $zipname = "wikihtml.zip";
311     $zip = new ZipWriter("Created by PhpWiki " . PHPWIKI_VERSION, $zipname);
312     $dbi = $request->getDbh();
313     $pages = $dbi->getAllPages();
314
315     global $HTML_DUMP_SUFFIX, $Theme;
316     if ($HTML_DUMP_SUFFIX)
317         $Theme->HTML_DUMP_SUFFIX = $HTML_DUMP_SUFFIX;
318
319     while ($page = $pages->next()) {
320         @set_time_limit(30); // Reset watchdog.
321
322         $current = $page->getCurrentRevision();
323         if ($current->getVersion() == 0)
324             continue;
325
326         $attrib = array('mtime'    => $current->get('mtime'),
327                         'is_ascii' => 1);
328         if ($page->get('locked'))
329             $attrib['write_protected'] = 1;
330
331         $pagename = $page->getName();
332         $filename = FilenameForPage($pagename) . $Theme->HTML_DUMP_SUFFIX;
333         $revision = $page->getCurrentRevision();
334
335         $transformedContent = $revision->getTransformedContent();
336
337         $template = new Template('browse', $request,
338                                  array('revision' => $revision,
339                                        'CONTENT' => $transformedContent));
340
341         $data = GeneratePageasXML($template, $pagename);
342
343         $zip->addRegularFile( $filename, $data, $attrib);
344     }
345     // FIXME: Deal with images here.
346     $zip->finish();
347     $Theme->$HTML_DUMP_SUFFIX = '';
348 }
349
350
351 ////////////////////////////////////////////////////////////////
352 //
353 //  Functions for restoring.
354 //
355 ////////////////////////////////////////////////////////////////
356
357 function SavePage (&$request, $pageinfo, $source, $filename)
358 {
359     $pagedata    = $pageinfo['pagedata'];    // Page level meta-data.
360     $versiondata = $pageinfo['versiondata']; // Revision level meta-data.
361
362     if (empty($pageinfo['pagename'])) {
363         PrintXML(HTML::dt(HTML::strong(_("Empty pagename!"))));
364         return;
365     }
366
367     if (empty($versiondata['author_id']))
368         $versiondata['author_id'] = $versiondata['author'];
369
370     $pagename = $pageinfo['pagename'];
371     $content  = $pageinfo['content'];
372
373     if ($pagename ==_("InterWikiMap"))
374         $content = _tryinsertInterWikiMap($content);
375
376     $dbi = $request->getDbh();
377     $page = $dbi->getPage($pagename);
378
379     $current = $page->getCurrentRevision();
380     // Try to merge if updated pgsrc contents are different. This
381     // whole thing is hackish
382     //
383     // TODO: try merge unless:
384     // if (current contents = default contents && pgsrc_version >=
385     // pgsrc_version) then just upgrade this pgsrc
386     $needs_merge = false;
387     $merging = false;
388     $overwrite = false;
389
390     if ($request->getArg('merge')) {
391         $merging = true;
392     }
393     else if ($request->getArg('overwrite')) {
394         $overwrite = true;
395     }
396
397     if ( (! $current->hasDefaultContents())
398          && ($current->getPackedContent() != $content)
399          && ($merging == true) ) {
400         require_once('lib/editpage.php');
401         $request->setArg('pagename', $pagename);
402         $r = $current->getVersion();
403         $request->setArg('revision', $current->getVersion());
404         $p = new LoadFileConflictPageEditor($request);
405         $p->_content = $content;
406         $p->_currentVersion = $r - 1;
407         $p->editPage($saveFailed = true);
408         return; //early return
409     }
410
411     foreach ($pagedata as $key => $value) {
412         if (!empty($value))
413             $page->set($key, $value);
414     }
415
416     $mesg = HTML::dd();
417     $skip = false;
418     if ($source)
419         $mesg->pushContent(' ', fmt("from %s", $source));
420
421
422     $current = $page->getCurrentRevision();
423     if ($current->getVersion() == 0) {
424         $mesg->pushContent(' ', _("new page"));
425         $isnew = true;
426     }
427     else {
428         if ( (! $current->hasDefaultContents())
429              && ($current->getPackedContent() != $content) ) {
430             if ($overwrite) {
431                 $mesg->pushContent(' ',
432                                    fmt("has edit conflicts - overwriting anyway"));
433                 $skip = false;
434                 if (substr_count($source, 'pgsrc')) {
435                     $versiondata['author'] = _("The PhpWiki programming team");
436                     // but leave authorid as userid who loaded the file
437                 }
438             }
439             else {
440                 $mesg->pushContent(' ', fmt("has edit conflicts - skipped"));
441                 $needs_merge = true; // hackish
442                 $skip = true;
443             }
444         }
445         else if ($current->getPackedContent() == $content
446                  && $current->get('author') == $versiondata['author']) {
447             $mesg->pushContent(' ',
448                                fmt("is identical to current version %d - skipped",
449                                    $current->getVersion()));
450             $skip = true;
451         }
452         $isnew = false;
453     }
454
455     if (! $skip) {
456         $new = $page->save($content, WIKIDB_FORCE_CREATE, $versiondata);
457         $dbi->touch();
458         $mesg->pushContent(' ', fmt("- saved to database as version %d",
459                                     $new->getVersion()));
460     }
461     if ($needs_merge) {
462         $f = $source;
463         // hackish, $source contains needed path+filename
464         $f = str_replace(sprintf(_("MIME file %s"), ''), '', $f);
465         $f = str_replace(sprintf(_("Serialized file %s"), ''), '', $f);
466         $f = str_replace(sprintf(_("plain file %s"), ''), '', $f);
467         global $Theme;
468         $meb = $Theme->makeButton($text = _("Merge Edit"),
469                                   $url = _("PhpWikiAdministration")
470                                   . "?action=loadfile&source="
471                                   . FilenameForPage($f)
472                                   . "&merge=1",
473                                   $class = 'wikiadmin');
474         $owb = $Theme->makeButton($text = _("Restore Anyway"),
475                                   $url = _("PhpWikiAdministration")
476                                   . "?action=loadfile&source="
477                                   . FilenameForPage($f)
478                                   . "&overwrite=1",
479                                   $class = 'wikiunsafe');
480         $mesg->pushContent(' ', $meb, " ", $owb);
481     }
482
483     if ($skip)
484         PrintXML(HTML::dt(HTML::em(WikiLink($pagename))), $mesg);
485     else
486         PrintXML(HTML::dt(WikiLink($pagename)), $mesg);
487     flush();
488 }
489
490 function _tryinsertInterWikiMap($content) {
491     $goback = false;
492     if (strpos($content, "<verbatim>")) {
493         //$error_html = " The newly loaded pgsrc already contains a verbatim block.";
494         $goback = true;
495     }
496     if (!$goback && !defined('INTERWIKI_MAP_FILE')) {
497         $error_html = sprintf(" "._("%s: not defined"), "INTERWIKI_MAP_FILE");
498         $goback = true;
499     }
500     if (!$goback && !file_exists(INTERWIKI_MAP_FILE)) {
501         $error_html = sprintf(" "._("%s: file not found"), INTERWIKI_MAP_FILE);
502         $goback = true;
503     }
504
505     if (!empty($error_html))
506         trigger_error(_("Default InterWiki map file not loaded.")
507                       . $error_html, E_USER_NOTICE);
508
509     if ($goback)
510         return $content;
511
512     $filename = INTERWIKI_MAP_FILE;
513     trigger_error(sprintf(_("Loading InterWikiMap from external file %s."),
514                           $filename), E_USER_NOTICE);
515
516     $fd = fopen ($filename, "rb");
517     $data = fread ($fd, filesize($filename));
518     fclose ($fd);
519     $content = $content . "\n<verbatim>\n$data</verbatim>\n";
520     return $content;
521 }
522
523 function ParseSerializedPage($text, $default_pagename, $user)
524 {
525     if (!preg_match('/^a:\d+:{[si]:\d+/', $text))
526         return false;
527
528     $pagehash = unserialize($text);
529
530     // Split up pagehash into four parts:
531     //   pagename
532     //   content
533     //   page-level meta-data
534     //   revision-level meta-data
535
536     if (!defined('FLAG_PAGE_LOCKED'))
537         define('FLAG_PAGE_LOCKED', 1);
538     $pageinfo = array('pagedata'    => array(),
539                       'versiondata' => array());
540
541     $pagedata = &$pageinfo['pagedata'];
542     $versiondata = &$pageinfo['versiondata'];
543
544     // Fill in defaults.
545     if (empty($pagehash['pagename']))
546         $pagehash['pagename'] = $default_pagename;
547     if (empty($pagehash['author'])) {
548         $pagehash['author'] = $user->getId();
549     }
550
551     foreach ($pagehash as $key => $value) {
552         switch($key) {
553             case 'pagename':
554             case 'version':
555             case 'hits':
556                 $pageinfo[$key] = $value;
557                 break;
558             case 'content':
559                 $pageinfo[$key] = join("\n", $value);
560                 break;
561             case 'flags':
562                 if (($value & FLAG_PAGE_LOCKED) != 0)
563                     $pagedata['locked'] = 'yes';
564                 break;
565             case 'created':
566                 $pagedata[$key] = $value;
567                 break;
568             case 'lastmodified':
569                 $versiondata['mtime'] = $value;
570                 break;
571             case 'author':
572             case 'author_id':
573             case 'summary':
574                 $versiondata[$key] = $value;
575                 break;
576         }
577     }
578     return $pageinfo;
579 }
580
581 function SortByPageVersion ($a, $b) {
582     return $a['version'] - $b['version'];
583 }
584
585 function LoadFile (&$request, $filename, $text = false, $mtime = false)
586 {
587     if (!is_string($text)) {
588         // Read the file.
589         $stat  = stat($filename);
590         $mtime = $stat[9];
591         $text  = implode("", file($filename));
592     }
593
594     @set_time_limit(30); // Reset watchdog.
595
596     // FIXME: basename("filewithnoslashes") seems to return garbage sometimes.
597     $basename = basename("/dummy/" . $filename);
598
599     if (!$mtime)
600         $mtime = time();    // Last resort.
601
602     $default_pagename = rawurldecode($basename);
603
604     if ( ($parts = ParseMimeifiedPages($text)) ) {
605         usort($parts, 'SortByPageVersion');
606         foreach ($parts as $pageinfo)
607             SavePage($request, $pageinfo, sprintf(_("MIME file %s"),
608                                                   $filename), $basename);
609     }
610     else if ( ($pageinfo = ParseSerializedPage($text, $default_pagename,
611                                                $request->getUser())) ) {
612         SavePage($request, $pageinfo, sprintf(_("Serialized file %s"),
613                                               $filename), $basename);
614     }
615     else {
616         $user = $request->getUser();
617
618         // Assume plain text file.
619         $pageinfo = array('pagename' => $default_pagename,
620                           'pagedata' => array(),
621                           'versiondata'
622                           => array('author' => $user->getId()),
623                           'content'  => preg_replace('/[ \t\r]*\n/', "\n",
624                                                      chop($text))
625                           );
626         SavePage($request, $pageinfo, sprintf(_("plain file %s"), $filename),
627                  $basename);
628     }
629 }
630
631 function LoadZip (&$request, $zipfile, $files = false, $exclude = false) {
632     $zip = new ZipReader($zipfile);
633     while (list ($fn, $data, $attrib) = $zip->readFile()) {
634         // FIXME: basename("filewithnoslashes") seems to return
635         // garbage sometimes.
636         $fn = basename("/dummy/" . $fn);
637         if ( ($files && !in_array($fn, $files))
638              || ($exclude && in_array($fn, $exclude)) ) {
639             PrintXML(HTML::dt(WikiLink($fn)),
640                      HTML::dd(_("Skipping")));
641             continue;
642         }
643
644         LoadFile($request, $fn, $data, $attrib['mtime']);
645     }
646 }
647
648 function LoadDir (&$request, $dirname, $files = false, $exclude = false) {
649     $fileset = new LimitedFileSet($dirname, $files, $exclude);
650
651     if (($skiplist = $fileset->getSkippedFiles())) {
652         PrintXML(HTML::dt(HTML::strong(_("Skipping"))));
653         $list = HTML::ul();
654         foreach ($skiplist as $file)
655             $list->pushContent(HTML::li(WikiLink($file)));
656         PrintXML(HTML::dd($list));
657     }
658
659     // Defer HomePage loading until the end. If anything goes wrong
660     // the pages can still be loaded again.
661     $files = $fileset->getFiles();
662     if (in_array(HOME_PAGE, $files)) {
663         $files = array_diff($files, array(HOME_PAGE));
664         $files[] = HOME_PAGE;
665     }
666     foreach ($files as $file)
667         LoadFile($request, "$dirname/$file");
668 }
669
670 class LimitedFileSet extends FileSet {
671     function LimitedFileSet($dirname, $_include, $exclude) {
672         $this->_includefiles = $_include;
673         $this->_exclude = $exclude;
674         $this->_skiplist = array();
675         parent::FileSet($dirname);
676     }
677
678     function _filenameSelector($fn) {
679         $incl = &$this->_includefiles;
680         $excl = &$this->_exclude;
681
682         if ( ($incl && !in_array($fn, $incl))
683              || ($excl && in_array($fn, $excl)) ) {
684             $this->_skiplist[] = $fn;
685             return false;
686         } else {
687             return true;
688         }
689     }
690
691     function getSkippedFiles () {
692         return $this->_skiplist;
693     }
694 }
695
696
697 function IsZipFile ($filename_or_fd)
698 {
699     // See if it looks like zip file
700     if (is_string($filename_or_fd))
701     {
702         $fd    = fopen($filename_or_fd, "rb");
703         $magic = fread($fd, 4);
704         fclose($fd);
705     }
706     else
707     {
708         $fpos  = ftell($filename_or_fd);
709         $magic = fread($filename_or_fd, 4);
710         fseek($filename_or_fd, $fpos);
711     }
712
713     return $magic == ZIP_LOCHEAD_MAGIC || $magic == ZIP_CENTHEAD_MAGIC;
714 }
715
716
717 function LoadAny (&$request, $file_or_dir, $files = false, $exclude = false)
718 {
719     // Try urlencoded filename for accented characters.
720     if (!file_exists($file_or_dir)) {
721         // Make sure there are slashes first to avoid confusing phps
722         // with broken dirname or basename functions.
723         // FIXME: windows uses \ and :
724         if (is_integer(strpos($file_or_dir, "/"))) {
725             $file_or_dir = FindFile($file_or_dir);
726             // Panic
727             if (!file_exists($file_or_dir))
728                 $file_or_dir = dirname($file_or_dir) . "/"
729                     . urlencode(basename($file_or_dir));
730         } else {
731             // This is probably just a file.
732             $file_or_dir = urlencode($file_or_dir);
733         }
734     }
735
736     $type = filetype($file_or_dir);
737     if ($type == 'link') {
738         // For symbolic links, use stat() to determine
739         // the type of the underlying file.
740         list(,,$mode) = stat($file_or_dir);
741         $type = ($mode >> 12) & 017;
742         if ($type == 010)
743             $type = 'file';
744         elseif ($type == 004)
745             $type = 'dir';
746     }
747
748     if (! $type) {
749         $request->finish(fmt("Unable to load: %s", $file_or_dir));
750     }
751     else if ($type == 'dir') {
752         LoadDir($request, $file_or_dir, $files, $exclude);
753     }
754     else if ($type != 'file' && !preg_match('/^(http|ftp):/', $file_or_dir))
755     {
756         $request->finish(fmt("Bad file type: %s", $type));
757     }
758     else if (IsZipFile($file_or_dir)) {
759         LoadZip($request, $file_or_dir, $files, $exclude);
760     }
761     else /* if (!$files || in_array(basename($file_or_dir), $files)) */
762     {
763         LoadFile($request, $file_or_dir);
764     }
765 }
766
767 function LoadFileOrDir (&$request)
768 {
769     $source = $request->getArg('source');
770     StartLoadDump($request, sprintf(_("Loading '%s'"), $source));
771     echo "<dl>\n";
772     LoadAny($request, $source);
773     echo "</dl>\n";
774     EndLoadDump($request);
775 }
776
777 function SetupWiki (&$request)
778 {
779     global $GenericPages, $LANG;
780
781
782     //FIXME: This is a hack (err, "interim solution")
783     // This is a bogo-bogo-login:  Login without
784     // saving login information in session state.
785     // This avoids logging in the unsuspecting
786     // visitor as "The PhpWiki programming team".
787     //
788     // This really needs to be cleaned up...
789     // (I'm working on it.)
790     $real_user = $request->_user;
791     $request->_user = new WikiUser($request, _("The PhpWiki programming team"),
792                                    WIKIAUTH_BOGO);
793
794     StartLoadDump($request, _("Loading up virgin wiki"));
795     echo "<dl>\n";
796
797     $pgsrc = FindLocalizedFile(WIKI_PGSRC);
798     $default_pgsrc = FindFile(DEFAULT_WIKI_PGSRC);
799     
800     if ($default_pgsrc != $pgsrc)
801         LoadAny($request, $default_pgsrc, $GenericPages);
802
803     LoadAny($request, $pgsrc);
804
805     echo "</dl>\n";
806     EndLoadDump($request);
807 }
808
809 function LoadPostFile (&$request)
810 {
811     $upload = $request->getUploadedFile('file');
812
813     if (!$upload)
814         $request->finish(_("No uploaded file to upload?")); // FIXME: more concise message
815
816
817     // Dump http headers.
818     StartLoadDump($request, sprintf(_("Uploading %s"), $upload->getName()));
819     echo "<dl>\n";
820
821     $fd = $upload->open();
822     if (IsZipFile($fd))
823         LoadZip($request, $fd, false, array(_("RecentChanges")));
824     else
825         LoadFile($request, $upload->getName(), $upload->getContents());
826
827     echo "</dl>\n";
828     EndLoadDump($request);
829 }
830
831 /**
832  $Log: not supported by cvs2svn $
833  Revision 1.81  2003/11/18 18:28:35  carstenklapp
834  Bugfix: In the Load File function of PhpWikiAdministration: When doing
835  a "Merge Edit" or "Restore Anyway", page names containing accented
836  letters (such as locale/de/pgsrc/G%E4steBuch) would produce a file not
837  found error (Use FilenameForPage funtion to urlencode page names).
838
839  Revision 1.80  2003/03/07 02:46:57  dairiki
840  Omit checks for safe_mode before set_time_limit().  Just prefix the
841  set_time_limit() calls with @ so that they fail silently if not
842  supported.
843
844  Revision 1.79  2003/02/26 01:56:05  dairiki
845  Only zip pages with legal pagenames.
846
847  Revision 1.78  2003/02/24 02:05:43  dairiki
848  Fix "n bytes written" message when dumping HTML.
849
850  Revision 1.77  2003/02/21 04:12:05  dairiki
851  Minor fixes for new cached markup.
852
853  Revision 1.76  2003/02/16 19:47:17  dairiki
854  Update WikiDB timestamp when editing or deleting pages.
855
856  Revision 1.75  2003/02/15 03:04:30  dairiki
857  Fix for WikiUser constructor API change.
858
859  Revision 1.74  2003/02/15 02:18:04  dairiki
860  When default language was English (at least), pgsrc was being
861  loaded twice.
862
863  LimitedFileSet: Fix typo/bug. ($include was being ignored.)
864
865  SetupWiki(): Fix bugs in loading of $GenericPages.
866
867  Revision 1.73  2003/01/28 21:09:17  zorloc
868  The get_cfg_var() function should only be used when one is
869  interested in the value from php.ini or similar. Use ini_get()
870  instead to get the effective value of a configuration variable.
871  -- Martin Geisler
872
873  Revision 1.72  2003/01/03 22:25:53  carstenklapp
874  Cosmetic fix to "Merge Edit" & "Overwrite" buttons. Added "The PhpWiki
875  programming team" as author when loading from pgsrc. Source
876  reformatting.
877
878  Revision 1.71  2003/01/03 02:48:05  carstenklapp
879  function SavePage: Added loadfile options for overwriting or merge &
880  compare a loaded pgsrc file with an existing page.
881
882  function LoadAny: Added a general error message when unable to load a
883  file instead of defaulting to "Bad file type".
884
885  */
886
887 // For emacs users
888 // Local Variables:
889 // mode: php
890 // tab-width: 8
891 // c-basic-offset: 4
892 // c-hanging-comment-ender-p: nil
893 // indent-tabs-mode: nil
894 // End:
895 ?>