]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/UpLoad.php
help finding the file (should not be needed)
[SourceForge/phpwiki.git] / lib / plugin / UpLoad.php
1 <?php // -*-php-*-
2 rcs_id('$Id: UpLoad.php,v 1.20 2006-08-15 13:40:40 rurban Exp $');
3 /*
4  Copyright 2003, 2004 $ThePhpWikiProgrammingTeam
5
6  This file is part of PhpWiki.
7
8  PhpWiki is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  PhpWiki is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with PhpWiki; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
22  */
23
24 /**
25  * UpLoad:  Allow Administrator to upload files to a special directory,
26  *          which should preferably be added to the InterWikiMap
27  * Usage:   <?plugin UpLoad ?>
28  * Author:  NathanGass <gass@iogram.ch>
29  * Changes: ReiniUrban <rurban@x-ray.at>,
30  *          qubit <rtryon@dartmouth.edu>
31  * Note:    See also Jochen Kalmbach's plugin/UserFileManagement.php
32  */
33
34 class WikiPlugin_UpLoad
35 extends WikiPlugin
36 {
37     var $disallowed_extensions;
38     // TODO: use PagePerms instead
39     var $only_authenticated = true; // allow only authenticated users may upload.
40
41     function getName () {
42         return "UpLoad";
43     }
44
45     function getDescription () {
46         return _("Upload files to the local InterWiki Upload:<filename>");
47     }
48
49     function getDefaultArguments() {
50         return array('logfile'  => 'phpwiki-upload.log',
51                      // add a link of the fresh file automatically to the 
52                      // end of the page (or current page)
53                      'autolink' => true, 
54                      'page'     => '[pagename]',
55                      );
56     }
57
58     function run($dbi, $argstr, &$request, $basepage) {
59         $this->disallowed_extensions = explode("\n",
60 "ad[ep]
61 asd
62 ba[st]
63 chm
64 cmd
65 com
66 cgi
67 cpl
68 crt
69 dll
70 eml
71 exe
72 hlp
73 hta
74 in[fs]
75 isp
76 jse?
77 lnk
78 md[betw]
79 ms[cipt]
80 nws
81 ocx
82 ops
83 pcd
84 p[ir]f
85 php
86 pl
87 py
88 reg
89 sc[frt]
90 sh[bsm]?
91 swf
92 url
93 vb[esx]?
94 vxd
95 ws[cfh]");
96         //removed "\{[[:xdigit:]]{8}(?:-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\}"
97
98         $args = $this->getArgs($argstr, $request);
99         extract($args);
100
101         $file_dir = getUploadFilePath();
102         if (!preg_match("/(\/|\\)$/", $file_dir))
103             $file_dir .= "/";
104         //$url_prefix = SERVER_NAME . DATA_PATH; 
105
106         $form = HTML::form(array('action' => $request->getPostURL(),
107                                  'enctype' => 'multipart/form-data',
108                                  'method' => 'post'));
109         $contents = HTML::div(array('class' => 'wikiaction'));
110         $contents->pushContent(HTML::input(array('type' => 'hidden',
111                                                  'name' => 'MAX_FILE_SIZE',
112                                                  'value' => MAX_UPLOAD_SIZE)));
113         $contents->pushContent(HTML::input(array('name' => 'userfile',
114                                                  'type' => 'file',
115                                                  'size' => '50')));
116         $contents->pushContent(HTML::raw(" "));
117         $contents->pushContent(HTML::input(array('value' => _("Upload"),
118                                                  'type' => 'submit')));
119         $form->pushContent($contents);
120
121         $message = HTML();
122         if ($request->isPost() and $this->only_authenticated) {
123             // Make sure that the user is logged in.
124             $user = $request->getUser();
125             if (!$user->isAuthenticated()) {
126                 $message->pushContent(HTML::h2(_("ACCESS DENIED: You must log in to upload files.")),
127                                           HTML::br(),HTML::br());
128                 $result = HTML();
129                 $result->pushContent($form);
130                 $result->pushContent($message);
131                 return $result;
132             }
133         }
134         
135         $userfile = $request->getUploadedFile('userfile');
136         if ($userfile) {
137             $userfile_name = $userfile->getName();
138             $userfile_name = trim(basename($userfile_name));
139             $userfile_tmpname = $userfile->getTmpName();
140             $err_header = HTML::h2(fmt("ERROR uploading '%s': ", $userfile_name));
141             if (preg_match("/(\." . join("|\.", $this->disallowed_extensions) . ")\$/",
142                            $userfile_name))
143             {
144                 $message->pushContent($err_header);
145                 $message->pushContent(fmt("Files with extension %s are not allowed.",
146                                           join(", ", $this->disallowed_extensions)),HTML::br(),HTML::br());
147             } 
148             elseif (preg_match("/[^._a-zA-Z0-9-]/", $userfile_name))
149             {
150                 $message->pushContent($err_header);
151                 $message->pushContent(_("File names may only contain alphanumeric characters and dot, underscore or dash."),
152                                       HTML::br(),HTML::br());
153             }
154             elseif (file_exists($file_dir . $userfile_name)) {
155                 $message->pushContent($err_header);
156                 $message->pushContent(fmt("There is already a file with name %s uploaded.",
157                                           $userfile_name),HTML::br(),HTML::br());
158             }
159             elseif ($userfile->getSize() > (MAX_UPLOAD_SIZE)) {
160                 $message->pushContent($err_header);
161                 $message->pushContent(_("Sorry but this file is too big."),HTML::br(),HTML::br());
162             }
163             elseif (move_uploaded_file($userfile_tmpname, $file_dir . $userfile_name) or
164                     (IsWindows() and rename($userfile_tmpname, $file_dir . $userfile_name))
165                     )
166             {
167                 $interwiki = new PageType_interwikimap();
168                 $link = $interwiki->link("Upload:$userfile_name");
169                 $message->pushContent(HTML::h2(_("File successfully uploaded.")));
170                 $message->pushContent(HTML::ul(HTML::li($link)));
171
172                 // the upload was a success and we need to mark this event in the "upload log"
173                 if ($logfile) { 
174                     $upload_log = $file_dir . basename($logfile);
175                     $this->log($userfile, $upload_log, $message);
176                 }
177                 if ($autolink) {
178                     require_once("lib/loadsave.php");
179                     $pagehandle = $dbi->getPage($page);
180                     if ($pagehandle->exists()) {// don't replace default contents
181                         $current = $pagehandle->getCurrentRevision();
182                         $version = $current->getVersion();
183                         $text = $current->getPackedContent();
184                         $newtext = $text . "\n* [Upload:$userfile_name]";
185                         $meta = $current->_data;
186                         $meta['summary'] = sprintf(_("uploaded %s"),$userfile_name);
187                         $pagehandle->save($newtext, $version + 1, $meta);
188                     }
189                 }
190             }
191             else {
192                 $message->pushContent($err_header);
193                 $message->pushContent(HTML::br(),_("Uploading failed."),HTML::br());
194             }
195         }
196         else {
197             $message->pushContent(HTML::br(),HTML::br());
198         }
199
200         //$result = HTML::div( array( 'class' => 'wikiaction' ) );
201         $result = HTML();
202         $result->pushContent($form);
203         $result->pushContent($message);
204         return $result;
205     }
206
207     function log ($userfile, $upload_log, &$message) {
208         global $WikiTheme;
209         $user = $GLOBALS['request']->_user;
210         if (!is_writable($upload_log)) {
211             trigger_error(_("The upload logfile is not writable."), E_USER_WARNING);
212         }
213         elseif (!$log_handle = fopen ($upload_log, "a")) {
214             trigger_error(_("Can't open the upload logfile."), E_USER_WARNING);
215         }
216         else {        // file size in KB; precision of 0.1
217             $file_size = round(($userfile->getSize())/1024, 1);
218             if ($file_size <= 0) {
219                 $file_size = "&lt; 0.1";
220             }
221             $userfile_name = $userfile->getName();
222             fwrite($log_handle,
223                    "\n"
224                    . "<tr><td><a href=\"$userfile_name\">$userfile_name</a></td>"
225                    . "<td align=\"right\">$file_size kB</td>"
226                    . "<td>&nbsp;&nbsp;" . $WikiTheme->formatDate(time()) . "</td>"
227                    . "<td>&nbsp;&nbsp;<em>" . $user->getId() . "</em></td></tr>");
228             fclose($log_handle);
229         }
230         return;
231     }
232
233 }
234
235 // $Log: not supported by cvs2svn $
236 // Revision 1.19  2005/04/11 19:40:15  rurban
237 // Simplify upload. See https://sourceforge.net/forum/message.php?msg_id=3093651
238 // Improve UpLoad warnings.
239 // Move auth check before upload.
240 //
241 // Revision 1.18  2005/02/12 17:24:24  rurban
242 // locale update: missing . : fixed. unified strings
243 // proper linebreaks
244 //
245 // Revision 1.17  2004/11/09 08:15:50  rurban
246 // trim filename
247 //
248 // Revision 1.16  2004/10/21 19:03:37  rurban
249 // Be more stricter with uploads: Filenames may only contain alphanumeric
250 // characters. Patch #1037825
251 //
252 // Revision 1.15  2004/09/22 13:46:26  rurban
253 // centralize upload paths.
254 // major WikiPluginCached feature enhancement:
255 //   support _STATIC pages in uploads/ instead of dynamic getimg.php? subrequests.
256 //   mainly for debugging, cache problems and action=pdf
257 //
258 // Revision 1.14  2004/06/16 10:38:59  rurban
259 // Disallow refernces in calls if the declaration is a reference
260 // ("allow_call_time_pass_reference clean").
261 //   PhpWiki is now allow_call_time_pass_reference = Off clean,
262 //   but several external libraries may not.
263 //   In detail these libs look to be affected (not tested):
264 //   * Pear_DB odbc
265 //   * adodb oracle
266 //
267 // Revision 1.13  2004/06/14 11:31:39  rurban
268 // renamed global $Theme to $WikiTheme (gforge nameclash)
269 // inherit PageList default options from PageList
270 //   default sortby=pagename
271 // use options in PageList_Selectable (limit, sortby, ...)
272 // added action revert, with button at action=diff
273 // added option regex to WikiAdminSearchReplace
274 //
275 // Revision 1.12  2004/06/13 11:34:22  rurban
276 // fixed bug #969532 (space in uploaded filenames)
277 // improved upload error messages
278 //
279 // Revision 1.11  2004/06/11 09:07:30  rurban
280 // support theme-specific LinkIconAttr: front or after or none
281 //
282 // Revision 1.10  2004/04/12 10:19:18  rurban
283 // fixed copyright year
284 //
285 // Revision 1.9  2004/04/12 10:18:22  rurban
286 // removed the hairy regex line
287 //
288 // Revision 1.8  2004/04/12 09:12:22  rurban
289 // fix syntax errors
290 //
291 // Revision 1.7  2004/04/09 17:49:03  rurban
292 // Added PhpWiki RssFeed to Sidebar
293 // sidebar formatting
294 // some browser dependant fixes (old-browser support)
295 //
296 // Revision 1.6  2004/02/27 01:36:51  rurban
297 // autolink enabled
298 //
299 // Revision 1.5  2004/02/27 01:24:43  rurban
300 // use IntwerWiki links for uploaded file.
301 // autolink to page prepared, but not yet ready
302 //
303 // Revision 1.4  2004/02/21 19:12:59  rurban
304 // patch by Sascha Carlin
305 //
306 // Revision 1.3  2004/02/17 12:11:36  rurban
307 // added missing 4th basepage arg at plugin->run() to almost all plugins. This caused no harm so far, because it was silently dropped on normal usage. However on plugin internal ->run invocations it failed. (InterWikiSearch, IncludeSiteMap, ...)
308 //
309 // Revision 1.2  2004/01/26 09:18:00  rurban
310 // * changed stored pref representation as before.
311 //   the array of objects is 1) bigger and 2)
312 //   less portable. If we would import packed pref
313 //   objects and the object definition was changed, PHP would fail.
314 //   This doesn't happen with an simple array of non-default values.
315 // * use $prefs->retrieve and $prefs->store methods, where retrieve
316 //   understands the interim format of array of objects also.
317 // * simplified $prefs->get() and fixed $prefs->set()
318 // * added $user->_userid and class '_WikiUser' portability functions
319 // * fixed $user object ->_level upgrading, mostly using sessions.
320 //   this fixes yesterdays problems with loosing authorization level.
321 // * fixed WikiUserNew::checkPass to return the _level
322 // * fixed WikiUserNew::isSignedIn
323 // * added explodePageList to class PageList, support sortby arg
324 // * fixed UserPreferences for WikiUserNew
325 // * fixed WikiPlugin for empty defaults array
326 // * UnfoldSubpages: added pagename arg, renamed pages arg,
327 //   removed sort arg, support sortby arg
328 //
329 // Revision 1.1  2003/11/04 18:41:41  carstenklapp
330 // New plugin which was submitted to the mailing list some time
331 // ago. (This is the best UpLoad function I have seen for PhpWiki so
332 // far. Cleaned up text formatting and typos from the version on the
333 // mailing list. Still needs a few adjustments.)
334
335 // (c-file-style: "gnu")
336 // Local Variables:
337 // mode: php
338 // tab-width: 8
339 // c-basic-offset: 4
340 // c-hanging-comment-ender-p: nil
341 // indent-tabs-mode: nil
342 // End:
343 ?>